目录
一、分布式寻址算法
1. hash 算法
2. 一致性 hash 算法
3. Redis cluster 的 hash slot 算法
二、Redis cluster 的高可用与主备切换原理
1. 判断节点宕机
2. 从节点过滤
3. 从节点选举
4. 与哨兵比较
一、分布式寻址算法
·hash 算法(大量缓存重建)
·一致性 hash 算法(自动缓存迁移)+虚拟节点(自动负载均衡)
·Redis cluster 的 hash slot算法
1. hash 算法
来了一个 key,首先计算 hash 值,然后对节点数取模。然后打在不同的 master 节点上。一旦某一个 master 节点宕机,所有请求过来,都会基于最新的剩余 master 节点数去取模,尝试去取数据。这会导致大部分的请求过来,全部无法拿到有效的缓存,导致大量的流量涌入数据库。
2. 一致性 hash 算法
一致性 hash 算法将整个 hash 值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织,下一步将各个 master 节点(使用服务器的ip 或主机名)进行 hash。这样就能确定每个节点在其哈希环上的位置。
来了一个 key,首先计算 hash 值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”遇到的第一个 master 节点就是 key 所在位置。
在一致性哈希算法中,如果一个节点挂了,受影响的数据仅仅是此节点到环空间前一个节点(沿着逆时针方向行走遇到的第一个节点)之间的数据,其它不受影响。增加一个节点也同理。
燃鹅,一致性哈希算法在节点太少时,容易因为节点分布不均匀而造成缓存热点的问题。为了解决这种热点问题,一致性 hash 算法引入了虚拟节点机制,即对每一个节点计算多个 hash,每个计算结果位置都放置一个虚拟节点。这样就实现了数据的均匀分布,负载均衡。
3. 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 sot 的成本是非常低的。客户端的 api,可以对指定的数据,让他们走同一个hash slot,通过 hash tag 来实现。
任何一台机器宕机,另外两个节点,不影响的。因为key找的是 hash sot,不是机器。
二、Redis cluster 的高可用与主备切换原理
1. 判断节点宕机
在 cluster-node-timeout 内,某个节点一直没有返回 pong ,那么就被认为 pfail。如果一个节点认为某个节点 pfail 了,那么会在 gossip ping 消息中, ping 给其他节点,如果超过半数的节点都认为 pfail 了,那么就会变成fail。
2. 从节点过滤
3. 从节点选举
所有的 master node 开始 slave 选举投票,给要进行选举的 slave 进行投票,如果大部分 masternode (N/2 +1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成 master。
从节点执行主备切换,从节点切换为主节点
4. 与哨兵比较
(ps:一个点赞一份爱,点个关注不迷路!)