Redis Cluster集群

一 集群模式概述

![image](images/V48F-jqX_oJSOlLyA6CXMno6jXNU9vWdOSAkwU0vTyM.png)

  1. Cluster模式是Redis3.0开始推出
  2. 采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接
  3. 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用
  4. 各个节点会互相通信,采用gossip协议交换节点元数据信息
  5. 数据分散存储到各个节点上

之前我们讲过哨兵模式,跟cluster有什么区别呢?

![image](images/BwuhG9mj7W-5WLkw7bcHjlcaw5pvhb4E0I6RTzRr8B0.png)

采用redis主从复制,每个节点持有全量数据,且数据保持一致,为系统Redis高可用。

![image](images/V48F-jqX_oJSOlLyA6CXMno6jXNU9vWdOSAkwU0vTyM.png)

每个节点主数据不同,是数据的子集,利用多台服务器构建集群提高超大规模数据处理能力,同时提供高可用支持。

二 cluster集群如何分散数据

Redis Cluster 集群采用Hash Slot(哈希槽)分配

Redis集群预分好16384个槽,初始化集群时平均规划给每一台Redis Master

![image](images/uEG7XI6p0VoCo9SV0Omb1UdLlC0KPzaDcShFOoR9DFk.png)

存储过程:

  1. 数据来到redis,进行crc16计算出一个数字
  2. 根据数字对16384进行取模,分配到对应的区域

读取过程:

  1. 读取的key来到redis,同样进行crc16计算一个数字
  2. 根据数字对16384进行取模,到对应区域取值

注意:为什么是16384?

在Redis 集群中槽分配的元数据会不间断的在Redis集群中分发,以保证所有节点都知晓槽的分配情况

16384=16k,在发送心跳包时使用char进行bitmap压缩后是2k(2 * 8 (8 bit) * 1024(1k) = 16K)

通常我们不会部署超过10000个Redis主节点,因此16384就够用了

三 集群构建

  1. 创建redis-cluster.conf配置文件:

![image](images/6uhSfAFDEwjrgDOpW1tMYYHPU7ltn3NfGWhmQmwMd84.png)

上述只是跟集群相关的配置,写好之后将该配置应用到每一个redis实例里边,然后在任意节点执行以下命令:

![image](images/ukPxNnkmGfbwashkMYjiNx1duO61eA8IuIwwcuPLzx4.png)

最后一行的配置意思是一主带一从,所以会默认将前三个节点当主节点,后三个当从节点。

执行结果如下:

![image](images/GtbRsNOLEwY_3ydhic-7g9Cmvgu1h_k3-Ngud6hhCG0.png)

可以看到102被分配到了0-5460等。

我们来看一下存储的过程:

![image](images/KpyOS3nP2YA8JKePoXpCXMqgr8aQ08qFQWjxXc3wkLA.png)

a存入的时候: 计算其值是15495,属于104,所以存储到104节点的服务器。

  1. 我们模拟故障转移

![image](images/51GJb679wRL04ba8zqY4tH8t8KAtGR_KktViXyu6cns.png)

如果我们设置的timeout是20s,如果20s到了都没有通信成功:

  1. 确定102节点已经挂了,设置fail
  2. 将111变为新的主
  3. 通过gossvip协议告知其他节点,111已经是新的主了
  4. 102在恢复后,将会以从的身份执行任务(永久降级)

image
提问:如果某个主从一起挂掉?
当某个节点的主从一起挂掉了,那么集群将进入fail状态,拒绝任何请求,所以生产中我们建议资源足够的情况,一个主最好挂载两个从。

Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate