Docker Compose 部署 Redis 哨兵集群

相关概念:DockerRedis

如果只是单机 Redis,优先看 Docker Compose 部署 Redis。需要主从复制加自动故障转移时,再上哨兵模式。

目标结构

一个常见的最小高可用组合是:

  • 1 个 master
  • 2 个 replica
  • 3 个 sentinel

这样主节点挂掉时,哨兵才有机会完成自动故障转移。

Compose 文件的关键点

核心不是“容器能不能启动”,而是下面这几项有没有想清楚:

  • 主从实例都要带认证参数
  • 副本节点初始要显式指向主节点
  • 如果存在 NAT、端口映射或外网访问,副本要显式声明外部可访问的地址和端口

例如副本节点的命令可以长这样:

command: >
  redis-server
  --slaveof redis-master 6379
  --requirepass root
  --masterauth root
  --replica-announce-ip "nas.me"
  --replica-announce-port 6380
  --appendonly yes

其中最容易漏掉的是:

  • --replica-announce-ip
  • --replica-announce-port

如果部署环境里有端口映射,但这里没有写对,集群表面上能起来,客户端却很容易连到不可达地址。

Sentinel 配置的关键点

一个最小可用的 sentinel.conf 可以很短:

port 26379
dir "/tmp"
sentinel monitor mymaster nas.me 6379 2
sentinel auth-pass mymaster root
sentinel deny-scripts-reconfig yes
sentinel resolve-hostnames yes

这里最关键的是:

  • mymaster:主库组名
  • nas.me 6379:客户端真正可访问的主库地址
  • 2:至少有 2 个哨兵判定离线才触发 failover

验证方式

至少做三类检查:

docker-compose ps
docker exec -it redis-master redis-cli -a root info replication
docker logs redis-sentinel-1 -f

如果这些都正常,再手动停掉主节点看一次故障转移:

docker stop redis-master

一个经验判断

哨兵模式是否真的搭好,不看“容器是不是都 Up”,而看两件事:

  • 主从关系是否正确
  • 主节点挂掉后,客户端配置是否还能继续工作