分布式缓存Redis_8 Redis Cluster集群扩容和缩容

                                           分布式缓存Redis

                                          8 Redis Cluster集群扩容和缩容

                                                                                                                                                                                                田超凡

                                                                                                                                                                                           20191201

 

转载请注明原作者

1 Redis Cluster集群卡槽迁移

RedisCluster去中心化分片集群的核心思想就是通过Hash卡槽来唯一确定每一个Key存放的Redis主机,实现Redis动态扩容和缩容。Redis Cluster集群中数据的读写操作也都是基于Hash卡槽来定位Key的。Redis Cluster集群初始化的时候会默认均等分配16384个卡槽到各个片区的Redis主机,对于读操作而言,如果当前连接的Redis主机中无法获取到Key,会自动进行重定向,根据Key的卡槽值去对应的Redis主机中去获取Key;对于写操作而言,如果当前需要写入的Key的卡槽值不在当前连接的Redis主机卡槽范围内,那么也会进行自动转发,把数据写入到卡槽范围包含Key的卡槽值的Redis主机中。

Redis Cluster集群在进行扩容和缩容操作时,都是基于Hash卡槽迁移实现的。Redis卡槽迁移指的是对同一个Redis Cluster集群中不同Redis主机中的卡槽数据进行迁移移动,卡槽迁移会在不同Redis主机中进行数据迁移,卡槽迁移会同时迁移卡槽和卡槽中的数据(Key)

 

2 Redis Cluster集群扩容和缩容

  1. Redis Cluster集群扩容:在Redis Cluster集群正常运行提供服务期间,动态新增片区(Redis主机+Redis从机)来扩展Redis Cluster集群片区,把已经分配Hash卡槽的Redis主机的卡槽数据迁移一部分到新扩容的Redis主机中,这种实现方式就是Redis Cluster的扩容机制。

Redis Cluster集群扩容实现原理:

Redis Cluster动态扩容需要指定新扩容节点的Hash卡槽最大阀值,在扩容时会自动从Redis Cluster集群中已经分配卡槽范围的Redis主机中重新计算每个分配了卡槽的Redis主机需要迁移的Hash卡槽数量,计算方式是:

每个Redis主机需要迁移的卡槽数量=指定的扩容节点的卡槽数量/Redis主机数量

获取到每个Redis主机需要迁移的卡槽数量之后,会自动根据对应Redis主机的Hash卡槽范围进行计算,获取最终需要迁移的卡槽值,最后把对应卡槽和卡槽中的Key迁移到扩容后的Redis主机。

(比如扩容Redis主机的最大卡槽阀值指定的是4098,参与集群扩容的扩容源是3台主机,包括:

7000 Master 【0-5460】

7001 Master 【5461-10921】

7002 Master 【10922-16382】

那么这三个主机都需要迁移的卡槽数量=4098/3=1366

扩容后,这三个主机对应的卡槽范围是:

7000 Master 【0-4093】 = 5460-1366

7001 Master 【5461-9554】 = 10921-1366

7002 Master 【10922-15015】 = 16382-1366

假设扩容后的节点是7003,那么扩容的节点存放的Hash卡槽范围就是:

7003 Master 【4094-5460】+【9555-10921】+【15016-16382】

卡槽总数是4098

)

在Redis Cluster集群扩容中,扩容源指的是参与扩容,需要被迁移数据的Redis主机。扩容目标指的是用来存放扩容数据的,新加入Redis Cluster集群的Redis主机。

 

注意:

在Redis Cluster扩容之后,扩容源Redis主机中的卡槽范围会根据迁移的卡槽数重新进行计算并减少,扩容目标Redis主机中的卡槽范围会增加迁移过来的卡槽和卡槽数据。

 

(2) Redis Cluster缩容:在Redis Cluster集群正常运行提供服务期间,动态删除某个片区Redis主机的卡槽数据,把这个Redis主机中的卡槽数据全部还原到其他的Redis主机中,这种实现方式就是Redis Cluster缩容。

Redis Cluster集群缩容实现原理:

首先指定需要缩容的Redis主机,获取需要缩容的Redis主机的卡槽总数

指定接收缩容数据的缩容目标Redis主机,根据缩容的Redis主机卡槽总数,在目标Redis主机中新增卡槽和对应的卡槽数据。

Redis Cluster集群缩容执行完成之后,接收缩容数据的Redis主机卡槽数会重新计算,计算方式:

缩容目标Redis主机卡槽数=缩容目标Redis主机卡槽数+缩容的卡槽数

 

注意:

如果指定了多个Redis主机接收缩容的卡槽,那么会对缩容卡槽总数进行等比分配,然后每个接收缩容卡槽数据的Redis主机卡槽数量会加上等比分配的结果。计算方式:

缩容卡槽总数等比值=缩容卡槽总数/接收缩容卡槽的Redis主机总数

每个接收缩容卡槽的Redis主机卡槽数=每个接收缩容卡槽的Redis主机卡槽数+缩容卡槽总数等比值

(

比如,假设Redis Cluster集群中存在四台主机,分布在四个片区,每个Redis主机的卡槽范围如下:

7000 Master 【0-4093】

7001 Master 【5461-9554】

7002 Master 【10922-15015】

7003 Master 【4094-5460】+【9555-10921】+【15016-16382】

此时假设要缩容的是7003中的卡槽数据,接收缩容卡槽的主机是7000,7001,7002。首先会计算出7003中的卡槽数据总数是4098,然后会重新计算7000,7001,7002的卡槽数据范围,计算得出:

缩容卡槽数据均值=4098/3=1366

7000 Master =【0-4093】+ 1366 = 【0-5460】

7001 Master =【5461-9554】+ 1366 = 【5461-10921】

7002 Master =【10922-15015】 + 1366 = 【10922-16382】

)

在Redis缩容之后,被缩容的Redis主机卡槽数据会全部清空,接收缩容数据的Redis主机卡槽数据范围会增加。

 

(3) Redis Cluster集群扩容和缩容对比

集群扩容指的是迁移部分Redis主机中的卡槽数据到一个新的Redis主机中。集群扩容后,扩容源Redis主机卡槽数减少,扩容目标Redis主机卡槽数增加。

集群缩容指的是迁移某个Redis主机中的所有卡槽数据到多个新的Redis主机中。

集群缩容后,缩容源Redis主机卡槽数据清空,缩容目标Redis主机卡槽数增加。

 

在同一个Redis Cluster集群中,如果每次执行扩容和缩容的Redis主机数量相同,那么可以理解为扩容和缩容互为逆操作。

 

3 Redis Cluster集群扩容和缩容实现

  1. Redis Cluster集群扩容分别扩容Redis主机和Redis从机给扩容后的Redis主机指定分配的卡槽值最大阀值。一次完整的扩容相当于是扩容一个集群片区(Redis主机+Redis从机),扩容需要指定扩容源Redis主机(只要是指定同一个Redis Cluster集群中任意一个已经有卡槽范围的Redis主机即可,默认会把集群中所有分配了卡槽范围的Redis主机作为扩容源)。

 

/usr/redis/bin/redis-server /usr/rediscluster/redis7006/redis.conf

/usr/redis/bin/redis-server /usr/rediscluster/redis7007/redis.conf

 

扩容后的Redis主机为7006:

/usr/redis/bin/redis-cli --cluster add-node 192.168.212.163:7006   192.168.212.163:7000

 

扩容后的Redis从机为7007,对应主机是7006:

/usr/redis/bin/redis-cli --cluster add-node 192.168.212.163:7007   192.168.212.163:7000 --cluster-salve  --cluster-master-id       5d94171eb34ed4396bf5b9db8efaab4d96d0cf10

 

 

给扩容后的Redis主机7006分配最大卡槽阀值:

cluster slots

/usr/redis/bin/redis-cli --cluster reshard  192.168.212.163:7000

 

 

  1. Redis Cluster集群缩容分别指定被缩容的Redis主机和接收缩容卡槽数据的Redis主机

/usr/redis/bin/redis-cli --cluster  reshard  192.168.212.163:7000  --cluster-from   5d94171eb34ed4396bf5b9db8efaab4d96d0cf10  --cluster-to 511058958a3b80dd600e060c2500050c6c5a02ab  --cluster-slots

 

转载请注明原作者

 

发布了100 篇原创文章 · 获赞 10 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_30056341/article/details/103331791