Redis哨兵工作原理 | 黑马Redis高级篇

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

哨兵的作用

Redis提供了哨兵机制来实现主从集群的自动故障恢复

监控sentinel会不断检查master和slave是否按照预期工作

自动故障恢复如果master故障sentinel会将一个slave变为master当故障实例恢复后也以新的master为主

通知sentinel充当redis客户端的服务发现来源当集群发生故障转移时会将最新信息推送给redis客户端

服务状态监控

sentinel基于心跳机制监测服务状态每隔1秒向集群的每个实例发送ping命令

  • 主观下线如果sentinel节点发现某实例未在规定时间响应则认为改实例主观下线
  • 客观下线若超过指定数量quorum的sentinel都认为该实例主管下线则该实例客观下线。quorum值最好超过sentinel实例数量的一半

之所以针对「主节点」设计「主观下线」和「客观下线」两个状态是因为有可能「主节点」其实并没有故障可能只是因为主节点的系统压力比较大或者网络发送了拥塞导致主节点没有在规定时间内响应哨兵的 PING 命令。

所以为了减少误判的情况哨兵在部署的时候不会只部署一个节点而是用多个节点部署成哨兵集群最少需要三台机器来部署哨兵集群通过多个哨兵节点一起判断就可以就可以避免单个哨兵因为自身网络状况不好而误判主节点下线的情况

当这个哨兵的赞同票数达到哨兵配置文件中的 quorum 配置项设定的值后这时主节点就会被该哨兵标记为「客观下线」。

例如现在有 3 个哨兵quorum 配置的是 2那么一个哨兵需要 2 张赞成票就可以标记主节点为“客观下线”了。这 2 张赞成票包括哨兵自己的一张赞成票和另外两个哨兵的赞成票。

PSquorum 的值一般设置为哨兵个数的二分之一加1例如 3 个哨兵就设置 2。

哨兵判断完主节点客观下线后哨兵就要开始在多个「从节点」中选出一个从节点来做新主节点

选举新的master

一旦发现master故障sentinel需要在salve中选择一个作为新的master选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短如果超过指定值(down-after-milliseconds* 10) 则会排除该slave节点
  • 然后判断slave节点的slave-priority值越小优先级越高如果是0则永不参与选举
  • 如果slave-prority一样则判断slave节点的offset值越大说明数据越新优先级越高
  • 最后是判断slave节点的运行id大小越小优先级越高。

Redis 有个叫 down-after-milliseconds * 10 配置项其down-after-milliseconds 是主从节点断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内主从节点都没有通过网络联系上我们就可以认为主从节点断连了。如果发生断连的次数超过了 10 次就说明这个从节点的网络状况不好不适合作为新主节点。

至此我们就把网络状态不好的从节点过滤掉了接下来要对所有从节点进行三轮考察优先级、复制进度、ID 号。在进行每一轮考察的时候哪个从节点优先胜出就选择其作为新主节点。

  • 第一轮考察哨兵首先会根据从节点的优先级来进行排序优先级越小排名越靠前
  • 第二轮考察如果优先级相同则查看复制的下标哪个从「主节点」接收的复制数据多哪个就靠前。
  • 第三轮考察如果优先级和下标都相同就选择从节点 ID 较小的那个。

第一轮考察优先级最高的从节点胜出

Redis 有个叫 slave-priority 配置项可以给从节点设置优先级。

每一台从节点的服务器配置不一定是相同的我们可以根据服务器性能配置来设置从节点的优先级。

比如如果 「 A 从节点」的物理内存是所有从节点中最大的 那么我们可以把「 A 从节点」的优先级设置成最高。这样当哨兵进行第一轮考虑的时候优先级最高的 A 从节点就会优先胜出于是就会成为新主节点。

第二轮考察复制进度最靠前的从节点胜出

如果在第一轮考察中发现优先级最高的从节点有两个那么就会进行第二轮考察比较两个从节点哪个复制进度。

什么是复制进度主从架构中主节点会将写操作同步给从节点在这个过程中主节点会用 master_repl_offset 记录当前的最新写操作在 repl_backlog_buffer 中的位置如下图中的「主服务器已经写入的数据」的位置而从节点会用 slave_repl_offset 这个值记录当前的复制进度如下图中的「从服务器要读的位置」的位置。

如果某个从节点的 slave_repl_offset 最接近 master_repl_offset说明它的复制进度是最靠前的于是就可以将它选为新主节点。

第三轮考察ID 号小的从节点胜出

如果在第二轮考察中发现有两个从节点优先级和复制进度都是一样的那么就会进行第三轮考察比较两个从节点的 ID 号ID 号小的从节点胜出。

什么是 ID 号每个从节点都有一个编号这个编号就是 ID 号是用来唯一标识从节点的。

当选中了其中一个slave为新的master后 (例如slave1)故障的转移的步骤如下

  • sentinel给备选的slave1节点发送slaveof no one命令让该节点成为master
  • sentinel给所有其它slave发送slaveof192.168.150.101  7002命令让这些slave成为新master的从节点开始从新的master上同步数据。
  • 最后sentinel将故障节点标记为slave当故障节点恢复后会自动成为新的master的slave节点

所以切换主节点的全过程是 

1、第一轮投票判断主节点下线

当哨兵集群中的某个哨兵判定主节点下线主观下线后就会向其他哨兵发起命令其他哨兵收到这个命令后就会根据自身和主节点的网络状况做出赞成投票或者拒绝投票的响应。

当这个哨兵的赞同票数达到哨兵配置文件中的 quorum 配置项设定的值后这时主节点就会被该哨兵标记为「客观下线」。

2、第二轮投票选出哨兵leader

某个哨兵判定主节点客观下线后该哨兵就会发起投票告诉其他哨兵它想成为 leader想成为 leader 的哨兵节点要满足两个条件

  • 第一拿到半数以上的赞成票
  • 第二拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

3、由哨兵 leader 进行主从故障转移

选举出了哨兵 leader 后就可以进行主从故障转移的过程了。该操作包含以下四个步骤

  • 第一步在已下线主节点旧主节点属下的所有「从节点」里面挑选出一个从节点并将其转换为主节点选择的规则
    • 过滤掉已经离线的从节点
    • 过滤掉历史网络连接状态不好的从节点
    • 将剩下的从节点进行三轮考察优先级、复制进度、ID 号。在每一轮考察过程中如果找到了一个胜出的从节点就将其作为新主节点。
  • 第二步让已下线主节点属下的所有「从节点」修改复制目标修改为复制「新主节点」
  • 第三步将新主节点的 IP 地址和信息通过「发布者/订阅者机制」通知给客户端
  • 第四步继续监视旧主节点当这个旧主节点重新上线时将它设置为新主节点的从节点

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis

“Redis哨兵工作原理 | 黑马Redis高级篇” 的相关文章