redis集群与哨兵选举原理
Redis集群
- redis Cluster将所有数据分为16384个槽位,每个节点负责一部分,当客户端要查找某个key时,根据本地槽位分配信息进行定位
槽位定位算法
Cluster会对key进行crc16算法得到一个整数值,再对这个整数值进行16384取模得到具体槽位
跳转重定向
当客户端向一个错误的节点发出来指令,该节点会发现key所在槽位并不归自己管理,会向客户端发送一个特殊的跳转指令携带目标操作节点地址,客户端收到指令后会跳转到正确的节点上操作
网络抖动
正式的生产环境中,网络会经常出现问题,Redis Cluster提供了一个cluster-node-timeout,当某个节点持续timeout时间失联才会认定该节点挂了,进行主从切换,如果不配置该选项网络抖动会导致频繁的主从切换
Redis集群选举原理
- 当slave发现自己的master挂了
- 将自己记录的currentEpoch加1,并向其他节点请求投票给自己成为master
- 其他节点收到请求,只有master会回应,判断请求的合法性,并投票,可能会有多个slave请求,每个master只能投一票
- slave收集master的投票
- 当slave收到的投票超过半数后就可以成为master
- 广播消息通知其他节点
- 当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,即使节点挂了集群仍然能提供服务
集群为什么至少三个节点而且推荐节点数为奇数
- 因为选举需要收到大于master节点总数的一半,若只有两个master节点,其中一个挂了,是选举不出来新的master的
- 奇数个master节点是为了满足上述要求并且节省资源,三个master节点与四个master节点,当大家都挂了一个master的时候,都能进行选举,当挂了两个的是否都选举不了
哨兵leader选举流程
- sentinel会以每秒一次的频率向主从和其他sentienl发送ping命令,当超过设置的down-after-milliseconds后未收到的有效的响应会认为该master主观下线,接着向其他sentiel进行确认,接收到足够数量的后,sentinel会判定该服务器客观下线
- 该sentinel会想其他sentinel发送请求其他sentinel视自己为leader,每个sentinel每次选举会自增配置纪元,每个sentinel只能选择一次,当收到半数以上的票,sentinel会进行slave的选举
- slave的选举.进行不健康的slave排除(主观下线的,大于5秒未回应的,与master节点失联的),对健康节点进行排序(设置的优先级,若相同进行下一步,选择偏移量大的从节点)
- 选举出的slave会执行slaveof no one成为主节点,向其他slave发送命令其成为新的master的slave,监视旧的master恢复后成为新的master的slave并进行同步