redis哨兵模式高可用机制分析及主从切换

313 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

redis哨兵模式一般配置一主一从两个redis server实例和三个哨兵实例。

主从同步

主从复制包括数据同步(全量复制,部分复制)和命令传播,主从节点均通过复制超时参数检查同步是否超时,如果超时,则会断开重连。

主从切换

redis支持redis-cli客户端命令 slaveof 手动或哨兵自动进行主从切换。

数据持久化与恢复

Redis提供了两种持久化的选择:

RDB支持以特定的实践间隔为数据集生成时间点快照,每次都是全量的快照,rdb文件经过压缩,利于传输备份,主从数据同步采用此数据。

AOF把Redis Server收到的每条写指令持久化到日志中,待Redis重启时通过重放命令恢复数据。 日志格式为RESP协议,对日志文件只做append操作,无损坏风险。 并且当AOF文件过大时可以自动重写压缩文件。该数据一般设置每秒一次刷入磁盘,相对rdb安全。

redis启动时如果检测到RDB文件,会自动载入这个文件,如果服务器开启了AOF持久化,那么服务器会优先使用AOF文件来还原数据库状态。

哨兵机制

单个哨兵配置中只设置了监控的 master IP 和 port,哨兵通过master上的__sentinel__:hello 的专用通道发布订阅消息,获得其他哨兵信息并与之建立联系;通过向 master 发送 INFO 命令获得salve信息并与之建立连接然后监控。

单个哨兵监测 server 实例下线,先标记为主观下线,如果是 server 实例是 master,则向其他哨兵发送 is-master-down-by-addr 命令,其他哨兵根据自己的判断相应Y or N,赞成达到配置的 quorum 的值,则将master标记为客观下线。

获得多数票的哨兵申明自己要执行主从切换,向其他哨兵发起leader选取投票,赞成票同时满足1. 其他哨兵过半 2. 达到配置的 quorum 时,成功当选leader执行主从切换。

原主库虽然下线了,但被哨兵记录为从库("sentinel known-slave"),并标记为主观下线,重启后哨兵向其发送 replicaof 命令配置为新主库的从库,退出主观下线状态(-sdown slave)。

哨兵向其他从库发送 replicaof 命令重新配置主从。

客户端向哨兵订阅消息,获得 master ip 和端口等消息。

手动切换主从

哨兵集群正常工作的情况下:

  • 检查待切换主库正常运行,直接停止现主库

  • 哨兵集群非正常工作的情况下:

  1. 登录原主库执行 slaveof (host 和 port 为原从库实例)
  2. 登录原从库执行 slaveof no one