查看: 24|回复: 0

[Redis] Docker + Redis 部署集群的实现步骤

[复制链接]

0

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-1-8
发表于 2025-11-13 11:00:45 | 显示全部楼层 |阅读模式

一、环境准备

1. 服务器规划(3 台服务器)

服务器IP 地址角色运行 Redis 节点开放端口(防火墙)
server1192.168.1.100主节点 1 + 从节点 1redis-6379(主)、redis-6380(从)6379-6380(Redis 端口)、16379-16380(集群总线端口)
server2192.168.1.101主节点 2 + 从节点 2redis-6379(主)、redis-6380(从)同上
server3192.168.1.102主节点 3 + 从节点 3redis-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_statek 表示集群健康;
  • 节点列表中,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 集群,实现数据分片存储和自动故障转移,适合生产环境使用。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部