扩容操作
扩容是分布式存储最常见的需求,Redis 集群扩容操作可分为如下步骤:
1)准备新节点。
2)将节点加入集群。
3)迁移槽和数据。
4)配置迁入节点主从关系
1.在宿主机上执行docker命令创建容器
查看网卡:
创建redis-master4:
[root@localhost docker-compose-redis-trib]# docker run -itd --name redis-master4 -v $PWD/config:/config --net dockercomposeredistrib_redis-master -e PORT=6397 -p 6397:6397 -p 16379:16379 --ip 172.50.0.5 rediscluster
创建redis-slave4:
[root@localhost docker-compose-redis-trib]# docker run -itd --name redis-slave4 -v $PWD/config:/config --net dockercomposeredistrib_redis-slave -e PORT=6398 -p 6398:6398 -p 16398:16398 --ip 172.30.0.5 rediscluster
2.执行将节点加入集群:
demo:
通过redis-trib.rb add-node 127.0.0.1:6397 127.0.0.1:6391 实现节点添加
要加入的节点 集群中的节点
启动redis-master4,redis-slave4节点:
#启动redis-master4节点
[root@localhost docker-compose-redis-trib]# docker exec -it redis-master4 bash
[root@755c6dd3bd4b /]# redis.sh &
[1] 60
#启动redis-slave4节点
[root@localhost docker-compose-redis-trib]# docker exec -it redis-slave4 bash
[root@67413d44fcff /]# redis.sh &
[1] 25
执行节点加入集群
#将6397加入集群
[root@localhost docker-compose-redis-trib]# docker exec -it redis-master4 bash
[root@755c6dd3bd4b /]# redis-trib.rb add-node 192.168.11.43:6397 192.168.11.43:63
bash: /usr/bin/redis-trib.rb: Permission denied
[root@755c6dd3bd4b /]# chmod +x /usr/bin/redis-trib.rb
[root@755c6dd3bd4b /]# redis-trib.rb add-node 192.168.11.43:6397 192.168.11.43:6391
#将6398加入节点
[root@755c6dd3bd4b /]# redis-trib.rb add-node 192.168.11.43:6398 192.168.11.43:6391
3.迁移槽和数据(集群共有16384个槽)
加入集群后需要为新节点迁移槽和相关数据,槽在迁移过程中集群可以正常提供读写服务,迁移过程是集群扩容最核心的环节,下面详细讲解。
槽是 Redis 集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定原有节点的哪些槽需要迁移到新节点。
迁移计划需要确保每个节点负责相似数量的槽,从而保证各节点的数据均匀,比如之前是三个节点,现在是四个节点,把节点槽分布在四个节点上。
数据迁移过程是逐个槽进行的
流程说明:
1)对目标节点发送导入命令,让目标节点准备导入槽的数据。
2)对源节点发送导出命令,让源节点准备迁出槽的数据。
3)源节点循环执行迁移命令,将槽跟数据迁移到目标节点。
目标节点:需要迁入槽的节点
源节点:迁出槽的节点
方式1:
1>输入迁移操作的集群
[root@755c6dd3bd4b /]# redis-trib.rb reshard 192.168.11.43:6391
2>需要分配多少个槽(16384/4=4096)
How many slots do you want to move (from 1 to 16384)? 4096
3>输入某个节点的节点 ID 作为目标节点,目标节点只能指定一个:[目标节点指的是需要添加槽的节点]
What is the receiving node ID? e166acc99589ace1cbcdc8893cdf865bd26d07d0(此处是6397的节点id)
4>输入需要分配出槽的节点ID(/var/lib/redis查看配置文件或用于唯一标识集群内一个节点ID)
Please enter all the source node IDs.
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:751fb8bd165a5e3ad1f01ef8f1c31de2f6caf898 (6391节点)
Source node #2:e21cf577d264a5e2be0bef074dd2f41a86825f78 (6392节点)
Source node #3:cc2c0d640a51aff85dcc49e9d74a6d9201d42cb4 (6393节点)
5>输入yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes
[root@755c6dd3bd4b /]# redis-cli -p 6397
127.0.0.1:6397> cluster nodes
751fb8bd165a5e3ad1f01ef8f1c31de2f6caf898 172.50.0.1:6391@16391 master - 0 1576057148806 1 connected 1365-5460
cc2c0d640a51aff85dcc49e9d74a6d9201d42cb4 172.50.0.1:6393@16393 master - 0 1576057148000 3 connected 12288-16383
6bc2bf1dcdafc966635db3ca6126544891aa41d6 172.50.0.1:6398@16398 master - 0 1576057146000 7 connected
50408afe0aafca3c87293b5f264ffdadcf0ee982 172.50.0.1:6394@16394 slave 751fb8bd165a5e3ad1f01ef8f1c31de2f6caf898 0 1576057149813 1 connected
e166acc99589ace1cbcdc8893cdf865bd26d07d0 172.50.0.5:6397@16397 myself,master - 0 1576057144000 8 connected 0-1364 5461-6826 10923-12287
c7d63f558a88155d2698cff06a8a9de69c8d7100 172.50.0.1:6395@16395 slave e21cf577d264a5e2be0bef074dd2f41a86825f78 0 1576057146000 2 connected
6e2b71c31d92e127bed497ee2afd8a426fabf3c8 172.50.0.1:6396@16396 slave cc2c0d640a51aff85dcc49e9d74a6d9201d42cb4 0 1576057147794 3 connected
e21cf577d264a5e2be0bef074dd2f41a86825f78 172.50.0.1:6392@16392 master - 0 1576057146000 2 connected 6827-10922
截图:
方式2:一步执行
redis-trib.rb reshard host:port --from --to --slots --yes --timeout --pipeline
参数说明:
·host:port:必传参数,集群内任意节点地址,用来获取整个集群信息。
·–from:制定源节点的 id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。
·–to:需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。
·–slots:需要迁移槽的总数量,在迁移过程中提示用户输入。
·–yes:当打印出 reshard 执行计划时,是否需要用户输入yes确认后再执行 reshard。
·–timeout:控制每次 migrate 操作的超时时间,默认为60000毫秒。
·–pipeline:控制每次批量迁移键的数量,默认为10。
[root@755c6dd3bd4b /]# redis-trib.rb reshard 192.168.11.43:6391 --from 751fb8bd165a5e3ad1f01ef8f1c31de2f6caf898,e21cf577d264a5e2be0bef074dd2f41a86825f78,cc2c0d640a51aff85dcc49e9d74a6d9201d42cb4 --to e166acc99589ace1cbcdc8893cdf865bd26d07d0 --yes
(该命令就会执行操的迁移)
4.迁移好槽之后需要分配从节点
扩容之初我们把6397、6398节点加入到集群,节点6397迁移了部分槽和数据作为主节点,
但相比其他主节点目前还没有从节点,因此该节点不具备故障转移的能力。
这时需要把节点6398作为6397的从节点,从而保证整个集群的高可用。使用 cluster replicate{masterNodeId}命令为主节点添加对应从节点
进入redis-slave4节点(将192.168.11.43:6398设置成从节点):
[root@localhost docker-compose-redis-trib]# docker exec -it redis-slave4 bash
[root@67413d44fcff /]# redis-cli -p 6398
127.0.0.1:6398> cluster replicate e166acc99589ace1cbcdc8893cdf865bd26d07d0 (6397的节点id)
OK