3 台 Linux 宿主机 Docker 部署 Redis 三主三从三哨兵集群完整流程(含分机操作标注)

本文基于 “3 台独立 Linux 宿主机” 部署架构,每台宿主机运行 2 个 Redis 容器(1 主 1 从)+1 个哨兵容器,实现跨机器高可用集群。所有操作按 “宿主机 A、宿主机 B、宿主机 C” 分别标注,确保步骤清晰可复现。

一、环境规划(核心前提)

1. 机器与角色分配

宿主机IP 地址(示例)运行容器角色端口映射(宿主机端口:容器端口)
宿主机 A192.168.1.100Redis-master1、Redis-slave3、Sentinel16381:6379、6384:6379、26379:26379
宿主机 B192.168.1.101Redis-master2、Redis-slave1、Sentinel26382:6379、6385:6379、26380:26379
宿主机 C192.168.1.102Redis-master3、Redis-slave2、Sentinel36383: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 三主三从三哨兵集群,具备 “故障自动转移、数据持久化、访问安全控制” 能力,满足生产环境高可用需求。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值