13、docker版 redis 3主3从集群扩缩容配置案例

本文详细介绍了如何在同一台机器的6个端口上使用Docker搭建Redis3主3从集群,包括关闭防火墙、创建Docker容器、构建集群关系、进行主从容错切换迁移、主从扩容和缩容的步骤。在扩容案例中,添加了两个新节点形成4主4从,并解释了槽号的重新分配。而在缩容案例中,展示了如何删除节点以恢复到3主3从的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单机伪集群版 3主3从(主要是熟悉操作)

接下来,我们要在同一台机子的6个端口上,搭建一套 Redis 3主3从集群。

 1、3主3从redis集群配置

(1)关闭防火墙+启动docker后台服务

关闭防火墙端口

firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
firewall-cmd --zone=public --add-port=6385/tcp --permanent
firewall-cmd --zone=public --add-port=6386/tcp --permanent
firewall-cmd --reload

启动 docker 后台服务

systemctl start docker  启动docker
systemctl enable docker 加入开机启动

(2)新建6个docker redis容器实例

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
 
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
 
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
 
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
 
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
 
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

docker run                          创建并运行docker容器实例

-d                                        后台启动

--name redis-node-1          给容器实例取别名

--net host                            使用宿主机的IP和端口,默认

--privileged=true                 获取宿主机root用户权限

-v /data/redis/share/redis-node-6:/data       容器卷,宿主机地址:docker内部地址

redis:6.0.8                          redis镜像和版本号

--cluster-enabled yes         开启redis集群

--appendonly yes               开启持久化

--port 6381                         redis端口号

 (3)进入容器redis-node-1并为6台机器构建集群关系

进入容器1

docker exec -it redis-node-1 /bin/bash

 构建主从关系

redis-cli --cluster create 本机IP:6381 本机IP:6382 本机IP:6383 本机IP:6384 本机IP:6385 本机IP:6386 --cluster-replicas 1

 --cluster-replicas 1 表示为每个master创建一个slave节点

-- cluster create 创建集群

 

 (4)链接进入6381作为切入点,查看集群状态

cluster info

(5) 链接进入6381作为切入点,查看节点状态

cluster nodes

 现在的拓扑图如下,由此看出,它的从机分配是随机的。跟我们在命令中写的顺序没啥关系。

2、主从容错切换迁移

(1)数据读写存储

进入容器1

 对6381新增几个key

k1 经过hash后的hash槽,是12606,它位于6383,当前是6381[0-5460],所以保存不进去

k4 经过hash后的hash槽,是8455,它位于6382,当前是6381[0-5460],所以保存不进去

 

 防止路由失效加参数-c并新增 k1、k4

 查看集群状态

redis-cli --cluster check host:port
check 检查集群
host 只要是集群中存在的主机IP都可以,不限制哪一台

 

(2)容错切换迁移

我们现在要实验的,就是63816386的主从切换。

 先停止主机6381

 查看集群信息

可以看到 6386 已经变为 master

 拓扑图如下:

 

 数据可以正常读写

 

 启动6381

 可以看到 6381 变为了从机,6386 依然还是主机

 拓扑图如下:

还原初始的3主3从

停掉 6386

 6381 重新变为主机

 再启 6386

 6386 重新变为 6381 的从机

 拓扑图如下:

  查看集群状态

 跟开始时一模一样

3、主从扩容案例

现在,我们已恢复到最初的3主3从。我们准备再加两台机器,6387和6388,组成4主4从。

 (1)新建6387、6388两个节点+查看是否8节点

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

 拓扑图如下:

 (2)进入6387容器实例内部

docker exec -it redis-node-7 /bin/bash

(3)将新增的6387节点(空槽号)作为master节点加入原集群

redis-cli --cluster add-node 本机IP:6387 本机IP:6381
add-node new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
将新增的6387作为master节点加入集群
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

 (4)检查集群情况第1次

redis-cli --cluster check 本机IP:6381

 

 拓扑图如下:

(5)重新分派槽号

redis-cli --cluster reshard 本机IP:6381

reshard  host:port

对集群重新分派槽号

 all 所有的节点匀一部分槽位给新加入的 master

 (6) 检查集群情况第2次

 槽号分派说明

为什么6387是3个新的区间,以前的还是连续?
重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387,总计4096个槽位

 拓扑图如下:

 (7)为主节点6387分配从节点6388

redis-cli --cluster add-node 本机IP:新slave端口 本机IP:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

 add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点

                 --cluster-slave #新节点作为从节点,默认随机一个主节点

                 --cluster-master-id <arg> #给新节点指定主节点

 (8) 检查集群情况第3次

 拓扑图如下:

4、主从缩容案例

现在,我们要删除6387和6388,恢复3主3从。

 (1) 检查集群情况第1次获得6388的节点ID

(2)从集群中将4号从节点6388删除

redis-cli --cluster del-node 本机IP:从机端口 从机6388节点ID

 --cluster del-node host:port node_id    #删除给定的一个节点,成功后关闭该节点服务

 (3) 将6387的槽号清空,重新分配

我们把6387的[0-1364]槽位还给6381

 

 

 source node id 可以输多个,done 表示已经输入完毕。 

 

 我们把6387的[6827-10922]槽位还给6382

 

 

 

 我们把6387的[10923-12287]槽位还给6383

 

 

 (4)将6387删除

redis-cli --cluster del-node ip:6387 6387节点ID

 (5)检查集群情况第2次

已恢复为原来3主3从的状态

 

 5、附redis-cli --cluster 参数说明

redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN   #创建集群
                 --cluster-replicas <arg>      #从节点个数
  check          host:port                     #检查集群
                 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
  info           host:port                     #查看集群状态
  fix            host:port                     #修复集群
                 --cluster-search-multiple-owners #修复槽的重复分配问题
  reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                 --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                 --cluster-yes                 #指定迁移时的确认输入
                 --cluster-timeout <arg>       #设置migrate命令的超时时间
                 --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                 --cluster-replace             #是否直接replace到目标节点
  rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                 --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                 --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                 --cluster-timeout <arg>                        #设置migrate命令的超时时间
                 --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                 --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                 --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                 --cluster-replace                              #是否直接replace到目标节点
  add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                 --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                 --cluster-master-id <arg>                      #给新节点指定主节点
  del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
  call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
  set-timeout    host:port milliseconds                         #设置cluster-node-timeout
  import         host:port                                      #将外部redis数据导入集群
                 --cluster-from <arg>                           #将指定实例的数据导入到集群
                 --cluster-copy                                 #migrate时指定copy
                 --cluster-replace                              #migrate时指定replace
  help           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

二、阿里云实战版 3主3从

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值