2.【Redis Cluster集群】redis分布式数据存储核心原理
- 学习内容
redis 数据存储的核心算法
1. 最简单的数据分布算法-hash 算法
1.1 hash原理
- 来了一个key之后,计算hash值,然后对节点数量取模,取模的结果一定是在0-(节点数量-1)之间,就可以根据取模结果将请求打到具体的某一节点上去。
1.1 hash算法缺陷
一旦某一个master宕机了,当请求过来,会根据新的节点数量取模,请求会到和原先不同的master上去,导致几乎大部分请求,全部都无法拿到有效的缓存,大量的请求会全部涌入数据库,导致数据库压力剧增。
举个例子:
假设有 3 个master节点,一个参数为3的请求过来,3 % 3 = 0,请求到达第一个节点;如果所有节点正常,后续参数为3的请求都会到第一个节点获取数据。
此时,如果一台机器宕机了,有效master数量才两个了,参数为3的请求过来,3 % 2 = 1,请求就会到第二个节点上去,第二个节点没有缓存数据,就会到数据库查询数据。导致数据库压力激增。
2. 一致性hash算法(搞了个圆环出来)
2.1 一致性hash算法原理
- 一个key过来,同样计算hash值,然后会用hash值在圆环的各个点上去(圆环上的每个点对应着一个hash值)去对比,看hash值落在圆环的哪个部位。
- key 通过hash值在圆环上找到自己的位置后,会顺时针的去寻找离自己最近的节点上获取自己所需要的数据。
2.2 一致性hash算法的优点。
一致性ahsh算法,保证,任何一个master宕机,只有之前哪个master节点上的数据会受到影响,因为照着顺时针走,全部落在宕机的那个master节点上的数据找不到了,就会继续顺时针到下一个master节点上找,也找不到。
只会导致 宕机节点数量 / 总节点数量 的数据失效,需要到数据库中重新查找。比 hash 算法 几乎100%的数据失效的后果会轻的多。
2.3 一致性hash算法存在的问题
存在 在某个 hash 区间的值特别多,导致大量的请求 分发到同一个master节点上,造成master节点热点问题。
- 解决方案- 在圆环上建立虚拟节点实现负载均衡,保证流量的最大分发到各个节点上。
给 每个节点做均匀分布的虚拟节点,这样的话,在每个区间内,大量的数据会均匀的分布到各个节点,而不是顺时针走,全部涌入到一个master节点上。
3. redis cluster 的hash slot 算法。
3.1 hash slot 算法原理
- redis cluster 有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取到key对应的hash slot 是多少,redis cluster中的master都会持有部分slot,比如3个master,那么每个master平均下来就会有5000多个hash slot。
3.2 hash slot 算法优点:
- 只会导致部分数据失效
当一个master宕机,不会导致所有的数据失效,因为key是通过对16384取模,而不是通过对有效的节点数量进行取模。比如:3个master节点,一个master节点宕机了,那上面的slot 就会迁移到其他的节点上去,当同一个请求再次发送过来的时候,就会再次到 slot 所在的新 节点获取数据。
- hash slot的增加和删除很简单
hash slot 的增加 和 删除都很简单,增加一个master,就会将其他master的hash slot移动部分过去,减少一个master,就会将它的hash slot移动到其他master上去,移动 hash slot的成本非常低。