# Redis集群技术架构

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/13636.html | 发布：2022-12-02 | 更新：2022-12-02 | 分类：建站教程、投稿分享

## 1、无中心化

 
 
- Redis Cluster采用无中心架构，每个节点都保存数据和整个集群的节点状态 
- 每个节点都和集群中的其它节点保持连接 
- 使用gossip协议传播信息以及发现新的节点 
- 节点不作为client请求的代理，client应该根据节点返回的错误信息重定向到目标client 

 

## 2、数据分布（slot）

 

redis预设16384个slot（槽），集群中的每个master节点负责分管一部份slot，保存数据时，根据CRC16(key) mod 16384的值，决定将一个key放到哪个槽中，从而定位由哪个redis实例存储。当发生Redis节点增减时，调整桶的分布即可，实现了集群的动态扩容功能。同时也间接的说明redis集群最多只能有16384个节点。   
例如：假设Redis集群有三个节点A/B/C，在开始创建的时候，集群中节点槽的分配如下：   
Node A 分管slot的编号为：0 ~ 5460   
Node B 分管slot的编号为：5461 ~ 10922   
Node C 分管slot的编号为：10923 ~ 16383   
当添加一个新的master节点D，假设为它分配900个slot，你可以从节点ABC三中各取300个分配给D，也可指定从A或B或C中移出900个slot分配给D，或选其中几个节点中各取一部份凑够900个分配给D即可。同样的，如果要将D节点移除，需要先将D节点分管的slot全部分配到其它master节点后才能移除，否则有无效的slot，集群将无法服务。

 

## 3、可用性：Master-Slave

 
 
- 为了保证服务的可用性，Redis Cluster采取的方案是Master-Slave机制 
- 每个Redis Master Node可以有一个或者多个Slave Node。当Master Node挂掉时，会从Slave Node中选一个新的Master 
- 每个Master Node都负责分管一定范围的slot，当这些slot对应的Master和Slave都挂掉时，这部份slot对应的数据将不可用 
- 16384个slot必须被全部分配，否则集群将不可用。通过`cluster info`查看集群状态可以得知。 

 

## 4、写

 

Redis Cluster采用异步复制机制   
一个完整的写操作步聚：   
1. client写数据到master   
2. master回复client “OK”   
3. master将数据传播更新到slave

 

存在数据丢失的风险：   
1. 上述步聚1)和2)成功后，如果此时master crash，而数据还没有传播到slave。此时slave选主为master，但那部份数据可能就被丢失了。   
2. 由于分区导致同时存在两个master，client向旧的master写入了数据   
当然，由于Redis Cluster存在超时及故障恢复机制，第2个风险基本上可以忽略不计

 

## 5、数据迁移

 

Redis Cluster支持在线增、减节点。基于slot的数据分布方式大大降低了迁移成本，只需将数据slot从一个redis node迁移到另一个redis node即可完成迁移工作 。

 

当slot从一个Node A向另一个Node B迁移时，Node A和Node B都会有这个slot，Node A上slot的状态设置为MIGRATING，Node B上的状态被设置为IMPORTING。此时当客户端请求时，所有key在Node A上的请求都由A来处理，所有不在A上的key都由Node B来处理。同时，Node A上将不会创建新的key。

 

## 6、客户端操作的一些缺陷

 
 
- 不支持多数据库，默认只有一个0号db，select 0 
- cluster环境下slave默认不接受任何读写操作，在slave执行readonly命令后，可执行读操作。执行readwrite命令后，可执行读写操作。 
- client端不支持多key操作(mget,mset等)，但当keys集合对应的slot相同时支持mget操作。 

![Redis集群技术架构](https://www.mfisp.com/wp-content/uploads/2022/01/13e1e49bb26b66e_1_post.png)

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
