分布式缓存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集群扩容和缩容
- 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集群扩容和缩容实现
- 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
- Redis Cluster集群缩容:分别指定被缩容的Redis主机和接收缩容卡槽数据的Redis主机
/usr/redis/bin/redis-cli --cluster reshard 192.168.212.163:7000 --cluster-from 5d94171eb34ed4396bf5b9db8efaab4d96d0cf10 --cluster-to 511058958a3b80dd600e060c2500050c6c5a02ab --cluster-slots
转载请注明原作者