作用
主从复制的问题
普通的主从模式会有三个方面的问题:
- 当master出现故障的时候,需要手动将一个slave提升为master节点,同时修改应用方配置的主节点地址。通知其他slave去新的master同步数据。
- master的写入存在一定的瓶颈
- 存储能力也受限于单节点
redis通过sentinel去解决第一个高可用的问题,通过redis cluster的方式去解决剩下的两个问题
sentinel的高可用
sentinel是一个分布式的架构,包含了若干个sentinel节点和一堆数据节点,sentinel的作用就像他的名字一样,主要用于进行监控,可以监控数据节点和其他的sentinel节点。如果是数据节点中的master出现故障,那么还会自动通其他sentinel节点做协商,进行故障转移
当发现主节点故障时候sentinel会做如下操作:
- 1.master故障
- 2.sentinel发现主节点故障,多个sentinel节点达成一致,任务master的确出故障
- 3.选举一个sentinel节点负责做failover
- 4.被选举的sentinel复制进行故障转移,提升slave,通知客户端、其他节点指向新master
如上所述,sentinel主要提供如下功能:
- 监控
- 通知
- 故障转移
部署
配置修改
在sentinel 节点中配置如下参数:
sentinel monitor <master_name> <masert_ip> <master_port> <quo>
sentinel down-after-milliseconds <master_name> 30000
sentinel parallel-syncs <maser_name> 1
sentinel failover-timeout <master_name> 180000
在本质上,sentinel节点和普通数据节点没有区别只不过加了一些sentinel特有的参数,一般情况下建议不同的sentinel节点部署在不同的主机上面 redis-sentinel xxx.conf
配置说明
sentinel monitor <master_name> <masert_ip> <master_port> <quo>
quo表示要判断master不可达需要的票数,注意在配置的时候不需要去配置slave的信息,因为sentinel节点连接上master之后会自动通过client list获取到slave的信息,并且会自动添加到配置文件中。如果想监控多个主节点,通过master_name做区分。
sentinel down-after-milliseconds <name> <time>
定义超时时间,超过这个时间没有回复就认为目标节点死了,配置过大会造成切换延迟大,过小可能会造成误判的问题
sentinel parallel-syncs <maser_name> 1;
在发生故障转移后,其他的slave会连接到新的master上面发起复制的操作,通过这个参数的配置可以定义同一时间想主节点发起复制的个数,如果配置过高,会导致同时又多个节点发起全量同步,影响系统的运行和稳定。
sentinel failover-timeout <master_name> 180000
配置failover的超时时间
sentinel client-reconfig-script <name> <path>
用于定义发生切换后的脚本,在发生切换后,会触发对于路径的脚本,并且向他发送故障转移的相关参数。
部署技巧
- sentinel节点需要部署在不同物理机器上面
- 部署至少3个sentinel节点并且是奇数个 -如果sentinel是监控同一业务的不同redis集群,建议使用一套sentinel就好,如果是不同业务的,就需要配置多套sentinel节点
原理
三个定时任务
-
1.每隔10s 每个sentinel会向主节点和从节点发生client info获取最新的拓扑状态 ,之所以要向slave发送,主要是在节点不可达或者故障转移之后也能获取最新的状态
-
2.每隔2s 每个sentinel节点都会向特定的频道,发送该sentinel节点对主节点的频道和他探测到的拓扑信息。
-
3.每隔1s 心跳信息
两个下线状态
- 主观下线
- 客观下线
主观下线,每隔1s做ping检查,超过down-after-milliseconds没收到回复,该sentinel节点就会定义它为主观下线
客观下线,某个节点收到超过quorum个的sentinel认为master已经下线的主观下线通知后就会做客观下线的决定。
故障转移
1、sentinel节点选举leader负责本次failover,一般谁先完成客观下线谁就是leader 2、在slave列表中获取slave的信息,过滤掉不健康的节点,比如主观下线、断线、5秒不恢复sentinel ping的那些节点。然后从健康的节点中获取slave-priority最高的节点,如果没有配置优先级就选择复制偏移量最大的节点,如果复制偏移量都一样就选择runid最小的节点。 3、对选中的节点做slaveof no one,提升他为主节点 4、通知其它节点连接到新master 5、监控old master,在其恢复后加入到新复制环境中
参考
《Redis开发与运维》