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]
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
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
#登陆新添加的节点中的一个(比如想想让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
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数据目录
到portal目录中,将所有的redis机器的ip写入cluster.info中
./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-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 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。
通过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 cluster的slot分布
./redis-trib.rb info 10.255.1.10:6379
./redis-cli -c -h 10.255.1.10 -p 6379 cluster nodes
./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
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中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到10.255.1.10上
查看集群中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-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
注明:生产环境中,rebalance完以后,如果要回滚,就要计算从新扩容的25台master分配一定的slot到以前的40台master中去,而且在线搬迁只支持一次搬迁到一个节点上,所有比较复杂,建议不要回滚。