一、环境准备
1. 服务器规划(3 台服务器)
| 服务器 | ip 地址 | 角色 | 运行 redis 节点 | 开放端口(防火墙) |
|---|---|---|---|---|
| server1 | 192.168.1.100 | 主节点 1 + 从节点 1 | redis-6379(主)、redis-6380(从) | 6379-6380(redis 端口)、16379-16380(集群总线端口) |
| server2 | 192.168.1.101 | 主节点 2 + 从节点 2 | redis-6379(主)、redis-6380(从) | 同上 |
| server3 | 192.168.1.102 | 主节点 3 + 从节点 3 | redis-6379(主)、redis-6380(从) | 同上 |
- 端口说明:redis 集群需开放 服务端口(如 6379)和 集群总线端口(服务端口 + 10000,如 16379),总线端口用于节点间通信。
2. 防火墙配置(三台服务器均执行)
# 开放 redis 服务端口和集群总线端口 sudo firewall-cmd --permanent --add-port=6379-6380/tcp sudo firewall-cmd --permanent --add-port=16379-16380/tcp sudo firewall-cmd --reload
3. 安装 docker 并配置跨主机通信
三台服务器均需安装 docker,并确保彼此网络互通(可 ping 通对方 ip)。无需额外创建 docker 网络,直接通过 主机 ip + 端口 实现跨服务器节点通信。
二、部署 redis 节点(每台服务器部署 2 个节点)
1. 在 server1(192.168.1.100)部署节点
# 创建数据目录(持久化用)
mkdir -p /data/redis/{6379,6380} && chmod 777 -r /data/redis
# 启动主节点(6379)
docker run -d \
--name redis-6379 \
--net host \ # 使用主机网络,避免端口映射问题(推荐集群模式)
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \ # 开启集群模式
--cluster-config-file nodes-6379.conf \ # 集群配置文件
--cluster-node-timeout 5000 \ # 节点超时时间(毫秒)
--appendonly yes \ # 开启 aof 持久化
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \ # 密码(所有节点必须一致)
--masterauth "d83544e45ca39c7653bf21612fad0fd1" # 主从同步密码(与 requirepass 一致)
# 启动从节点(6380,后续会被分配到其他主节点)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \
--masterauth "d83544e45ca39c7653bf21612fad0fd1"
2. 在 server2(192.168.1.101)部署节点
# 创建数据目录
mkdir -p /data/redis/{6379,6380} && chmod 777 -r /data/redis
# 启动主节点(6379)
docker run -d \
--name redis-6379 \
--net host \
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \
--cluster-config-file nodes-6379.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \
--masterauth "d83544e45ca39c7653bf21612fad0fd1"
# 启动从节点(6380)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \
--masterauth "d83544e45ca39c7653bf21612fad0fd1"
3. 在 server3(192.168.1.102)部署节点
# 创建数据目录
mkdir -p /data/redis/{6379,6380} && chmod 777 -r /data/redis
# 启动主节点(6379)
docker run -d \
--name redis-6379 \
--net host \
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \
--cluster-config-file nodes-6379.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \
--masterauth "d83544e45ca39c7653bf21612fad0fd1"
# 启动从节点(6380)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "d83544e45ca39c7653bf21612fad0fd1" \
--masterauth "d83544e45ca39c7653bf21612fad0fd1"
三、创建 redis 集群(关键步骤)
在任意一台服务器(如 server1)执行集群创建命令,将 6 个节点(3 主 3 从)加入集群:
1. 进入 server1 的任意 redis 容器(如 redis-6379)
bash
docker exec -it redis-6379 sh
2. 执行集群创建命令
# 格式:redis-cli --cluster create 节点1:端口 节点2:端口 ... --cluster-replicas 1 --password 密码 redis-cli -a d83544e45ca39c7653bf21612fad0fd1 \ --cluster create \ 192.168.1.100:6379 \ 192.168.1.101:6379 \ 192.168.1.102:6379 \ 192.168.1.100:6380 \ 192.168.1.101:6380 \ 192.168.1.102:6380 \ --cluster-replicas 1 # 每个主节点对应 1 个从节点
- 参数说明:
--cluster-replicas 1表示 “1 个主节点对应 1 个从节点”,6 个节点将自动分配为 3 主 3 从。前 3 个节点默认作为主节点,后 3 个作为从节点(自动关联到主节点)。
3. 确认集群配置
执行命令后,会显示节点分配方案,输入 yes 确认:
>>> performing hash slots allocation on 6 nodes... master[0] -> slots 0-5460 master[1] -> slots 5461-10922 master[2] -> slots 10923-16383 adding replica 192.168.1.101:6380 to 192.168.1.100:6379 adding replica 192.168.1.102:6380 to 192.168.1.101:6379 adding replica 192.168.1.100:6380 to 192.168.1.102:6379 >>> trying to optimize slaves allocation for anti-affinity ... do you want to proceed with the proposed configuration? (type 'yes' to accept): yes
四、验证集群状态
1. 查看集群信息
在任意节点容器内执行(需带密码):
# 连接集群(-c 表示集群模式) redis-cli -c -h 192.168.1.100 -p 6379 -a d83544e45ca39c7653bf21612fad0fd1 # 查看集群状态 cluster info # 查看节点列表(角色、id、 slots 等) cluster nodes
- 正常输出中,
cluster_state:ok表示集群健康; - 节点列表中,
master标识主节点,slave标识从节点,并显示对应主节点的 id。
2. 测试数据读写与分片
# 在集群模式下设置 key(会自动路由到对应主节点) set test-key "hello redis cluster" # 获取 key(自动路由) get test-key # 查看 key 所在的槽位和节点 cluster keyslot test-key
五、高可用测试(主节点故障转移)
模拟主节点故障:在 server1 停止主节点容器(6379):
docker stop redis-6379
观察从节点是否自动升级为主节点:在任意节点容器内执行 cluster nodes,查看原 server1:6380(从节点)是否变为 master。
恢复故障节点:重启 server1 的 6379 容器,它会自动作为从节点加入集群:
docker start redis-6379
六、关键配置说明
--net host的作用:使用主机网络模式,避免 docker 端口映射的复杂配置,使 redis 节点直接通过服务器 ip + 端口通信(集群必须)。- 密码一致性:所有节点的
requirepass(访问密码)和masterauth(主从同步密码)必须相同,否则从节点无法同步主节点数据。 - 持久化:通过
-v /data/redis/6379:/data挂载数据目录,确保 redis 数据持久化(重启容器不丢失数据)。 - 集群总线端口:必须开放
端口 + 10000(如 6379 对应 16379),用于节点间的心跳检测和数据同步。
七、常见问题解决
- 集群创建失败:检查所有节点是否启动、端口是否开放、服务器间是否互通,以及密码是否一致。
- 从节点无法同步主节点:确认
masterauth与主节点requirepass一致,且主节点防火墙未拦截从节点的同步请求。 - 节点重启后脱离集群:确保数据目录挂载正确(
/data/redis/端口),集群配置文件(nodes-端口.conf)会保存在挂载目录,重启后自动加载。
通过以上步骤,可在三台服务器上部署一个高可用的 redis 集群,实现数据分片存储和自动故障转移,适合生产环境使用。
到此这篇关于docker + redis 部署集群的实现步骤的文章就介绍到这了,更多相关docker redis 部署集群内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论