Redis Cluster 集群及动态扩容

Redis cluster集群认识及动态扩容机制,参考网上资料,在此整理下。

Redis单机数据库

在了解Redis Cluster之前,先了解下Redis单机数据库,Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过修改配置文件databases支持更多,无上限)。
客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

redis> SELECT 1
OK
redis [1] >get xiaoming
(nil)

Redis Cluster了解

Redis Cluster是由多个Master-Slave构成一个完整的整体,对于用户来说,用户只关注这个数据集合,而整个数据集合的某个数据子集存储在哪个节点对于用户来说是透明的。Redis Cluster具有分布式系统的特点,也具有分布式系统如何实现高可用性与数据一致性的难点。

Redis Cluster特点如下:

  • 所有的节点相互连接;
  • 集群消息通信通过集群总线通信,,集群总线端口大小为客户端服务端口+10000,这个10000是固定值;
  • 节点与节点之间通过二进制协议进行通信;
  • 客户端和集群节点之间通信和通常一样,通过文本协议进行;
  • 集群节点不会代理查询;

Redis Cluster分区实现原理

slot(槽)

Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。在Redis Cluster中,只有Master才拥有槽的所有权,如果是某个Master的slave,这个slave只负责槽的使用;这个槽是一个虚拟的槽,并不是真正存在的。Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。

key 与slot的关系

键到slot的基本映射算法如下:

HASH_SLOT = CRC16(key) mod 16384 

通过key与slot的映射算法,计算出当前key应该存储在哪个slot中,从公式中可以看出,当前key与slot的映射是固定不变的。由于每个Master负责一部分slot,可知在Master节点数量调整时,slot与Master映射的关系也会调整。

扩容机制(重新分片)

在Redis Cluster 新增的Master节点是没有数据的,主节点如果没有slots的话,存取数据就都不会被选中,需要手动把slot及其中数据迁移到新增的Master中(参考Redis集群官方中文教程),操作指令如下

# redis-trib.rb reshard 192.168.10.219:6378 //下面是主要过程  

How many slots do you want to move (from 1 to 16384)? 1000 //设置此Master节点slot数1000  
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node id 
Please enter all the source node IDs.  
 Type 'all' to use all the nodes as source nodes for the hash slots.  
 Type 'done' once you entered all the source nodes IDs.  
Source node #1:all //表示全部节点重新洗牌  
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分 

参考:
Redis集群官方中文教程
Redis Cluster 分区实现原理
Redis集群 cluster-slot操作指令

你可能感兴趣的:(Redis)