redis sentinel 简介
Redis Sentinel 是 Redis 官方提供的高可用(HA)解决方案,用于监控主从架构中的故障并自动完成故障转移。当主节点(Master)宕机时,Sentinel 能自动选举新的主节点,通知从节点(Slave)和客户端更新配置,实现服务无缝切换。其核心功能包括:
- 监控:持续检查 Redis 主从节点的健康状态
- 自动故障转移:主节点故障时,自动将从节点提升为主节点。
- 配置提供:为客户端动态推送最新的主节点地址。
- 通知:通过 API 通知管理员节点故障信息。
本次使用 1主 + 2从 + 3 Sentinel 的架构进行部署。
准备环境
-
获取 redis docker 镜像
bashdocker pull redis:7.4.4 docker images
-
创建目录
/home/docker/redis-sentinel
,将后续相关的配置文件都集中存放在该目录bashmkdir -p /home/docker/redis-sentinel
-
依次创建 master、salve、sentinel的目录文件夹
bashmkdir -p /home/docker/redis-sentinel/master-data mkdir -p /home/docker/redis-sentinel/salve1-data mkdir -p /home/docker/redis-sentinel/salve2-data mkdir -p /home/docker/redis-sentinel/sentinel1-data mkdir -p /home/docker/redis-sentinel/sentinel2-data mkdir -p /home/docker/redis-sentinel/sentinel3-data
-
创建用于 redis 通信的专属 bridge
bashdocker network create --driver bridge redis-bridge
-
查看是否创建成功
bashdocker network ls
关于 docker 网络
docker 默认有三个网络,可以通过 docker network ls
查看
bash
NETWORK ID NAME DRIVER SCOPE
9ac8281b182c bridge bridge local
99abdb470354 host host local
8e983d1c7d86 none null local
Docker 内置这三个网络,运行容器时,你可以使用该 --network
标志来指定容器应连接到哪些网络;如果不指定,则docker默认使用--network=bridge
bash
docker run --network=host
- Host:与宿主机在同一个网络,没有独立IP;
- None:该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。相当于关闭了容器的网络功能;
- Bridge:容器连接到 docker0 虚拟网卡,通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信;
通过 ifconfig
可以查看到 docker0

在 bridge 模式下,连在同一网桥上的容器可以相互通信,本文的 docker 配置将基于 bridge 模式。
单个容器分开部署
启动 master
-
创建主节点启动配置文件,
vim /home/docker/redis-sentinel/redis-master.conf
bash# redis-master.conf # 是否为守护进程 daemonize no # 指定 redis 启动端口 port 6379 bind 0.0.0.0 # 设置连接密码 requirepass 123456 # 从节点连接主节点时使用的密码 masterauth 123456 # 使用 aop 持久化 appendonly yes
-
启动 redis 镜像
bashdocker run -it -d --name redis-master \ --network redis-bridge \ -p 6379:6379 \ -v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf \ -v /home/docker/redis-sentinel/master-data:/data \ redis:7.4.4 \ redis-server /etc/redis/redis.conf # -it:允许在启动时附加终端查看日志或调试(如未配置 -d 时),但此处与 -d 共存,实际以守护模式运行,可能用于保留日志输出能力。 # -d: 后台运行容器,返回容器 ID,不阻塞当前终端。 # --name redis-master: 指定容器的名称 # --network redis-bridge:指定容器启动网络,方便后续容器之间的通信 # -p 6379:6379:端口映射,将宿主机 6379 端口映射到容器的 6379 端口 # -v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf:挂载宿主机文件到容器内,将宿主机配置文件挂载至容器内 Redis 默认配置路径,覆盖镜像默认配置;修改宿主机配置后,重启容器即可生效。 # -v /home/docker/redis-sentinel/master-data:/data:挂载宿主机目录到容器内的 /data 目录,Redis 持久化文件(如 dump.rdb)存储在宿主机目录,避免容器删除后数据丢失 # redis:7.4.4:指定使用的 Docker 镜像及版本 # redis-server /etc/redis/redis.conf:覆盖镜像默认的启动命令,指定 Redis 启动时加载的配置文件
-
查看是否成功启动
bashdocker ps
-
进入容器
bashdocker exec -it redis-master redis-cli -a 123456
启动 salve
-
创建从节点启动配置文件,
vim /home/docker/redis-sentinel/redis-salve1.conf
bash# redis-salve1.conf # 是否为守护进程 daemonize no # 指定 redis 启动端口 port 6379 bind 0.0.0.0 # 设置连接密码 requirepass 123456 # 从节点连接主节点时使用的密码 masterauth 123456 # 使用 aop 持久化 appendonly yes # 指定主节点的IP和端口,使用容器名称即可 replicaof redis-master 6379
-
启动从节点镜像
bashdocker run -it -d --name redis-salve1 \ --network redis-bridge \ -p 6479:6379 \ -v /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf \ -v /home/docker/redis-sentinel/salve1-data:/data \ redis:7.4.4 \ redis-server /etc/redis/redis.conf
-
查看是否启动成功
bashdocker ps
-
进入从容器,尝试 set 会被拒绝
bashdocker exec -it redis-salve1 redis-cli -a 123456
-
验证是主从是否成功
bashdocker exec redis-master redis-cli -a 123456 INFO replication
启动第二个从节点
-
创建从节点启动配置文件,
vim /home/docker/redis-sentinel/redis-salve2.conf
bash# redis-salve2.conf # 是否为守护进程 daemonize no # 指定 redis 启动端口 port 6379 bind 0.0.0.0 # 设置连接密码 requirepass 123456 # 从节点连接主节点时使用的密码 masterauth 123456 # 使用 aop 持久化 appendonly yes # 指定主节点的IP和端口,使用容器名称即可 replicaof redis-master 6379
-
启动从节点镜像
bashdocker run -it -d --name redis-salve2 \ --network redis-bridge \ -p 6579:6379 \ -v /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf \ -v /home/docker/redis-sentinel/salve2-data:/data \ redis:7.4.4 \ redis-server /etc/redis/redis.conf
启动 sentinel
-
创建 sentinel 配置文件,
vim /home/docker/redis-sentinel/redis-sentinel.conf
bash# redis-sentinel.conf # 端口号 port 26379 daemonize no # 启用主机名解析 sentinel resolve-hostnames yes # 监控主节点,2 个 Sentinel 同意即触发故障转移 sentinel monitor mymaster redis-master 6379 2 # 主节点密码 sentinel auth-pass mymaster 123456 # 5 秒无响应视为下线 sentinel down-after-milliseconds mymaster 5000
-
启动sentinel1
bashdocker run -it -d --name redis-sentinel1 \ --network redis-bridge \ -p 26379:26379 \ -v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \ -v /home/docker/redis-sentinel/sentinel1-data:/data \ redis:7.4.4 \ redis-sentinel /etc/redis/sentinel.conf
-
启动另外两个 sentinel,只需要修改映射端口和容器名称
bashdocker run -it -d --name redis-sentinel2 \ --network redis-bridge \ -p 26479:26379 \ -v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \ -v /home/docker/redis-sentinel/sentinel2-data:/data \ redis:7.4.4 \ redis-sentinel /etc/redis/sentinel.conf
bashdocker run -it -d --name redis-sentinel3 \ --network redis-bridge \ -p 26579:26379 \ -v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \ -v /home/docker/redis-sentinel/sentinel3-data:/data \ redis:7.4.4 \ redis-sentinel /etc/redis/sentinel.conf
验证
-
检测主从状态
bashdocker exec -it redis-master redis-cli -a 123456 INFO replication
-
查看 Sentinel 监控
bashdocker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
docker compose 部署
按照上述步骤,可以完整的部署 docker sentinel 集群,但是需要一个个启动和配置容器,比较麻烦,因此可以通过 docker compose 来简化操作。
配置文件使用前边单个容器部署中的配置。
-
新建 docker compose 配置文件,
vim /home/docker/redis-sentinel/docker-compose.yml
bashnetworks: redis-bridge: # 自定义网络,确保容器互通 external: true name: redis-bridge services: # 主节点 redis-master: image: redis:7.4.4 container_name: redis-master command: redis-server /etc/redis/redis.conf networks: - redis-bridge volumes: - /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf - /home/docker/redis-sentinel/master-data:/data ports: - "6379:6379" # 从节点(2个) redis-slave1: image: redis:7.4.4 container_name: redis-slave1 command: redis-server /etc/redis/redis.conf networks: - redis-bridge depends_on: - redis-master volumes: - /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf - /home/docker/redis-sentinel/salve1-data:/data ports: - "6479:6379" redis-slave2: image: redis:7.4.4 container_name: redis-slave2 command: redis-server /etc/redis/redis.conf networks: - redis-bridge depends_on: - redis-master volumes: - /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf - /home/docker/redis-sentinel/salve2-data:/data ports: - "6579:6379" # Sentinel节点(3个) redis-sentinel1: image: redis:7.4.4 container_name: redis-sentinel1 command: redis-sentinel /etc/redis/sentinel.conf networks: - redis-bridge volumes: - /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf - /home/docker/redis-sentinel/sentinel1-data:/data ports: - "26379:26379" redis-sentinel2: image: redis:7.4.4 container_name: redis-sentinel2 command: redis-sentinel /etc/redis/sentinel.conf networks: - redis-bridge volumes: - /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf - /home/docker/redis-sentinel/sentinel2-data:/data ports: - "26479:26379" redis-sentinel3: image: redis:7.4.4 container_name: redis-sentinel3 command: redis-sentinel /etc/redis/sentinel.conf networks: - redis-bridge volumes: - /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf - /home/docker/redis-sentinel/sentinel3-data:/data ports: - "26579:26379"
-
启动集群
bashdocker compose up -d
-
查看容器启动情况
bashdocker ps
-
进入 master 验证
bashdocker exec -it redis-master redis-cli -a 123456
-
主从复制验证
bashdocker exec -it redis-master redis-cli -a 123456 INFO replication
-
查看 sentinel 状态
bashdocker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
-
批量 停止/启动/重起 容器
bashdocker compose stop|start|restart # 也可以停止指定容器 docker compose stop|start|restart redis-salve2
-
清理并重起服务
bashdocker compose stop docker compose rm -f docker compose
测试故障转移
-
查看原始主节点信息
bashdocker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
-
停止主节点
bashdocker stop redis-master
-
通过容器查看是否成功停止
bashdocker ps
-
等待10s后,再通过 sentinel 查看是否切换为新的主节点
bashdocker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
-
登录到该从节点确认是否可以执行写入操作
bashdocker exec -it redis-salve2 redis-cli -a 123456
-
最后,再重新启动 redis-master 节点,确认是否加入集群
bashdocker restart redis-master
r ps
[外链图片转存中...(img-gimuVGTV-1751711594422)]
- 等待10s后,再通过 sentinel 查看是否切换为新的主节点
```bash
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
外链图片转存中...(img-OWCrEdIU-1751711594422)
-
登录到该从节点确认是否可以执行写入操作
bashdocker exec -it redis-salve2 redis-cli -a 123456
外链图片转存中...(img-abF4A76f-1751711594422)
-
最后,再重新启动 redis-master 节点,确认是否加入集群
bashdocker restart redis-master