Redis集群动态扩容

男娘i 2023-07-24 08:58 9阅读 0赞

之前我们已经搭建好了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节点

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70

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

添加之前的node状态

./redis-trib.rb check 172.16.22.97:7001

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 1

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

./redis-trib.rb check 172.16.22.97:7001

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 2

可以看到,多了一个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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 3

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

4096

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 4

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 5

迁移slot过程截图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 6

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 7

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)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 8

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 9

再查看,7008成了7007的slave

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlanVzdGRvaXQ_size_16_color_FFFFFF_t_70 10

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

发表评论

表情:
评论列表 (有 0 条评论,9人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis动态扩容

    之前我们已经搭建好了redis集群,如果随着业务量并发的增长,需要实现动态扩容 (还是按照之前模拟搭建集群的方式,我们在同一台机器上,通过不同的端口来搭建成redis集群)

    相关 redis 扩容方案

    team中的一个同学在其项目中使用了Redis作为缓存,将热点数据存放在Redis中。为了提升性能,写Redis时采用了管道的方式,平时使用时,Redis的性能、资源使用都能符

    相关 redis扩容

    导读: a) 此文不介绍集群的部署 b) 扩容有两种方式,一种是纵向扩容:修改maxmemory,一种是横向扩容:增加节点。这里只介绍横向扩容 c) 此文利用r