高级篇 11. 分布式缓存 - 搭建 Redis 哨兵集群

3 阅读5分钟

既然我们在第 07 节已经用 Docker Desktop 完美搭建了主从集群,现在我们就顺水推舟,直接在同一个 Docker 网络里,把 3 个哨兵节点也部署起来。


📚 高级篇 11. 分布式缓存 - 搭建 Redis 哨兵集群 (Docker 实战版)

一、 架构规划

目前你的 Docker 里已经有了一个完美的底层基础:

  • redis-ms-net (专属局域网)
  • redis-master (大哥)
  • redis-slave-1, redis-slave-2 (两个小弟)

现在,我们要向这个网络中安插 3 个“巡逻兵”(哨兵集群):

  • Sentinel 1: 容器名 redis-sentinel-1,宿主机端口 27001
  • Sentinel 2: 容器名 redis-sentinel-2,宿主机端口 27002
  • Sentinel 3: 容器名 redis-sentinel-3,宿主机端口 27003

二、 核心实操:一键启动 3 个哨兵

请打开你的终端(PowerShell 或 CMD),依次复制并执行以下 3 条长命令。

(💡 原理揭秘:这三条命令会在容器内部自动创建 sentinel.conf 配置文件,并立刻启动哨兵进程,完美避开了 Windows 挂载文件的各种坑!)

1. 启动哨兵 1 号

Bash

docker run -d --name redis-sentinel-1 --network redis-ms-net -p 27001:26379 redis:latest sh -c "echo 'port 26379' > /tmp/sentinel.conf && echo 'sentinel monitor mymaster redis-master 6379 2' >> /tmp/sentinel.conf && echo 'sentinel down-after-milliseconds mymaster 5000' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"

2. 启动哨兵 2 号

Bash

docker run -d --name redis-sentinel-2 --network redis-ms-net -p 27002:26379 redis:latest sh -c "echo 'port 26379' > /tmp/sentinel.conf && echo 'sentinel monitor mymaster redis-master 6379 2' >> /tmp/sentinel.conf && echo 'sentinel down-after-milliseconds mymaster 5000' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"

3. 启动哨兵 3 号

Bash

docker run -d --name redis-sentinel-3 --network redis-ms-net -p 27003:26379 redis:latest sh -c "echo 'port 26379' > /tmp/sentinel.conf && echo 'sentinel monitor mymaster redis-master 6379 2' >> /tmp/sentinel.conf && echo 'sentinel down-after-milliseconds mymaster 5000' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"

配置参数解析:

  • monitor mymaster redis-master 6379 2:监控名为 mymaster 的大哥(它的容器名是 redis-master,端口 6379),最后的 2 就是上节课讲的法定人数 (Quorum) ,即至少需要 2 个哨兵同意才能宣布大哥驾崩。
  • down-after-milliseconds mymaster 5000:只要大哥 5 秒钟没回消息,就认为它主观下线(为了方便咱们一会做测试,时间设得很短,生产环境一般是 30000 即 30 秒)。

三、 验证哨兵是否正常上班

执行完毕后,你可以去 Docker Desktop 的 Containers 列表里看一眼,应该有 3 个绿色的 redis-sentinel 正在运行。

我们进入哨兵 1 号内部,看看它有没有发现大哥和小弟:

Bash

docker exec -it redis-sentinel-1 redis-cli -p 26379 info sentinel

正常情况下,你会看到最下面有这样一行输出:

master0:name=mymaster,status=ok,address=xxx.xxx.xxx.xxx:6379,slaves=2,sentinels=3

  • status=ok:说明大哥活得好好的。
  • slaves=2:哨兵成功发现了 2 个小弟。
  • sentinels=3:哨兵集群互相发现了彼此,组队成功!

四、 🌟 见证奇迹:高可用灾难演练 (面试吹水资本)

现在,激动人心的时刻到了!我们要亲手“拔掉”大哥的网线,看看系统会不会自动选出新皇!

第 1 步:人为制造宕机 (刺杀老大哥)

直接干掉 redis-master 容器:

Bash

docker stop redis-master

第 2 步:观察哨兵的疯狂反应

耐心等待 5 到 10 秒钟(因为我们设置了 5 秒超时),然后查看哨兵 1 号的实时日志:

Bash

docker logs redis-sentinel-1

(你会看到日志里疯狂输出 +sdown 主观下线、+odown 客观下线、+vote-for-leader 选举投票、最后 +switch-master 切换新大哥!这绝对是极其震撼的底层运作流!)

第 3 步:确认谁登基了新皇?

老大哥死了,现在 redis-slave-1redis-slave-2 中必然有一个人被黄袍加身了。我们分别去它们身上查验身份:

查看 slave-1:

Bash

docker exec -it redis-slave-1 redis-cli info replication

查看 slave-2:

Bash

docker exec -it redis-slave-2 redis-cli info replication

你会发现:其中一个的 role 变成了 master,而另一个的 role 依然是 slave,并且它的 master_host 自动指向了刚才登基的那个新大哥!

第 4 步:老大哥诈尸还魂 (降级处理)

如果在半夜,运维人员把死掉的 redis-master 修好了,重新启动它:

Bash

docker start redis-master

你去查一下它现在的身份:

Bash

docker exec -it redis-master redis-cli info replication

结果: 它的 role 变成了 slave!它发现时代变了,只能乖乖给新当选的大哥做小弟。这就是哨兵极其强悍的故障自动转移能力!


学习总结

恭喜你!你刚刚亲手在本地电脑上完成了一次真实的阿里/腾讯级高可用灾难恢复演练

你向系统中引入了独立于数据之外的第三方监控者(Sentinel)。它完美诠释了分布式系统中的“共识机制”和“自动化运维”理念。把刚才你在日志里看到的 sdown -> odown -> switch-master 流程刻在脑子里,这就是你面对面试官时最硬核的底气!


至此,我们的系统已经实现了“读写分离”和“永不宕机(高可用)”。

但是,随着双十一大促的到来,系统的商品数据达到了恐怖的 1TB。单台 Redis 最大内存才 64GB,哪怕你有 100 个小弟,每个小弟也只能存 64GB 的相同数据,根本装不下 1TB 的海量数据!

这就逼迫我们走向分布式缓存的最巅峰形态。

去见识真正能够无限横向扩容内存空间的终极杀器——“12. 分布式缓存 - 分片集群 (Sharding Cluster) 架构与分片原理”