redis cluster 介绍

  1. 自动将数据进行分片,每个master 上放一部分数据
  2. 提供内置的高可用支持,部分master不可用时,还是可以继续工作的
  3. 在redis cluster 架构下,每个redis要放开两个端口号,比如一个事6379,另外一个就是在这基础上+10000,也就是16379
  4. 16379端口号用来进行节点间的通信,也就是cluster bus的东西,集群总线。进行故障检测、配置更新、故障转移授权。使用一种二进制的协议,主要事用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。

hash

通过key值的hash值,通过对节点大小进行取模,例如key为aaa的hash值为100,此时master节点为3个,那么当前key所在的master node为 100 % 3 = 1。这种状态在正常的master时是可以使用的。
当master node 其中的一个宕机时,原来所有的key的hash值就会对master node的数量进行取模,此时为 100%2 = 0, 那么就会造成大量的key 查询失效,造成redis的缓存穿透。

一致性hash (自动缓存迁移+虚拟节点)自动负载均衡

所有的key值都分布在一个圆环上,使用key值的hash对圆环上的总数量,
假设某哈希函数H的值空间为0-232-1取模(即哈希值是一个32位无符号整型,圆环数量则为232)进行取模,然后找到该key在圆环上的位置,然后顺时针找到对应的master node节点,下图中的为找到了master node2, 如果其中一个master node宕机了,那么 key1、key2…key5这些值都会顺时针找到master node3,只会损失原来master node2中的数据。

这种方案比起上一种方案减少了master node中的数据的不能访问量,只会损失掉宕机的master node中的数据

redis 积分榜 redis数据分布_redis

虚拟节点

为了解决雪崩现象和数据倾斜现象,提出了虚拟节点这个概念。就是将真实节点计算多个哈希形成多个虚拟节点并放置到哈希环上,定位算法不变,只是多了一步虚拟节点到真实节点映射的过程。

redis 积分榜 redis数据分布_redis 积分榜_02

  1. 增加虚拟节点,在圆环上均匀分布一定数量的虚拟虚拟节点,表示为key值所对应的节点,两个虚拟节点之间存在这key值,所以这种方法减少了master node 分布不均匀。
  2. 当real1节点挂掉后,v100和v101节点也会随即消失,这时k1数据就会被分配到v301上,k4就会被分配到了v200上,这就解决了雪崩的问题,当某个节点宕机后,其数据并没有全部分配给某一个节点,而是被分到了多个节点。
  1. 真实节点不放置到哈希环上,只有虚拟节点才会放上去。
  2. 为什么要使用闭合的哈希环?举个例子,如果在223-3处有一个key,而223-3~2^23处并没有节点,那么这个key该存在哪里节点呢?说到这里你应该明白了吧。
  3. 一致性哈希使用的32个bits,4个bytes,肯定也会有哈希碰撞的问题存在。

redis cluster 的hash slot

redis cluster 有固定的 2^14(16384) 个hash slot,对每个key值计算CRC16值,然后对16384取模,可以获取对应的hash slot。每个master 都会持有部分的slot,当增加一个master时,就将其他的master的hash slot移动部分过去,减少一个master就将该master中的hash slot移动到其他master中。

master节点的slave节点不分配槽,只拥有读权限。但是注意在代码中redis cluster执行读写操作的都是master节点,并不是你想 的读是从节点,写是主节点。

redis 积分榜 redis数据分布_redis_03

客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag实现

一致性hash 和 hash slot 对比

  1. 它并不是闭合的,key的定位规则是根据CRC-16(key)%16384的值来判断属于哪个槽区,从而判断该key属于哪个节点,而一致性哈希是根据hash(key)的值来顺时针找第一个hash(ip)的节点,从而确定key存储在哪个节点。
  2. 一致性哈希是创建虚拟节点来实现节点宕机后的数据转移并保证数据的安全性和集群的可用性的。redis cluster是采用master节点有多个slave节点机制来保证数据的完整性的,master节点写入数据,slave节点同步数据。当master节点挂机后,slave节点会通过选举机制选举出一个节点变成master节点,实现高可用。但是这里有一点需要考虑,如果master节点存在热点缓存,某一个时刻某个key的访问急剧增高,这时该mater节点可能操劳过度而死,随后从节点选举为主节点后,同样宕机,一次类推,造成缓存雪崩。
  3. 扩容和缩容可以看到一致性哈希算法在新增和删除节点后,数据会按照顺时针来重新分布节点。而redis cluster的新增和删除节点都需要手动来分配槽区。