之前我们已经搭建好了redis集群,如果随着业务量并发的增长,需要实现动态扩容

(还是按照之前模拟搭建集群的方式,我们在同一台机器上,通过不同的端口来搭建成redis集群)

1、加入新master(扩容时总是先增加master,再增加slave)

mkdir -m 777 /usr/local/redis-cluster/redis07

然后在该路径下,我们可以把之前用过的redis文件完全拷贝一份,

拷贝过来,需要删除*.rdb,*.aof备份文件,和nodes.conf文件

(不然在添加到redis集群的时候会报错,[ERR] Node 172.16.22.97:7007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.)

顺便修改redis.conf如下

port 7007 (改端口,其他的我们在搭建集群之前已经改过一次了)

cluster-node-timeout 15000
daemonize    yes                            
pidfile        /var/run/redis_7007.pid                         
cluster-enabled yes
daemonize    yes                            
bind 172.16.22.97       
appendonly yes
logfile /var/log/redis/7007.log

下面的配置是否需要更改,视版本情况而定:

cluster-config-file /etc/redis-cluster/node-7007.conf
dir         /var/redis/7007        

 

然后运行在redis07路径下运行./redis-server redis.conf &,启动这个redis实例,

登录查看运行状态  ./redis-cli -c -h 172.16.22.97 -p 7007

info replication

这时候可以看见,新增的实例,默认就是一个master,没有slave节点

window redis扩充内存 redis内存扩容_Source

2、把redis实例添加到集群当中去

添加之前的node状态

./redis-trib.rb check 172.16.22.97:7001

window redis扩充内存 redis内存扩容_Source_02

添加:./redis-trib.rb add-node 172.16.22.97:7007 172.16.22.97:7001

./redis-trib.rb check 172.16.22.97:7001

window redis扩充内存 redis内存扩容_redis集群动态扩容_03

可以看到,多了一个master,但是没有slave,也没有分配slot(所以没有分配slot不能处理数据)

3、reshard一些数据过去

resharding的意思就是把一部分hash slot从旧的node上迁移到新的node上,均匀分配一些,根据计算,

因为一共16384个slot,要把之前3个master上,总共4096个hashslot迁移到新的第四个master上去

敲  ./redis-trib.rb reshard 172.16.22.97:7001

window redis扩充内存 redis内存扩容_redis集群_04

How many slots do you want to move (from 1 to 16384)?

4096

window redis扩充内存 redis内存扩容_redis_05

What is the receiving node ID?(新增redis实例的id)

0eb9c82afb54e1c826f25914acdac22611b74a80
Please enter all the source node IDs.(被分配出去,原master的id)
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:97de3a7c1da7f08a1b73e5d87d3e6ad184fb29c8
Source node #2:fcd59bb38c58358211b4faa1d5d618aa71d6f302
Source node #3:d9f44265e10ec0328150a26794d1b2b87c79587a

Source node #4:done
然后done,yes

window redis扩充内存 redis内存扩容_Source_06

迁移slot过程截图:

window redis扩充内存 redis内存扩容_redis集群_07

最后check一下,新增的master有4096个slot了:

window redis扩充内存 redis内存扩容_Source_08

 

4、为新增的mstaer,再增加一个slave节点:

类似,再新建一个目录,拷贝redis文件过去

mkdir -m 777 /usr/local/redis-cluster/redis08

然后在该路径下,我们可以把之前用过的redis文件完全拷贝一份,顺便修改redis.conf(参考步骤1)

然后运行在redis08路径下运行./redis-server redis.conf &,启动这个redis实例,

登录查看运行状态  ./redis-cli -c -h 172.16.22.97 -p 7008

info replication

(刚新增,默认还是一个master)

window redis扩充内存 redis内存扩容_window redis扩充内存_09

变成7007端口主机的slave(当然也可以扩容到其他master的slave):

window redis扩充内存 redis内存扩容_Source_10

再查看,7008成了7007的slave

window redis扩充内存 redis内存扩容_redis_11

 

备注,如果需要动态删除节点,操作方法相似。