分片集群

2021/01/20 posted in  基础

启动多个Redis实例组成一个集群,按照一定的规则,把收到的数据划分成多份。每一份用一个实例保存

Redis 扩展

  1. 纵向扩展:升级单个Redis实例的资源配置
  2. 横向扩展:增加当前Redis实例的个数



扩展对比


纵向扩展:实施方便;但是如果数据增加,会对内存需求提升,主线程fork子线程时会出现阻塞,同时受硬件和成本的约束
横向扩展:不用担心单个实例的成本;但是需要解决数据分片后实例如何分布,客户端如何确定访问哪个实例




数据切片和实例对应

3.0 开始官方提供Redis Cluster方案实现切片集群,Redis Cluster采用哈希槽处理数据和实例之间的关系,在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中

  1. 根据键值对的 key,按照CRC16 算法计算一个 16 bit 的值;
  2. 再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽

手动分配哈希槽

redis-cli -h 172.16.19.3 –p 6379 cluster addslots 0,1
redis-cli -h 172.16.19.4 –p 6379 cluster addslots 2,3
redis-cli -h 172.16.19.5 –p 6379 cluster addslots 4

在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。

客户端定位实例

Redis 实例会把自己的哈希槽信息发送给和它相连的其他实例,完成哈希槽配置信息的扩散,客户端收到信息后会把信息缓存在本地,如果实例个数变化或者需要负载均衡,则通过重定向寻找

如果存在部分数据迁移的问题客户端会收到ASK的error信息,ASK表明数据在迁移,把客户端请求的最新实例数据返回给客户端,ASK 命令不会更新客户端本地缓存