分布式寻址方法

141 阅读2分钟

分布式寻址算法:hash算法、一致性hash算法以及Redis cluster的hash slot算法。

1、简单hash算法

计算出key的hash值 对机器的台数进行取模,得到最终key存储的节点。

缺点:此时如果需要加节点,那么再次取模得到的节点并不是原本存储的节点,可能会导致缓存雪崩

2、一致性hash算法

将整个hash空间想象为一个圆环(0 - 2^32-1),然后根据节点的IP进行hash计算(2^32)取模,得到节点的位置 在存储对象时,经过对key的hash计算后可以得到key在圆环上的位置,而key所存储的真正位置为顺时针寻找到的第一个节点。

一致性hash算法对象和节点分布位置.png 容错性分析:有A、B、C、D4个节点,对象C存在C节点中,假如此时C节点挂了,那么受到影响key仅仅为在B和C节点间的,B C节点间的数据(存储在C节点)会转移到D节点中。 一致性hash在挂节点后数据存储分析.png

缺点: 可能会发生数据倾斜, 如果分片集群数太少,分布不均,一致性hash可能会出现部分节点数据太多,部分节点数据太少。

解决方式:虚拟节点(实际节点在hash空间的复制品),一个节点多次计算hash,计算可以采用对应节点的IP地址加数字后缀的方式。

3、hash slot(Redis的哈希槽算法)

Redis cluster有固定的16384个hash slot(hash槽),每次计算key的CRC16(一种校验算法)值,然后对16384取模,得到key对应存储的hash槽, Redis的cluster每个master都会持有部分hash槽,可手动分配,每次新增节点时,可以将其他master的部分hash槽移过去,减少节点时就将该节点的hash槽移到其他的master上。移动hash槽的成本非常低,可以自动完成。

Redis cluster各节点间通信和交换数据的协议 gossip

交换的信息包括:故障信息、新增或移除节点、hash slot的转移

发送的五种消息类型:PING、PONG、MEET、FAIL、PUBLISH