一、Redis哨兵的作用
在Redis主从架构中,如果主节点发生故障宕机,由于从服务器配置为只读,写操作就无法进行了。用户通过从服务器读取到的数据也就有可能不是精确的。为了解决这种问题,Redis提供了sentinel哨兵机制来监控Redis所有节点的工作状态,哨兵主要负责监控、选主和通知的工作。客户端只需要连接到sentinel的地址就可以得知当前环境中的主节点是哪一台,如果主节点发生了故障,哨兵可以自动完成故障转移,不用人工进行主从切换。
二、Sentinel的工作流程
1、主观下线与客观下线
sentinel每秒都会向主从架构中所有节点发出ping命令,如果某个节点没有响应就会被该哨兵认为是主观下线。而由于Redis集群可能存在网络阻塞等情况,导致哨兵误判。所以通常需要将哨兵也部署成一个集群模式,让多个哨兵一起进行判断,当有N/2+1个哨兵判断节点状态为下线后才真正的进行主从切换,这种情况就是客观下线了。
2、Sentinel选举主库
哨兵选举新的主库时存在优先级问题,哨兵会先淘汰掉网络不好的从库(满足down-after-milliseconds *10的节点不合格)会按照从库优先级(slave-priority 配置项)、从库复制进度(slave_repl_offset)以及从库RunID号进行三轮打分。如果某轮评分中出现了得分最高的从库就会被选举为新主库,如果没有出现就继续进行下一轮评选。
3、主库故障由谁处理
发现故障的哨兵都会给自己投一票选举成Leader,然后给其他节点投否定票,而没有发现故障的哨兵则会对第一个请求投票的节点投赞同票,其他节点投否定票。
4、Sentinel集群的通信
哨兵之间根据Redis的发布订阅机制来互相感知。每个哨兵和主库建立连接后都会在主库的“__sentinel__:hello”频道发布自己的连接信息(IP 和端口),同时也会从主库上订阅这些消息,获得其他哨兵发布的连接信息。当多个哨兵都在主库上做了发布和订阅操作后,就能知道彼此的 IP 地址和端口形成集群。
哨兵工作重要频道信息如下:
三、Sentinel的配置
在Redis所安装的目录下会有一个sentinel.conf配置文件,建议配置基数个sentinel防止脑裂
bind 192.168.145.85
daemonize yes
protected-mode no
port 26379
logfile /usr/local/redis/log/sentinel.log
dir /usr/local/redis/data/
#一组哨兵可以监控多套Redis集群,只需要配置多行sentinel monitor即可
sentinel monitor mymaster 192.168.145.85 6379 1 #配置要监控的主节点名字、IP、端口以及选举票数。哨兵会通过master自动发现其他slave服务器。选举票数建议为节点数/2+1,如果只有一台sentinel就设置为1
sentinel down-after-milliseconds mymaster 30000 #判断master节点是否存活,超过这个时长就将其下线。单位是毫秒,默认是30秒
sentinel parallel-syncs mymaster 1 #哨兵发生切换后允许多少台slave服务器对新master进行同时同步,该项用于减轻压力
sentinel failover-timeout mymaster 180000 #主节点出现故障时,故障转移超时时间,超出这个时间范围代表切换失败,默认是3分钟
sentinel auth-pass mymaster redispassword #如果Redis做了密码验证,那么还需要在sentinel做如下配置
# Generated by CONFIG REWRITE #服务启动后redis会自动重写配置文件增加部分配置
sentinel known-slave mymaster 192.168.145.85 6379
sentinel known-sentinel mymaster 192.168.145.69 26379 be5863ca822028416afdc2edf4f391df0a0302c1
sentinel current-epoch 1
四、sentinel的维护管理
1、启动sentinel
配置文件修改好以后使用redis-sentinel脚本即可启动sentinel,也可以使用redis-server --sentinel的形式来启动
redis-sentinel /path/to/file.conf #启动方法1,推荐
redis-server /path/to/file.conf --sentinel #启动方法2
redis-cli -p 26379 -h 192.168.1.100 info #哨兵端口默认为26379
2、sentinel的日常维护命令(所有对配置文件的修改都会自动被刷新到配置文件sentinel.conf 中)
#列出所有正在监控的主节点
127.0.0.1:26379 > sentinel masters
#查看指定master的信息
127.0.0.1:26379 > sentinel master <master-name>
#查看某个主节点的IP和端口
127.0.0.1:26379> sentinel get-master-addr-by-name <master-name>
#查询指定集群的从节点信息
127.0.0.1:26379> sentinel slaves <master name>
#检查可用 Sentinel 的数量
127.0.0.1:26379> sentinel ckquorum <master-name>
#强制故障转移
127.0.0.1:26379> sentinel failover <master-name>
#增加监视主节点
127.0.0.1:26379> sentinel monitor mymaster 127.0.0.1 6379 2
#移除主节点的监视
127.0.0.1:26379> sentinel remove mymaster
# 修改 quorum 参数
127.0.0.1:26379> sentinel set mymaster quorum 1
#重置
127.0.0.1:26379> sentinel reset
3、验证redis sentinel的切换
· 手动将主节点的redis服务kill掉,或者登录客户端执行shutdown
· 当主节点redis服务的超时时间达到sentinel down-after-milliseconds所设置的时间后,登录任意一台sentinel执行info命令查看信息,观察address的值是否自动切换
· 将之前下线的主节点重新上线后,可以看到它成为了一个新的从节点,并且会自动向现在的主库同步数据,它不会自动恢复成主节点。