Redis哨兵知识整理

365 阅读4分钟

作用

主从复制的问题

普通的主从模式会有三个方面的问题:

  • 当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开发与运维》