• 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 版权协议,转载请附上原文出处链接和本声明。
  • 相关阅读:
    关于Altium Designer的BOM,元件清单
    关于Altium Designer中的搜索图纸上的元件
    头文件的问题
    关于stm32加不进.h文件的问题
    【数论】——欧拉定理
    python matplotlib 多图像排列显示
    直方图均衡原理
    辐射度,辐照度,相机响应函数
    A = min(1, max(0, A))
    gamma校正
  • 原文地址:https://www.cnblogs.com/JaminYe/p/13407213.html
Copyright © 2020-2023  润新知