辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?( 八 )


每次 ping , 会带上自己节点的信息 , 还有就是带上 1/10 其它节点的信息 , 发送出去 , 进行交换 。 至少包含 3 个其它节点的信息 , 最多包含 总节点数减 2 个其它节点的信息 。
分布式寻址算法

  • hash 算法(大量缓存重建)
  • 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)
  • redis cluster 的 hash slot 算法
hash 算法
来了一个 key , 首先计算 hash 值 , 然后对节点数取模 。 然后打在不同的 master 节点上 。 一旦某一个master 节点宕机 , 所有请求过来 , 都会基于最新的剩余 master 节点数去取模 , 尝试去取数据 。 这会导致大部分的请求过来 , 全部无法拿到有效的缓存 , 导致大量的流量涌入数据库 。
辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?一致性 hash 算法
一致性 hash 算法将整个 hash 值空间组织成一个虚拟的圆环 , 整个空间按顺时针方向组织 , 下一步将各个 master 节点(使用服务器的 ip 或主机名)进行 hash 。 这样就能确定每个节点在其哈希环上的位置 。
来了一个 key , 首先计算 hash 值 , 并确定此数据在环上的位置 , 从此位置沿环顺时针“行走” , 遇到的第一个 master 节点就是 key 所在位置 。
在一致性哈希算法中 , 如果一个节点挂了 , 受影响的数据仅仅是此节点到环空间前一个节点(沿着逆时针方向行走遇到的第一个节点)之间的数据 , 其它不受影响 。 增加一个节点也同理 。
燃鹅 , 一致性哈希算法在节点太少时 , 容易因为节点分布不均匀而造成缓存热点的问题 。 为了解决这种热点
问题 , 一致性 hash 算法引入了虚拟节点机制 , 即对每一个节点计算多个 hash , 每个计算结果位置都放置一个虚拟节点 。 这样就实现了数据的均匀分布 , 负载均衡 。
辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?redis cluster 的 hash slot 算法
redis cluster 有固定的 16384 个 hash slot , 对每个 key 计算 CRC16 值 , 然后对 16384 取模 , 可以获取 key 对应的 hash slot 。
redis cluster 中每个 master 都会持有部分 slot , 比如有 3 个 master , 那么可能每个 master 持有5000 多个 hash slot 。 hash slot 让 node 的增加和移除很简单 , 增加一个 master , 就将其他 master的 hash slot 移动部分过去 , 减少一个 master , 就将它的 hash slot 移动到其他 master 上去 。 移动hash slot 的成本是非常低的 。 客户端的 api , 可以对指定的数据 , 让他们走同一个 hash slot , 通过 hash tag 来实现 。
任何一台机器宕机 , 另外两个节点 , 不影响的 。 因为 key 找的是 hash slot , 不是机器 。 、
辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?redis cluster 的高可用与主备切换原理
redis cluster 的高可用的原理 , 几乎跟哨兵是类似的 。
判断节点宕机
如果一个节点认为另外一个节点宕机 , 那么就是 pfail , 主观宕机 。 如果多个节点都认为另外一个节点宕机了 , 那么就是 fail , 客观宕机 , 跟哨兵的原理几乎一样 , sdown , odown 。
在 cluster-node-timeout 内 , 某个节点一直没有返回 pong , 那么就被认为 pfail 。
如果一个节点认为某个节点 pfail 了 , 那么会在 gossip ping 消息中 , ping 给其他节点 , 如果超过半数的节点都认为 pfail 了 , 那么就会变成 fail 。


推荐阅读