Redis教程(八)使用sentinel哨兵实现Redis高可用

Tanglu NoSQL 2019-10-15 16387 0

一、Redis Sentinel 哨兵介绍

在Redis主从架构中,如果主节点故障,此时的从节点配置是只读状态,所以后续的写操作都无法正常进行。为了解决该问题,Redis提供了一种Sentinel(哨兵)机制来监控Redis所有节点的工作状态,哨兵主要负责监控、选主和通知的工作。客户端只需要连接到Sentinel的地址就可以得知当前环境中的各个节点角色,如果主节点发生了故障,哨兵可以自动完成故障转移

sentinel.png


二、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 地址和端口形成集群。

哨兵工作重要频道信息如下:

sentinel2.png


三、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.png


· 将下线节点重新上线后它会通过哨兵自动成为从节点。需要注意Sentinel不会去删除之前集群中存在过的节点信息,即使它已经与组织失去联系。如果有节点确实需要分离下线,需要执行reset命令重置哨兵状态,如果有多个节点需要退出集群,该命令每次间隔控制在30秒以上

172.16.101.54:26379> sentinel master mymaster
33) "num-other-sentinels"
34) "2"


· 哨兵切换日志分析

企业微信截图_20211115111253.png

评论