redis sentinel 简介
Redis Sentinel 是 Redis 官方提供的高可用(HA)解决方案,用于监控主从架构中的故障并自动完成故障转移。当主节点(Master)宕机时,Sentinel 能自动选举新的主节点,通知从节点(Slave)和客户端更新配置,实现服务无缝切换。其核心功能包括:
- 监控:持续检查 Redis 主从节点的健康状态
- 自动故障转移:主节点故障时,自动将从节点提升为主节点。
- 配置提供:为客户端动态推送最新的主节点地址。
- 通知:通过 API 通知管理员节点故障信息。
本次使用 1主 + 2从 + 3 Sentinel 的架构进行部署。
准备环境
获取 redis docker 镜像
docker pull redis:7.4.4 docker images
创建目录
/home/docker/redis-sentinel
,将后续相关的配置文件都集中存放在该目录mkdir -p /home/docker/redis-sentinel
依次创建 master、salve、sentinel的目录文件夹
mkdir -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
docker network create --driver bridge --subnet 172.16.0.0/24 --gateway 172.16.0.1 redis-bridge
查看是否创建成功
docker network ls
关于 docker 网络
参考文档:https://outmanzzq.github.io/2019/10/22/docker-network/
docker 默认有三个网络,可以通过 docker network ls
查看
NETWORK ID NAME DRIVER SCOPE
9ac8281b182c bridge bridge local
99abdb470354 host host local
8e983d1c7d86 none null local
Docker 内置这三个网络,运行容器时,你可以使用该 –network
标志来指定容器应连接到哪些网络;如果不指定,则docker默认使用--network=bridge
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
# redis-master.conf # 是否为守护进程 daemonize no # 指定 redis 启动端口 port 6379 bind 0.0.0.0 # 设置连接密码 requirepass 123456 # 从节点连接主节点时使用的密码 masterauth 123456 # 使用 aop 持久化 appendonly yes
启动 redis 镜像
docker run -it -d --name redis-master \ --net=redis-bridge \ --ip 172.16.0.10 \ -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 启动时加载的配置文件
查看是否成功启动
docker ps
进入容器
docker exec -it redis-master redis-cli -a 123456
启动 salve
创建从节点启动配置文件,
vim /home/docker/redis-sentinel/redis-salve1.conf
# 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
启动从节点镜像
docker run -it -d --name redis-salve1 \ --network redis-bridge \ --ip 172.16.0.11 \ -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
查看是否启动成功
docker ps
进入从容器,尝试 set 会被拒绝
docker exec -it redis-salve1 redis-cli -a 123456
验证是主从是否成功
docker exec redis-master redis-cli -a 123456 INFO replication
启动第二个从节点
创建从节点启动配置文件,
vim /home/docker/redis-sentinel/redis-salve2.conf
# redis-salve2.conf # 是否为守护进程 daemonize no # 指定 redis 启动端口 port 6379 bind 0.0.0.0 # 设置连接密码 requirepass 123456 # 从节点连接主节点时使用的密码 masterauth 123456 # 使用 aop 持久化 appendonly yes # 指定主节点的IP和端口,使用容器名称即可 replicaof 172.16.0.10 6379
启动从节点镜像
docker run -it -d --name redis-salve2 \ --network redis-bridge \ --ip 172.16.0.12 \ -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
# 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
docker run -it -d --name redis-sentinel1 \ --network redis-bridge \ --ip 172.16.0.20 \ -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,只需要修改映射端口和容器名称
docker run -it -d --name redis-sentinel2 \ --network redis-bridge \ --ip 172.16.0.21 \ -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
docker run -it -d --name redis-sentinel3 \ --network redis-bridge \ --ip 172.16.0.22 \ -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
验证
检测主从状态
docker exec -it redis-master redis-cli -a 123456 INFO replication
查看 Sentinel 监控
docker 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
networks: 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: ipv4_address: 172.16.0.10 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: ipv4_address: 172.16.0.11 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: ipv4_address: 172.16.0.12 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: ipv4_address: 172.16.0.20 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: ipv4_address: 172.16.0.21 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: ipv4_address: 172.16.0.22 volumes: - /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf - /home/docker/redis-sentinel/sentinel3-data:/data ports: - "26579:26379"
启动集群
docker compose up -d
查看容器启动情况
docker ps
进入 master 验证
docker exec -it redis-master redis-cli -a 123456
主从复制验证
docker exec -it redis-master redis-cli -a 123456 INFO replication
查看 sentinel 状态
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
批量 停止/启动/重起 容器
docker compose stop|start|restart # 也可以停止指定容器 docker compose stop|start|restart redis-salve2
清理并重起服务
docker compose stop docker compose rm -f docker compose
测试故障转移
查看原始主节点信息
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
停止主节点
docker stop redis-master
通过容器查看是否成功停止
docker ps
等待10s后,再通过 sentinel 查看是否切换为新的主节点
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
登录到该从节点确认是否可以执行写入操作
docker exec -it redis-salve2 redis-cli -a 123456
最后,再重新启动 redis-master 节点,确认是否加入集群
docker 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)]
登录到该从节点确认是否可以执行写入操作
docker exec -it redis-salve2 redis-cli -a 123456
[外链图片转存中…(img-abF4A76f-1751711594422)]
最后,再重新启动 redis-master 节点,确认是否加入集群
docker restart redis-master