本文基于 “3 台独立 Linux 宿主机” 部署架构,每台宿主机运行 2 个 Redis 容器(1 主 1 从)+1 个哨兵容器,实现跨机器高可用集群。所有操作按 “宿主机 A、宿主机 B、宿主机 C” 分别标注,确保步骤清晰可复现。
一、环境规划(核心前提)
1. 机器与角色分配
| 宿主机 | IP 地址(示例) | 运行容器角色 | 端口映射(宿主机端口:容器端口) |
|---|---|---|---|
| 宿主机 A | 192.168.1.100 | Redis-master1、Redis-slave3、Sentinel1 | 6381:6379、6384:6379、26379:26379 |
| 宿主机 B | 192.168.1.101 | Redis-master2、Redis-slave1、Sentinel2 | 6382:6379、6385:6379、26380:26379 |
| 宿主机 C | 192.168.1.102 | Redis-master3、Redis-slave2、Sentinel3 | 6383:6379、6386:6379、26381:26379 |
2. 基础环境要求
- 3 台宿主机均为 Linux 系统(如 CentOS 7/8、Ubuntu 20.04),且网络互通(关闭防火墙或开放必要端口)。
- 3 台宿主机均已安装 Docker(若未安装,需先执行 Docker 安装命令)。
二、基础环境初始化(3 台宿主机均需执行)
1. 安装 Docker(若未安装)
bash
# 1. 卸载旧版本(如有)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2. 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置Docker镜像源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装Docker并启动
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker && systemctl enable docker
# 5. 验证Docker安装成功
docker --version # 输出Docker版本即正常
2. 关闭防火墙与 SELinux(避免端口拦截)
bash
# 1. 关闭并禁用防火墙
systemctl stop firewalld && systemctl disable firewalld
# 2. 关闭SELinux(CentOS系统)
setenforce 0 # 临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭
也可以选择如下方式
# 1. 启动FirewallD(若未启动)
systemctl start firewalld
# 2. 开放当前主机的Redis端口(永久生效)
# 192.168.1.100主机开放6381、6384
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
# 192.168.1.101主机开放6382、6385
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=6385/tcp --permanent
# 192.168.1.102主机开放6383、6386
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6386/tcp --permanent
# 3. 重新加载FirewallD使配置生效
firewall-cmd --reload
# 4. (可选)临时关闭SELinux(避免CentOS/RHEL的安全限制)
setenforce 0
3. 拉取 Redis 5.0 镜像
bash
docker pull redis:5.0 # 选择5.0版本,适配集群与哨兵功能
docker images | grep redis # 验证镜像拉取成功
4. 创建数据存储目录(用于挂载容器数据卷)
bash
# 创建Redis节点目录(按当前宿主机角色创建对应目录,参考环境规划)
# 宿主机A:创建master1、slave3目录
mkdir -p /data/redis/{master1,slave3}
# 宿主机B:创建master2、slave1目录
mkdir -p /data/redis/{master2,slave1}
# 宿主机C:创建master3、slave2目录
mkdir -p /data/redis/{master3,slave2}
# 创建哨兵目录(3台宿主机均需创建)
mkdir -p /data/redis/sentinel
操作范围:以上 4 步需在宿主机 A、宿主机 B、宿主机 C分别执行,每台机器按自身角色创建对应目录。
三、启动 Redis 容器(按宿主机角色分别执行)
1. 宿主机 A:启动 Redis-master1、Redis-slave3
bash
# 1. 启动主节点 redis-master1(端口6381,集群模式)
docker run -d \
--name redis-master1 \
--net=host \ # 复用宿主机网络,解决跨主机通信
redis:5.0 \
redis-server \
--bind 0.0.0.0 \ # 允许所有IP访问
--port 6381 \ # 对应规划端口
--protected-mode no \ # 关闭保护模式,允许远程连接
--cluster-enabled yes \ # 启用集群模式
--cluster-config-file nodes-6381.conf \ # 集群配置文件(自动生成)
--cluster-node-timeout 5000 # 节点超时时间(毫秒)
# 2. 启动从节点 redis-slave3(端口6384,集群模式)
docker run -d \
--name redis-slave3 \
--net=host \
redis:5.0 \
redis-server \
--bind 0.0.0.0 \
--port 6384 \
--protected-mode no \
--cluster-enabled yes \
--cluster-config-file nodes-6384.conf \
--cluster-node-timeout 5000
2. 宿主机 B:启动 Redis-master2、Redis-slave1
bash
# 1. 启动主节点 redis-master2(端口6382,集群模式)
docker run -d \
--name redis-master2 \
--net=host \
redis:5.0 \
redis-server \
--bind 0.0.0.0 \
--port 6382 \
--protected-mode no \
--cluster-enabled yes \
--cluster-config-file nodes-6382.conf \
--cluster-node-timeout 5000
# 2. 启动从节点 redis-slave1(端口6385,集群模式)
docker run -d \
--name redis-slave1 \
--net=host \
redis:5.0 \
redis-server \
--bind 0.0.0.0 \
--port 6385 \
--protected-mode no \
--cluster-enabled yes \
--cluster-config-file nodes-6385.conf \
--cluster-node-timeout 5000
3. 宿主机 C:启动 Redis-master3、Redis-slave2
bash
# 1. 启动主节点 redis-master3(端口6383,集群模式)
docker run -d \
--name redis-master3 \
--net=host \
redis:5.0 \
redis-server \
--bind 0.0.0.0 \
--port 6383 \
--protected-mode no \
--cluster-enabled yes \
--cluster-config-file nodes-6383.conf \
--cluster-node-timeout 5000
# 2. 启动从节点 redis-slave2(端口6386,集群模式)
docker run -d \
--name redis-slave2 \
--net=host \
redis:5.0 \
redis-server \
--bind 0.0.0.0 \
--port 6386 \
--protected-mode no \
--cluster-enabled yes \
--cluster-config-file nodes-6386.conf \
--cluster-node-timeout 5000
4. 验证 Redis 容器状态(3 台宿主机均需执行)
bash
docker ps | grep redis # 确保当前宿主机的2个Redis容器STATUS均为Up
操作范围:第 1-3 步需在对应宿主机执行(A 启动 A 的容器,B 启动 B 的容器);第 4 步需在 3 台宿主机分别验证自身容器状态。
四、创建 Redis 三主三从集群(仅在 1 台宿主机执行,推荐宿主机 A)
集群创建需使用 “宿主机 IP + 容器映射端口”(跨机器通信需用宿主机 IP,而非容器内网 IP),仅需在任意 1 台宿主机执行 1 次,配置会自动同步到所有节点。
1. 进入宿主机 A 的任意 Redis 容器(如 redis-master1)
bash
docker exec -it redis-master1 /bin/bash
2. 执行集群创建命令(替换为实际宿主机 IP 和端口)
bash
redis-cli --cluster create \
192.168.1.100:6381 # 宿主机A-master1 \
192.168.1.101:6382 # 宿主机B-master2 \
192.168.1.102:6383 # 宿主机C-master3 \
192.168.1.101:6385 # 宿主机B-slave1(对应master1) \
192.168.1.102:6386 # 宿主机C-slave2(对应master2) \
192.168.1.100:6384 # 宿主机A-slave3(对应master3) \
--cluster-replicas 1 # 1主1从配置
3. 确认集群配置
执行后系统会自动分配主从关系和哈希槽(16384 个槽分 3 主节点),输入yes确认,最终提示[OK] ALL 16384 slots covered表示集群创建成功。
4. 验证集群状态(3 台宿主机均需执行,任选自身 1 个 Redis 容器)
以宿主机 A 为例:
bash
# 进入redis-master1容器,集群模式连接
docker exec -it redis-master1 redis-cli -c
# 查看集群节点信息(确认3主3从,且从节点对应正确主节点)
cluster nodes
# 测试数据读写(自动路由到对应主节点)
set test_key "cross_host_cluster"
get test_key # 应返回"cross_host_cluster"
操作范围:第 1-3 步仅需在宿主机 A执行;第 4 步需在宿主机 A、B、C分别验证自身 Redis 节点的集群状态,确保主从关系正确。
五、部署 Redis 三哨兵(3 台宿主机均需执行,按角色配置)
哨兵需监控 Redis 主节点,且 3 个哨兵需互通,配置文件需指定 “所有主节点 IP + 端口” 和 “哨兵通信端口”。
1. 宿主机 A:创建 Sentinel1 配置文件并启动容器
bash
# 1. 创建哨兵配置文件(/data/redis/sentinel/sentinel1.conf)
cat > /data/redis/sentinel/sentinel1.conf << EOF
port 26379 # 哨兵端口(宿主机A映射26379)
# 监控3个Redis主节点(mymaster1/2/3为自定义名称,IP和端口对应3台宿主机的主节点)
sentinel monitor mymaster1 192.168.1.100 6381 2
sentinel monitor mymaster2 192.168.1.101 6382 2
sentinel monitor mymaster3 192.168.1.102 6383 2
# 30秒未响应视为宕机
sentinel down-after-milliseconds mymaster1 30000
sentinel down-after-milliseconds mymaster2 30000
sentinel down-after-milliseconds mymaster3 30000
# 故障转移时最多1个从节点同步
sentinel parallel-syncs mymaster1 1
sentinel parallel-syncs mymaster2 1
sentinel parallel-syncs mymaster3 1
# 故障转移超时时间(180秒)
sentinel failover-timeout mymaster1 180000
sentinel failover-timeout mymaster2 180000
sentinel failover-timeout mymaster3 180000
EOF
# 2. 启动Sentinel1容器
docker run -d --name redis-sentinel1 -v /data/redis/sentinel/sentinel1.conf:/etc/redis/sentinel.conf -p 26379:26379 redis:5.0 redis-sentinel /etc/redis/sentinel.conf
2. 宿主机 B:创建 Sentinel2 配置文件并启动容器
bash
# 1. 创建哨兵配置文件(/data/redis/sentinel/sentinel2.conf)
cat > /data/redis/sentinel/sentinel2.conf << EOF
port 26379 # 容器内端口固定26379,宿主机映射26380
sentinel monitor mymaster1 192.168.1.100 6381 2
sentinel monitor mymaster2 192.168.1.101 6382 2
sentinel monitor mymaster3 192.168.1.102 6383 2
sentinel down-after-milliseconds mymaster1 30000
sentinel down-after-milliseconds mymaster2 30000
sentinel down-after-milliseconds mymaster3 30000
sentinel parallel-syncs mymaster1 1
sentinel parallel-syncs mymaster2 1
sentinel parallel-syncs mymaster3 1
sentinel failover-timeout mymaster1 180000
sentinel failover-timeout mymaster2 180000
sentinel failover-timeout mymaster3 180000
EOF
# 2. 启动Sentinel2容器
docker run -d --name redis-sentinel2 -v /data/redis/sentinel/sentinel2.conf:/etc/redis/sentinel.conf -p 26380:26379 redis:5.0 redis-sentinel /etc/redis/sentinel.conf
3. 宿主机 C:创建 Sentinel3 配置文件并启动容器
bash
# 1. 创建哨兵配置文件(/data/redis/sentinel/sentinel3.conf)
cat > /data/redis/sentinel/sentinel3.conf << EOF
port 26379 # 容器内端口固定26379,宿主机映射26381
sentinel monitor mymaster1 192.168.1.100 6381 2
sentinel monitor mymaster2 192.168.1.101 6382 2
sentinel monitor mymaster3 192.168.1.102 6383 2
sentinel down-after-milliseconds mymaster1 30000
sentinel down-after-milliseconds mymaster2 30000
sentinel down-after-milliseconds mymaster3 30000
sentinel parallel-syncs mymaster1 1
sentinel parallel-syncs mymaster2 1
sentinel parallel-syncs mymaster3 1
sentinel failover-timeout mymaster1 180000
sentinel failover-timeout mymaster2 180000
sentinel failover-timeout mymaster3 180000
EOF
# 2. 启动Sentinel3容器
docker run -d --name redis-sentinel3 -v /data/redis/sentinel/sentinel3.conf:/etc/redis/sentinel.conf -p 26381:26379 redis:5.0 redis-sentinel /etc/redis/sentinel.conf
4. 验证哨兵状态(3 台宿主机均需执行,任选自身哨兵容器)
以宿主机 A 为例:
bash
# 进入Sentinel1容器,连接哨兵客户端
docker exec -it redis-sentinel1 redis-cli -p 26379
# 查看监控的主节点信息(应显示3个主节点)
sentinel masters
# 查看其他哨兵节点(应显示2个其他哨兵,IP对应宿主机B、C)
sentinel sentinels mymaster1
操作范围:第 1-3 步需在对应宿主机执行(A 配置 Sentinel1,B 配置 Sentinel2,C 配置 Sentinel3);第 4 步需在宿主机 A、B、C分别验证自身哨兵的监控状态,确保能识别其他哨兵和 Redis 主节点。
六、集群高可用测试(跨宿主机验证,3 台宿主机配合执行)
1. 模拟主节点宕机(在主节点所在宿主机执行)
以 “宿主机 A 的 redis-master1 宕机” 为例,在宿主机 A 执行:
bash
# 停止redis-master1容器,模拟主节点故障
docker stop redis-master1
2. 观察故障转移结果(在任意宿主机执行,推荐宿主机 B)
bash
# 进入宿主机B的redis-master2容器,查看集群状态
docker exec -it redis-master2 redis-cli -c
cluster nodes
# 预期结果:原master1的从节点(宿主机B的redis-slave1,192.168.1.101:6385)自动升级为新master
3. 恢复原主节点(在故障主节点所在宿主机执行,即宿主机 A)
bash
# 重启redis-master1容器
docker start redis-master1
# 查看集群状态(redis-master1自动变为新master的从节点)
docker exec -it redis-master1 redis-cli -c cluster nodes
操作范围:第 1 步在故障主节点所在宿主机(如宿主机 A)执行;第 2 步可在任意正常宿主机(如宿主机 B)执行;第 3 步在故障主节点所在宿主机(宿主机 A)执行。
七、增强配置:设置集群密码(3 台宿主机均建议执行,但不强制)
为避免未授权访问,需为所有 Redis 节点和哨兵设置统一密码,步骤如下:
1. 重启 Redis 容器(带密码参数,3 台宿主机分别执行)
以宿主机 A 为例,重启 redis-master1 和 redis-slave3:
bash
# 1. 停止当前Redis容器
docker stop redis-master1 redis-slave3
# 2. 带密码重启master1(--requirepass:访问密码;--masterauth:从节点同步密码)
docker run -d --name redis-master1 -v /data/redis/master1:/data -p 6381:6379 redis:5.0 \
--cluster-enabled yes --cluster-config-file master1.conf \
--appendonly yes --appendfsync always \
--requirepass "Redis@2025" --masterauth "Redis@2025"
# 3. 带密码重启slave3
docker run -d --name redis-slave3 -v /data/redis/slave3:/data -p 6384:6379 redis:5.0 \
--cluster-enabled yes --cluster-config-file slave3.conf \
--appendonly yes --appendfsync always \
--requirepass "Redis@2025" --masterauth "Redis@2025"
- 宿主机 B、C 执行相同操作,仅替换容器名称(如 redis-master2、redis-slave1)和端口。
2. 配置哨兵密码(3 台宿主机分别执行)
以宿主机 A 为例,修改 Sentinel1 配置文件:
bash
# 1. 停止哨兵容器
docker stop redis-sentinel1
# 2. 编辑哨兵配置文件,添加密码
vi /data/redis/sentinel/sentinel1.conf
# 添加3行密码配置(对应3个主节点,密码与Redis一致)
sentinel auth-pass mymaster1 Redis@2025
sentinel auth-pass mymaster2 Redis@2025
sentinel auth-pass mymaster3 Redis@2025
# 3. 重启哨兵容器
docker run -d --name redis-sentinel1 -v /data/redis/sentinel/sentinel1.conf:/etc/redis/sentinel.conf -p 26379:26379 redis:5.0 redis-sentinel /etc/redis/sentinel.conf
- 宿主机 B、C 执行相同操作,修改对应哨兵配置文件。
3. 验证密码生效(3 台宿主机均需执行)
以宿主机 A 为例:
bash
# 带密码连接Redis节点
docker exec -it redis-master1 redis-cli -c -a "Redis@2025"
ping # 应返回PONG(无密码则报错)
# 带密码验证哨兵
docker exec -it redis-sentinel1 redis-cli -p 26379
sentinel master mymaster1 # 应正常返回主节点信息(无密码则报错)
操作范围:第 1-3 步需在宿主机 A、B、C分别执行,确保所有 Redis 节点和哨兵均配置密码。
八、核心操作范围汇总表
| 操作阶段 | 执行机器 | 关键说明 |
|---|---|---|
| 基础环境初始化(Docker、镜像、目录) | 宿主机 A、B、C 均需执行 | 每台机器独立完成,确保环境一致 |
| Redis 容器启动 | 宿主机 A 启动 A 的 2 个容器;B 启动 B 的;C 启动 C 的 | 按角色分配容器,端口不重复 |
| 集群创建 | 仅宿主机 A 执行 | 1 次操作,配置自动同步到所有节点 |
| 哨兵配置与启动 | 宿主机 A 配置 Sentinel1;B 配置 Sentinel2;C 配置 Sentinel3 | 每台机器的哨兵监控所有主节点 |
| 集群状态验证(Redis / 哨兵) | 宿主机 A、B、C 均需执行 | 验证自身节点状态,确保跨机器通信正常 |
| 故障转移测试 | 故障主节点宿主机(启停容器)+ 任意正常宿主机(查看状态) | 跨机器验证高可用,确保从节点自动升级 |
| 密码配置 | 宿主机 A、B、C 均需执行 | 所有 Redis / 哨兵节点均需配置,密码统一 |
通过以上流程,可实现 3 台宿主机跨机器部署 Redis 三主三从三哨兵集群,具备 “故障自动转移、数据持久化、访问安全控制” 能力,满足生产环境高可用需求。

被折叠的 条评论
为什么被折叠?



