前言
所谓的数据分布算法,指的是当有多个节点时,按照什么样的规则来把数据分布到这些节点上。
对于Redis来说就是,在使用redis cluster部署时,使用不同的数据分布算法,就决定了缓存数据如何分布到这些master节点上去。
redis cluster 介绍
多个master:自动将数据进行分片,每个master上放一部分数据
每个master有一个或多个slave:提供内置的高可用支持,当master不可用时,master下的slave可以被选举上来,成为新的master。
在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379 16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权。
cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
1.最老土的hash算法和弊端(大量缓存重建)
就是根据key计算出的hash值,根据master节点数量进行取模,然后根据余数分布到不同的master节点上。
缺点:一旦某个master挂了,那么就面临大量的(几乎所有的)key的迁移,大量缓存会失效。
比如本来有5个master节点,挂了一个,只剩4个master了,那么hash(key) % 5 != hash(key) % 4 的所有key都需要进行迁移。
2.一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)
一致性Hash算法(Hash环):
3个master节点计算出的hash值落在hash环上,key计算出的hash值同样落在hash环上,然后顺时针去寻找最近的hash(master)节点,然后将key打到对应的master上。
如果某个master挂了,那么只会影响到1/3的key进行迁移,缩小了需要迁移的key的数量。
缺点是:当master1挂了之后,本来在master1上的大量的key都会顺时针找到离自己最近的另一个master2,这是master2与master3数据分布不均匀,而且master2因为key数据量太多,造成局部热点问题。
虚拟节点:
给每个master都做了均匀分布的虚拟节点。
可以使每个master的数据量分布均匀,而且当某个master挂了之后,失效的key会均匀地落到剩下的master节点上。
3.redis cluster的hash slot算法
Hash(key) ---> hash slot ---> master,其中hash slot的数量固定,hash(key)与hash slot的对应关系不会发生变化,hash slot与master节点的对应关系由redis cluster维护,在master挂了之后会自动进行hash slot的迁移,在增加或删除master节点时可以指定迁移数量。
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来实现。