Redis教程(八)使用sentinel哨兵实现Redis高可用
一、Redis Sentinel 哨兵介绍
在Redis主从架构中,如果主节点故障,此时的从节点配置是只读状态,所以后续的写操作都无法正常进行。为了解决该问题,Redis提供了一种Sentinel(哨兵)机制来监控Redis所有节点的工作状态,哨兵主要负责监控、选主和通知的工作。客户端只需要连接到Sentinel的地址就可以得知当前环境中的各个节点角色,如果主节点发生了故障,哨兵可以自动完成故障转移
二、Redis 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 地址和端口形成集群。
哨兵工作重要频道信息如下:
三、Redis Sentinel 配置
1、在Redis所安装的目录下会有一个sentinel.conf配置文件,建议配置基数个sentinel防止脑裂
bind 172.20.1.229 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进行同时同步,建议为1,可以减轻主节点压力 sentinel failover-timeout mymaster 180000 #故障转移超时时间,超出这个时间范围代表切换失败,默认是3分钟 sentinel auth-pass mymaster redispassword #如果Redis有设置密码验证需要在sentinel中也进行配置 #哨兵启动后会自动重写配置文件增加sentinel相关配置 # Generated by CONFIG REWRITE sentinel leader-epoch mymaster 0 sentinel known-replica mymaster 172.20.1.231 6379 #当前集群的从节点信息,每个节点看到的应该是一样的,由于配置了229为主,所以这里看不到229 sentinel known-replica mymaster 172.20.1.230 6379 #当前集群的从节点信息,每个节点看到的应该是一样的,由于配置了229为主,所以这里看不到229 sentinel known-sentinel mymaster 172.20.1.230 26379 a1b5fe0fc811f087ea33e732bfe4ccd7d0c7980a #当前集群感知到的哨兵节点信息 sentinel known-sentinel mymaster 172.20.1.231 26379 23b57a8f76666f0e434b151577ea127d29554966 #当前集群感知到的哨兵节点信息 sentinel current-epoch 0 #当前集群选举切换的次数
2、配置文件修改好以后使用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 172.20.1.229 info #哨兵端口默认为26379
四、Redis Sentinel 运维
1、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 #在线修改哨兵参数 127.0.0.1:26379> sentinel set mymaster quorum 1 127.0.0.1:26379> sentinel set mymaster failover-timeout 18000 127.0.0.1:26379> sentinel set mymaster down-after-milliseconds 30000 #重置sentinel,将清除之前所存储的状态信息和从节点信息,并进行一次重新发现,通常在节点发生调整后需要reset一下 127.0.0.1:26379> sentinel reset mymaster
2、redis sentinel failover验证
· 手动将主节点进行kill操作或者登录客户端执行shutdown
· 当主节点redis服务的超时时间达到sentinel down-after-milliseconds所设置的时间后,登录任意一台sentinel执行info命令查看信息,观察address的值是否自动切换
· 将下线节点重新上线后它会通过哨兵自动成为从节点。需要注意Sentinel不会去删除之前集群中存在过的节点信息,即使它已经与组织失去联系。如果有节点确实需要分离下线,需要执行reset命令重置哨兵状态,如果有多个节点需要退出集群,该命令每次间隔控制在30秒以上
172.16.101.54:26379> sentinel master mymaster 33) "num-other-sentinels" 34) "2"
· 哨兵切换日志分析
评论