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

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

一、单机伪集群版 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从

未完待续

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值