Linux:docker搭建redis集群(3主3从&扩容缩容 哈希槽分配)

操作系统:centos7

docker-ce版本:24.0.7


1.准备redis镜像

我这里使用redis 6.0.8 镜像进行操作,如果你也需要镜像,在网络正常情况下直接使用

复制代码
docker pull redis:6.0.8

即可进行下载,如果你没配置国内加速器,他默认是找国外官网下载的,可能会导致下载各种失败,可以多试几次


2.生成6个容器

复制代码
docker run -d --name redis-node-1 --net host --privileged=true -v /redis/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 /redis/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 /redis/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 /redis/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 /redis/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 /redis/redis-node-6:/data redis:6.0.8 --cluster-enabled yes  --appendonly yes --port 6386

run -d 后台运行

--name 生成镜像的名称为*

--net host 网络连接的方式

--privileged=true 给予容器卷权限

-v /redis/redis-node-*:/data 容器卷

--cluster-enabled yes 开启集群模式

--appendonly yes 开启持久化

--port 使用的端口


3.生成集群

复制代码
docker exec -it redis-node-1 /bin/bash

随便进入一个容器

复制代码
redis-cli --cluster create 192.168.6.7:6381 192.168.6.7:6382 192.168.6.7:6383 192.168.6.7:6384 192.168.6.7:6385 192.168.6.7:6386 --cluster-replicas 1

这里的ip 都是 服务器ip:端口号 把这些服务器ip全写上他自动就会分配主从

并且可以看到对应的服务器主从信息

1 主 5 从

2 主 6 从

3 主 4 从


4.进入集群

随便一个容器内 都可以使用

复制代码
redis-cli -p 6381 -c

-p是选择端口号

-c 优化路由


5.查看集群信息

在redis里面可以用

复制代码
CLUSTER info
复制代码
CLUSTER NODES

在这里通过看从服务器后面的编码可以判断主服务器的从是谁 谁是主服务器的从

在redis外

复制代码
redis-cli --cluster check 192.168.6.7:6381

也是可以非常详细的看到


6.集群容错迁移

1 主 5 从

2 主 6 从

3 主 4 从

每个人的情况可能都会有所不同,这是正常的,在查看集群信息里,从服务器后面有串数值,对应的就是主服务器的数值

要求是主服务器挂了的时候从服务器必须要顶替上去

现在把node1关掉 看看5是否可以顶上

这是没关前的

关了之后可以看到原来5是从现在变成主了

当我们在开启node1 后 node1 会先变成从的,并不会在启动的一瞬间抢夺主 从而在间隙间造成数据丢失,相同你把node4关闭再重启他也会再给node1让位的


7.主从扩容

假如现在我们的3主3从顶不住了,我们又想加两个6387 和 6388 并且精准的控制6387为主 6388为从 这个样就达到了一个集群扩容的效果
但是3个主从就已经把hash槽都占满了呀,所以我们还要进行槽位分配
再新建2个容器

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

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

现在创建好两个容器后再去分配槽位

现在进到node1里面

复制代码
docker exec -it redis-node-7 /bin/bash

先让他以空槽的形式进入到群集里

复制代码
redis-cli --cluster add-node 192.168.6.7:6387 192.168.6.7:6381

这个你可以理解为6387就跟随6381的帮派了

可以看到现在新进来的6387还没槽位

现在开始分配槽位

复制代码
redis-cli rehash 192.168.6.7:6381

4096是平均分配多少个槽位

all

等到分配完成即可

可以看到成功分配了,前三家分给了第四个主服务器了一些槽位

现在新主服务器就成功添加了

再给6387添加一个从的6388

让6388成为6387的从服务器

复制代码
redis-cli --cluster add-node 192.168.6.7:6388 192.168.6.7:6387 --cluster-slave --cluster-master-id eed172eddb305a5a6ee6c346020dd843b068b429

这的是6388就成为6387的从服务器了,后面的hash值为6387主服务器的值

成功挂到6387下变成他的从服务器


8.主从缩容

现在反向操作 有扩就有缩,只需要删掉6388 和 6387

先删从

清出来的槽号再还回去

再删主

这个是当前的4主4从

现在先删从的让后重新分配槽号 ,再删主的

复制代码
redis-cli --cluster del-node 192.168.6.7:6388 2d7e1b164db74ab85a428e11b4335ed0e43d2f89

后面这里值为6388的值

可以看到从服务器就被删掉了

复制代码
redis-cli --cluster reshard 192.168.6.7:6381

只是通过这个6381去操作整个集群,实际上你可以任选一台都行

现在6387 槽位就被分配到6375了,我这里只是为了方便,实际上你可以一点一点的分这个槽位

分配完之后就可以去删除这个节点了

复制代码
redis-cli --cluster del-node 192.168.6.7:6387 eed172eddb305a5a6ee6c346020dd843b068b429

这样就可以正常删除了

这样就变回3主3从了

这样就成功的配置全过程了

相关推荐
我爱云计算17 小时前
K8S详解(5万字详细教程)
linux·运维·云原生·容器·kubernetes
帝国辉耀117 小时前
docker、docker daemon、k8s、dockershim、containerd之间的关系
docker·容器·kubernetes
明明跟你说过17 小时前
【k8s】资源限制管理:Namespace、Deployment与Pod的实践
运维·docker·云原生·容器·kubernetes·k8s
2301_7943339119 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
JCGKS20 小时前
Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决
docker·ssh·端口·listen·tcp三次握手
荣光波比20 小时前
Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
linux·运维·服务器·nginx·云计算
惜.己20 小时前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
scugxl21 小时前
centos7 docker离线安装
运维·docker·容器
绿箭柠檬茶1 天前
Ubuntu 使用 Samba 共享文件夹
linux·运维·ubuntu
计算机小手1 天前
AI 驱动数据分析:开源 SQLBot 项目探索,基于大模型和 RAG 实现精准问数与图表挖掘
经验分享·docker·开源软件