这种经典的案例就是Redis,各个 Redis 之间保持通信,当主服务器宕机之后从服务器就会升为主服务器。对于客户端来说几乎是透明的。
Redis 高可用有三种模式:主从模式、哨兵模式、集群模式。
1) 主从模式
一般,系统的高可用都是通过部署多台机器来实现。Redis 为了避免单点故障,也需要部署多台机器。因为部署了多台机器,所以就会涉及不同机器的数据同步问题。为此,Redis 提供了复制(replication)功能,当一台 Redis 数据库中的数据发生了变化,该变化会被自动的同步到其他的 Redis 机器上去。
Redis 多机器部署时,这些机器节点会被分成两类:一类是主节点(Master 节点);另一类是从节点(Slave 节点)。一般主节点可以进行读、写操作, 而从节点只能进行读操作。同时由于主节点可以写,数据会发生变化,当主节点的数据发生变化时,会将变化的数据同步给从节点,这样从节点的数据就可以和主节点的数据保持一致了。一个主节点可以有多个从节点,但是一个从节点只会有一个主节点,也就是所谓的一主多从结构。
2) 哨兵模式
在主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这时需要人工干预,费时费力,还会造成一段时间内服务不可用,因此并不推荐该方式,实际生产中,优先考虑哨兵模式。这种模式下,Master 宕机, 哨兵会自动选举 Master 并将其他的 Slave 指向新的 Master。
在主从模式下,Redis 同时提供了哨兵命令 redis-sentinel,哨兵是一个独立的进程。其原理是哨兵进程向所有的 Redis 机器发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。
哨兵可以有多个,一般为了便于决策选举,使用奇数个哨兵。哨兵可以和Redis 机器部署在一起,也可以部署在其他的机器上。多个哨兵构成一个哨兵集群,哨兵也会直接相互通信,以检查哨兵是否运行正常,同时发现 Master 宕机哨兵之间会进行决策选举新的 Master。
哨兵模式的作用为,通过发送命令,让 Redis 服务器返回监控其运行的状态,包括主服务器和从服务器。当哨兵监测到 Master 宕机,会自动将 Slave 切换到 Master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。然而一个哨兵进程对Redis 服务器进行监控,也可能会出现问题, 为此,可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。哨兵很像 Kafka 集群中的 Zookeeper 的功能。
3) 集群模式
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存空间,所以在 Redis 3.0 版本加入了 Cluster 集群模式,实现了 Redis 的分布式存储,对数据进行分片,也就是在每台 Redis 节点上存储不同的内容。
优势在于采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。可扩展性强,可线性扩展到 1000 多个节点, 可动态添加或删除节点。高可用性上,部分节点不可用时,集群仍可用。通 过增加 Slave 做 Standby 数据副本,能够实现故障自动 failover,节点之间通过gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升。降低运维成本,提高系统的扩展性和可用性。




