redis集群与哨兵选举原理

redis集群与哨兵选举原理

Redis集群
  1. redis Cluster将所有数据分为16384个槽位,每个节点负责一部分,当客户端要查找某个key时,根据本地槽位分配信息进行定位
槽位定位算法

Cluster会对key进行crc16算法得到一个整数值,再对这个整数值进行16384取模得到具体槽位

跳转重定向

当客户端向一个错误的节点发出来指令,该节点会发现key所在槽位并不归自己管理,会向客户端发送一个特殊的跳转指令携带目标操作节点地址,客户端收到指令后会跳转到正确的节点上操作

网络抖动

正式的生产环境中,网络会经常出现问题,Redis Cluster提供了一个cluster-node-timeout,当某个节点持续timeout时间失联才会认定该节点挂了,进行主从切换,如果不配置该选项网络抖动会导致频繁的主从切换

Redis集群选举原理
  1. 当slave发现自己的master挂了
  2. 将自己记录的currentEpoch加1,并向其他节点请求投票给自己成为master
  3. 其他节点收到请求,只有master会回应,判断请求的合法性,并投票,可能会有多个slave请求,每个master只能投一票
  4. slave收集master的投票
  5. 当slave收到的投票超过半数后就可以成为master
  6. 广播消息通知其他节点
    • 当slave发现自己的master挂了并不会立即进行请求投票,会有一定的延时,确保其他的master也意识到当前的master挂了,否则master可能会拒绝投票
    • 延时计算公式Delay=500ms+random(0-500)ms+Slave_rank* 100ms(slave_rank为复制数据的等级,等级越小表示复制数据越多也是为了保证能让拥有最新数据的slave最先发起选举)
集群是否完整才能对外提供服务

当一个集群节点全都挂了的时候,整个redis是否还能使用,在redis.conf中配置cluster-required-full-converage为no,即使节点挂了集群仍然能提供服务

集群为什么至少三个节点而且推荐节点数为奇数
  1. 因为选举需要收到大于master节点总数的一半,若只有两个master节点,其中一个挂了,是选举不出来新的master的
  2. 奇数个master节点是为了满足上述要求并且节省资源,三个master节点与四个master节点,当大家都挂了一个master的时候,都能进行选举,当挂了两个的是否都选举不了
哨兵leader选举流程
  1. sentinel会以每秒一次的频率向主从和其他sentienl发送ping命令,当超过设置的down-after-milliseconds后未收到的有效的响应会认为该master主观下线,接着向其他sentiel进行确认,接收到足够数量的后,sentinel会判定该服务器客观下线
  2. 该sentinel会想其他sentinel发送请求其他sentinel视自己为leader,每个sentinel每次选举会自增配置纪元,每个sentinel只能选择一次,当收到半数以上的票,sentinel会进行slave的选举
  3. slave的选举.进行不健康的slave排除(主观下线的,大于5秒未回应的,与master节点失联的),对健康节点进行排序(设置的优先级,若相同进行下一步,选择偏移量大的从节点)
  4. 选举出的slave会执行slaveof no one成为主节点,向其他slave发送命令其成为新的master的slave,监视旧的master恢复后成为新的master的slave并进行同步
作者: JaminYe
版权声明:本文原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文地址:https://www.cnblogs.com/JaminYe/p/13407213.html