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、slave、sentinel的目录文件夹
mkdir -p /home/docker/redis-sentinel/master-data
mkdir -p /home/docker/redis-sentinel/slave1-data
mkdir -p /home/docker/redis-sentinel/slave2-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 默认有三个网络,可以通过 docker network ls 查看
单个容器分开部署
启动 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
启动 slave
创建从节点启动配置文件,vim /home/docker/redis-sentinel/redis-slave1.conf
# redis-slave1.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-slave1 redis-cli -a 123456
验证是主从是否成功 docker exec redis-master redis-cli -a 123456 INFO replication
启动第二个从节点
创建从节点启动配置文件,vim /home/docker/redis-sentinel/redis-slave2.conf
# redis-slave2.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-slave2 --network redis-bridge --ip 172.16.0.12 -p 6579:6379 -v /home/docker/redis-sentinel/redis-slave2.conf:/etc/redis/redis.conf -v /home/docker/redis-sentinel/slave2-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 172.16.0.10 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.23 -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
通过哨兵查询 主节点
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
停止主节点
docker stop redis-master
等待10s后,再通过 sentinel 查看是否切换为新的主节点
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
验证完成,从节点 172.10.0.11 成为主节点!