Redis哨兵模式
哨兵模式
在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移问题,弥补了主从复制中需要手动让从机成为主机的缺点,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主机。
哨兵的作用
哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、自动故障转移和通知。
监控
- 周期性地利用ping命令检查 master 和 slave 是否正常运行,判断主从库是否下线。
哨兵对主库的下线判断有“主观下线”和“客观下线”两种:
主观下线(防止误判):
哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
客观下线:
通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”。
自动故障转移
- 主库挂了以后,断开 master 与 slave 连接,从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。
通知(提醒)
- 哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。
- 哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。
开启哨兵模式
创建哨兵配置文件
sentinel-端口号.conf
进行配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 哨兵服务端口
port 26379
# 哨兵工作信息存储目录
dir /tmp
# 监控 主 连接字符串 哨兵判挂标准(几个哨兵认定他挂了,就判定为主挂了,通常为哨兵数量的一半加一)
sentinel monitor mymaster 127.0.0.1 6379 2
# 主 连接多长时间无响应,就认定它挂了(默认 30s)
sentinel down-after-milliseconds mymaster 30000
# 主挂了之后,新的主上任同步数据的路线数量,数值越小,对服务器压力越小
sentinel parallel-syncs mymaster 1
# 新主同步数据时,多长时间同步完算有效 (默认 180s)
sentinel failover-timeout mymaster 180000启动哨兵:
redis-sentinel 哨兵配置文件
如果需要配置哨兵集群,只需要多启动几个哨兵即可。
通信机制:哨兵实例之间可以相互发现,归功于Redis的提供的 pub/sub 机制。
哨兵只要和主库建立起了连接(主库上有一个名为
__sentinel__:hello
的频道),就可以在主库上发布消息了;同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。哨兵又通过 INFO 命令发给主库,获得了从库连接信息,也能和从库建立连接,并进行监控了。
故障修护过程
主观下线:
当主服务器发生故障时,此时一个sentinel发现了故障,系统并不会马上进行故障转移过程(这个现象称为主观下线),它会向网络中的其他Sentinel进行确认。
客观下线:
接着其他Sentinel也陆续发现故障,这个时候其中一个Sentinel就会发起投票。一定数量的哨兵(在配置文件中指定)确认Master被标记为主观下线,此时将Master标记为客观下线。
sentinel的leader选举:
要想完成故障切换(将故障master剔除,并将一个slave提升为master)就必须先选举一个leader。
最先发现故障的sentinel向其他哨兵发起请求成为leader,其他哨兵在没有同意别的哨兵的leader请求时,就会把票投给该sentinel。当半数以上并且大于配置的quorum的sentinel投票通过后就认定该sentinel为leader。接下来的故障切换有该leader完成。
需要注意的是,如果哨兵集群只有 2 个实例,此时,一个哨兵要想成为 Leader,必须获得 2 票,而不是 1 票。所以,如果有个哨兵挂掉了,那么,此时的集群是无法进行主从库切换的。因此,通常我们至少会配置 3 个哨兵实例。
master选举:
leader选好后将故障master剔除,从slave中挑选一个成为master。
我把哨兵选择新主库的过程称为“筛选 + 打分”;先按照一定规则在从库中筛选,再按照一定规则进行打分,分数最高则选为新主库。
筛选规则:
- 是否正常运行。
- 判断它之前的网络连接状态。
打分规则:
- 优先级最高的从库得分高。
- 和旧主库同步程度最接近的从库得分高。
- ID 号小的从库得分高。
新Master再通过发布订阅模式通知所有sentinel更新监控主机信息。sentinel再通知其他从库和客户端。
故障的主服务器修复后将成为从服务器继续工作。