1. Redis哨兵简介
Redis(Remote Dictionary Server)是一种开源的基于键值对的 NoSQL 数据库,其由Salvatore Sanfilippo 开创。每个键都是独一无二的,其可以存储多达232字节的字符串或二进制数据。Redis的内存特性和易于使用的APIs已经使其变得非常流行。
但是,Redis本身不支持高可用性(High Availability,HA),当主节点发生故障时,Redis将无法自动切换到从节点,并继续提供服务。因此,Redis的开发人员推出了一个名为“Sentinel”的工具,该工具可以监控多个Redis节点,并在主节点出现故障时自动完成故障转移。
2. Redis哨兵架构
Redis Sentinel架构包含多个Redis节点,其中每个节点都可以用作主节点,从节点或哨兵节点。主节点和从节点是Redis节点的两种常见类型。哨兵节点是一种特殊类型的节点,用于监视Redis节点的工作情况并执行故障转移。
2.1 主从复制
Redis主从复制是一种异步复制机制,其中数据从主节点复制到一个或多个从节点。主节点将执行所有写操作,并向所有连接的从节点发送写操作。从节点只能被用于读取,因为写入只能由主节点执行。此外,Redis数据同步过程是基于复制的,从一台Redis节点向另一台节点复制数据。
下面是一个 Redis 主从复制的示例,其中主节点(192.168.5.2:6379)有两个从节点。
port 6379
host 192.168.5.2
replicaof 192.168.5.1 6379
port 6380
host 192.168.5.3
replicaof 192.168.5.1 6379
port 6381
host 192.168.5.4
replicaof 192.168.5.1 6379
2.2 Redis哨兵
Redis哨兵是一个特殊的Redis节点类型,可以用于监视多个Redis节点,并在主节点出现故障时协调故障转移。在具有哨兵的Redis群集中,哨兵节点通过将其角色设置为监视程序来运行。
在默认情况下,哨兵会每间隔10秒到60秒之间的随机时间间隔检查Master节点是否正常,并且如果Master节点异常,则触发故障转移程序。
3. Redis哨兵故障转移
Redis哨兵故障转移的核心思想是在主节点发生故障时,将某个从节点升级为新的主节点,并将其他从节点切换到新的主节点。哨兵维护多个Redis节点的状态信息,并在主节点发生故障时自动完成故障转移。
因此,哨兵必须检测和监视状态信息,包括:
Master节点是否在线?
Slave节点是否正常工作?
节点是否是可用的?
节点可用性的优先级如何?
当主节点发生故障时,哨兵触发故障转移,并按以下步骤处理:
1. 向其他哨兵请求是否认为当前主节点已经下线。
2. 如果大多数哨兵回复主节点已下线,则执行故障转移,否则这个哨兵继续等待。
3. 哨兵选举新主节点。如:根据优先级选择等计算方法选主,并降低所有Salve节点与主节点之间的复制延迟,待数据同步完成。
4. 当主节点不再宕机,并且剩余的从节点成功同步新的主节点时,Redis哨兵可通过以下步骤恢复:对于每个从节点,哨兵向其发送 SLAVEOF NO ONE 命令,将其转换为主节点,并将其余的从节点切换到新主节点。
4. 总结
Redis哨兵是Redis群集中的重要组件,用于自动检测主节点的故障并协作进行故障转移。哨兵通过在多个Redis节点之间进行状态信息交换来实现监视和检测,以保持高可用性和可拓展性。并且在发生故障是,哨兵将让一个或多个从节点成为新的主节点,并将其他从节点连接到该新主节点。