Redis扩容及Slot Balance、Reshard

Redis扩容及Slot Balance、Reshard

本文档是在上生产环境前,在腾讯云测试环境中做的
某银行生产环境最终redis扩容结果:
redis数据量一共有14亿6千多万key,16384个Slot,将130台机器配置成master slave模式,目前130每台redis内存已经调成14G,且每台使用率在6.49G到7.65G左右,65个master每台机器分配
slot在252至253。

新添加了两台机器
10.255.1.4 tbds-10-255-1-4
10.255.1.12 tbds-10-255-1-12

1、查看原有redis集群
登陆10.255.1.10原有redis的集群

./redis-cli -c -h tbds-10-255-1-10  -p 6379 -a [email protected]

Redis扩容及Slot Balance、Reshard_第1张图片
2、添加新的节点到集群中
2.1、添加tbds-10-255-1-4到集群中

./redis-cli -c -h tbds-10-255-1-4  -p 6379 -a [email protected]

在这里插入图片描述

cd /usr/hdp/2.2.0.0-2041/redis-3.2.9/src
#add-node 第一个IP为要加入redis cluster的机器,第二个为redis cluster中任意一台机器IP
./redis-trib.rb add-node 10.255.1.4:6379 10.255.1.10:6379  

Redis扩容及Slot Balance、Reshard_第2张图片
Redis扩容及Slot Balance、Reshard_第3张图片

2.2、添加tbds-10-255-1-12到集群中

./redis-cli -c -h tbds-10-255-1-12  -p 6379 -a [email protected]

在这里插入图片描述

cd /usr/hdp/2.2.0.0-2041/redis-3.2.9/src
#add-node 第一个IP为要加入redis cluster的机器,第二个为redis cluster中任意一台机器IP
./redis-trib.rb add-node 10.255.1.12:6379 10.255.1.10:6379

Redis扩容及Slot Balance、Reshard_第4张图片

Redis扩容及Slot Balance、Reshard_第5张图片
3、主从分配

#登陆新添加的节点中的一个(比如想想让10.255.1.12成为10.255.1.4的slave,登陆10.255.1.12)
./redis-cli -c -h tbds-10-255-1-12  -p 6379 -a [email protected]
#将该节点分配给另外一个节点的slave,参数为另外一个节点的id
cluster replicate  e6a63c7731e58246caba05d338d9d9e393a15493
cluster nodes

Redis扩容及Slot Balance、Reshard_第6张图片

4、搬迁数据
4.1 时间预估(计算暂时有点问题,实际生产环境pipeline设置为1000,最终花了大约5个多小时
目前生产环境中每一台redis大约有上三千五百万左右key,整体数据量大约480G,每台redis数据量大约12G左右,最终节点是130台redis实例,初步估算如下:
12G/35000000=368字节
40* 35000000个key ,其中有42%((12-(480/65))/12)的key需要迁移16.8* 35000000个key要迁移。假设内网环境下,ping pong耗时0.1ms。默认情况下每个migrate请求迁移10个key。
脚本串行发送getkeysinslot和migrate命令做一次迁移10个key的操作。
16.8*35000000 * 0.1ms * 2 / 10 = 3.2小时。

其中pipline为10时预计3小时;为100时,预计0.3小时,同时预留一定buffer时间进行校验,预留1小时时间。整体操作在1~4小时内完成。
4.2 具体操作
4.2.1 先停业务
为了保证数据搬迁的准确性,建议根据事先的时间预估停一段时间的业务,保证redis没有数据读写。
4.2.2 操作
 查看redis数据存储目录,备份所有redis数据目录
Redis扩容及Slot Balance、Reshard_第7张图片
到portal目录中,将所有的redis机器的ip写入cluster.info中
Redis扩容及Slot Balance、Reshard_第8张图片

./bootstrap.sh run cp -r “/var/data/redis /var/data/redis.bak”

在这里插入图片描述

 设置免密码登陆(每个redis节点都要设置,可以写个脚本)

./redis-cli -h tbds-172-17-1-236 -a [email protected] config set masterauth "";
./redis-cli -h tbds-172-17-1-236 -a [email protected] config set requirepass "";
注明:
生产环境可以执行可以执行add_passwd.sh

 登陆某一台redis机器,修改ruby的redis的password配置

vim /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb
###[email protected]改成nil

Redis扩容及Slot Balance、Reshard_第9张图片
 查看目前redis中key,slot分配情况

./redis-trib.rb info tbds-10-255-1-10:6379
./redis-cli -c -h tbds-10-255-1-10  -p 6379 cluster nodes 
##从下面截图中很容易看出10.255.1.4上没有slot和key,而10.255.1.10上有8192 slot

Redis扩容及Slot Balance、Reshard_第10张图片

在这里插入图片描述
 执行rebalance

##先模拟查看redis cluster 的执行计划
##模拟rebalance
./redis-trib.rb rebalance  --use-empty-masters --pipeline 100 --simulate 10.255.1.10:6379

注明:
–use-empty-masters:rebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置–use-empty-masters可以让没有分配slot的节点参与rebalance。
–simulate:设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。
–host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。
–pipeline :与reshar的pipeline参数一样,定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。
Redis扩容及Slot Balance、Reshard_第11张图片

通过simulate参数可以看出slot搬迁策略为
从10.255.1.10:6379搬迁4096 slots到10.255.1.4
###实际搬迁:

./redis-trib.rb rebalance  --use-empty-masters --pipeline 100  10.255.1.10:6379

Redis扩容及Slot Balance、Reshard_第12张图片

 查看目前redis cluster的slot分布

./redis-trib.rb info 10.255.1.10:6379
./redis-cli -c -h 10.255.1.10 -p 6379  cluster nodes

Redis扩容及Slot Balance、Reshard_第13张图片
注明:生产环境中操作同理
##模拟rebalance

./redis-trib.rb rebalance  --use-empty-masters --pipeline 100 --simulate host:6379

###实际搬迁:

./redis-trib.rb rebalance  --use-empty-masters --pipeline 100  host:6379
##或者直接执行rebalance_redis.sh脚本

 恢复以前的状态
将密码设置回来(每个节点都要设置,可以写个脚本)

./redis-cli -h tbds-172-17-1-236 -a [email protected] config set masterauth "[email protected] ";
./redis-cli -h tbds-172-17-1-236 -a [email protected] config set requirepass "[email protected] ";
注明:生产环境可以执行remove_passwd.sh脚本

##修改ruby的redis的password配置为以前的

vim /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb

nil改成[email protected]

4.2.4 回滚
 先设置免密码登陆(每个节点都要设置,可以写个脚本)

./redis-cli -h tbds-172-17-1-236 -a [email protected] config set masterauth "";
./redis-cli -h tbds-172-17-1-236 -a [email protected] config set requirepass "";

 登陆某一台redis机器,修改ruby的redis的password配置

vim /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb

Redis扩容及Slot Balance、Reshard_第14张图片

 查看目前redis中key,slot分配情况

./redis-trib.rb info tbds-10-255-1-10:6379
./redis-cli -c -h tbds-10-255-1-10  -p 6379 cluster nodes

Redis扩容及Slot Balance、Reshard_第15张图片
在这里插入图片描述
 在线搬迁
Redis扩容及Slot Balance、Reshard_第16张图片

Redis扩容及Slot Balance、Reshard_第17张图片

从终端上来看,是从10.255.1.4的迁移slot到10.255.1.10上
Redis扩容及Slot Balance、Reshard_第18张图片

 查看集群中slot

./redis-trib.rb info tbds-10-255-1-10:6379
./redis-cli -c -h tbds-10-255-1-10  -p 6379 cluster nodes

Redis扩容及Slot Balance、Reshard_第19张图片

 恢复以前的状态
将密码设置回来(每个节点都要设置,可以写个脚本)

./redis-cli -h tbds-172-17-1-236 -a [email protected] config set masterauth "[email protected] ";
./redis-cli -h tbds-172-17-1-236 -a [email protected] config set requirepass "[email protected] ";

修改ruby的redis的password配置为以前的

vim /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb

nil改成[email protected]

注明:生产环境中,rebalance完以后,如果要回滚,就要计算从新扩容的25台master分配一定的slot到以前的40台master中去,而且在线搬迁只支持一次搬迁到一个节点上,所有比较复杂,建议不要回滚。

你可能感兴趣的:(Redis)