Redis cluster 数据分布算法
一 常用的分布算法
-
hash 算法
按照key的hash值对节点进行取模,然后得到的结果就是存放数据的节点;
缺点:如果一个节点挂了,新的数据按照新的节点数据取模导致无法取到数据(所有数据都取不到),于是就会被击穿到数据库,导致数据库压力增大。同时需要重新进行大量计算,把原有数据进行重新分配。 -
一致性hash算法(虚拟节点算法)
把节点分布到一个圆环中分布,key的hash值于当前节点hash值比较,然后确定在圆环上的位置,同时按照顺时针方向去寻找最近的一个节点。
按照上述理论,当一个节点失效的时候,就只有这个节点对应的数据无法取到,而其他节点数据依然还是可以取到。所以,可用性比hash算法要高。
缺点:针对热点数据问题,可能都会涌入到同一个节点中,而其他节点数据又少。
优化:在圆环中增加多个虚拟的同类节点,比如原来有1号 2 号 3号 这三个节点,现在虚拟出多个1号、2好、3号的节点分布在圆环上,这样就可以更细粒度的切割圆环数据,尽量减少了热点数据集中问题。 -
hash slot 算法
上述都是物理节点的分布做算法,而redis cluster是通过在节点中分布虚拟的小节点来分布数据。redis cluster会在整个集群节点中分布 16384 个虚拟slot。每个节点分配一部分slot。然后所有的key的hash对 16384 取模,从而知道在哪个slot,也就知道了数据在哪个节点上。 当一个节点挂了时,就会把这个节点上的slot迁移到其他节点上。
因此,可以认为hash slot 算法,是一致性hash算法的优化。
优点:即拥有了一致性hash算法的优点,又避免了热点数据;
master的增加和移除也是非常方面,增加master,就把其他节点的slot移动到这个master。移除master,就把当前master的slot移动到其他节点。