哨兵Redis的主从复制模式下一旦这个主节点不能提供服务就需要人工进行主从切换这是非常麻烦的。后续如果要解决单机存储容量限制需要继续看集群主从复制局限性主从复制能够很好地平衡数据一致性问题但是当遇到故障时还是会遗留一些问题主节点发生故障时需要手动切换主节点非常复杂。主节点能够将读压力分担到从节点中但是主节点仍然承担写压力受到单机限制。来看第一个问题如果出现故障了大致流程是检查主节点是否健康是否还能工作或抢救。如果短时间不能排查问题则需要手动挑一个从节点设置为新的主节点。把选好的从节点通过slaveof no one升级成主节点。再将原来的从节点通过slaveof 主节点的 ip port连上新的主节点。修改客户端配置让客户端能够顺利连接到另一个主节点。这步骤看着都头疼…于是 Redis 就引入了哨兵来解决这个问题。通常哨兵也不会只设置一个而会部署一个哨兵集群防止哨兵挂了或单个哨兵误判。实现原理正常运行状态时哨兵集群中的每个节点都是单独的redis-sentinel进程会监控现有的redis-master和slave。它们的监控是通过 TCP 长连接定期发送心跳包。不过一个哨兵节点发现主节点挂了还不够需要多个哨兵节点共同认同这件事才会进行接下来的操作主要是为了防止误判。当多数哨兵都认为主节点挂了就会接着往下操作哨兵节点中会先挑选出一个 leader由这个 leader 负责从现有从节点中挑选一个作为新的主节点。leader 会通过投票方式选出每个哨兵都有一票票数多的成为 leader。挑选出从节点后哨兵会控制这个节点执行slaveof no one并控制其他节点修改slaveof到新的主节点上。然后自动通知客户端。Docker 部署这里使用 Docker 做多个 Redis 的部署练习结构是一个主节点、两个从节点、一个哨兵集群三个 sentinel。主从节点配置在云服务器上运行 Docker首先要安装 Dockeraptinstalldocker-compose如果本身有 Redis 进程可以先停掉之前的服务serviceredis-server stop然后使用 Docker 拉取 Redis 镜像dockerpull redis:5.0.9首次拉取可能会出现拉取超时这是由于国内网络环境导致的。要么给云服务器加代理要么配置镜像源。我这里配置了镜像源只需要逐条执行即可sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json/dev/nullEOF { registry-mirrors: [ https://docker.1ms.run, https://hub-mirror.c.163.com ] } EOFsudosystemctl daemon-reloadsudosystemctl restartdockersudodockerpull redis:5.0.9最后使用下面的命令查看镜像是否拉取成功dockerimages我们需要创建两个文件夹。建议在主目录中建一个redis文件夹在里面再分成redis-data和redis-sentinel文件夹mkdirrediscdredismkdirredis-datamkdirredis-sentinel最终你在redis目录中会有这两个文件夹进入redis-datacdredis-data新建配置文件vimdocker-compose.yml注意这个文件名称必须是docker-compose.yml然后把这段配置粘贴进去version:3.7services:master:image:redis:5.0.9container_name:redis-masterrestart:alwayscommand:redis-server--appendonly yesports:-6379:6379slave1:image:redis:5.0.9container_name:redis-slave1restart:alwayscommand:redis-server--appendonly yes--slaveof redis-master 6379ports:-6380:6379slave2:image:redis:5.0.9container_name:redis-slave2restart:alwayscommand:redis-server--appendonly yes--slaveof redis-master 6379ports:-6381:6379最后启动docker-composeup-d哨兵配置进入哨兵文件夹cdredis-sentinel同样创建配置文件vimdocker-compose.yml配置内容如下version:3.7services:sentinel1:image:redis:5.0.9container_name:redis-sentinel-1restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel1.conf:/etc/redis/sentinel.confports:-26379:26379sentinel2:image:redis:5.0.9container_name:redis-sentinel-2restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel2.conf:/etc/redis/sentinel.confports:-26380:26379sentinel3:image:redis:5.0.9container_name:redis-sentinel-3restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel3.conf:/etc/redis/sentinel.confports:-26381:26379# 用于解析处于不同局域网的主节点。# 主从节点使用另一个 docker-compose 配置这个 Docker 网络内无法直接解析对应域名。# 可以用 docker network ls 列出 Docker 中的局域网。networks:default:external:name:redis-data_default最后执行docker-composeup-d-d的意思是在后台运行。执行到这里就部署完成了。如果想查看 Redis 日志可以使用docker-composelogs这是各个哨兵节点的日志也能查看主从节点日志只需切换到对应文件夹即可
【Redis】主从复制局限性与哨兵概念、Docker 部署教程
发布时间:2026/6/1 14:21:49
哨兵Redis的主从复制模式下一旦这个主节点不能提供服务就需要人工进行主从切换这是非常麻烦的。后续如果要解决单机存储容量限制需要继续看集群主从复制局限性主从复制能够很好地平衡数据一致性问题但是当遇到故障时还是会遗留一些问题主节点发生故障时需要手动切换主节点非常复杂。主节点能够将读压力分担到从节点中但是主节点仍然承担写压力受到单机限制。来看第一个问题如果出现故障了大致流程是检查主节点是否健康是否还能工作或抢救。如果短时间不能排查问题则需要手动挑一个从节点设置为新的主节点。把选好的从节点通过slaveof no one升级成主节点。再将原来的从节点通过slaveof 主节点的 ip port连上新的主节点。修改客户端配置让客户端能够顺利连接到另一个主节点。这步骤看着都头疼…于是 Redis 就引入了哨兵来解决这个问题。通常哨兵也不会只设置一个而会部署一个哨兵集群防止哨兵挂了或单个哨兵误判。实现原理正常运行状态时哨兵集群中的每个节点都是单独的redis-sentinel进程会监控现有的redis-master和slave。它们的监控是通过 TCP 长连接定期发送心跳包。不过一个哨兵节点发现主节点挂了还不够需要多个哨兵节点共同认同这件事才会进行接下来的操作主要是为了防止误判。当多数哨兵都认为主节点挂了就会接着往下操作哨兵节点中会先挑选出一个 leader由这个 leader 负责从现有从节点中挑选一个作为新的主节点。leader 会通过投票方式选出每个哨兵都有一票票数多的成为 leader。挑选出从节点后哨兵会控制这个节点执行slaveof no one并控制其他节点修改slaveof到新的主节点上。然后自动通知客户端。Docker 部署这里使用 Docker 做多个 Redis 的部署练习结构是一个主节点、两个从节点、一个哨兵集群三个 sentinel。主从节点配置在云服务器上运行 Docker首先要安装 Dockeraptinstalldocker-compose如果本身有 Redis 进程可以先停掉之前的服务serviceredis-server stop然后使用 Docker 拉取 Redis 镜像dockerpull redis:5.0.9首次拉取可能会出现拉取超时这是由于国内网络环境导致的。要么给云服务器加代理要么配置镜像源。我这里配置了镜像源只需要逐条执行即可sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json/dev/nullEOF { registry-mirrors: [ https://docker.1ms.run, https://hub-mirror.c.163.com ] } EOFsudosystemctl daemon-reloadsudosystemctl restartdockersudodockerpull redis:5.0.9最后使用下面的命令查看镜像是否拉取成功dockerimages我们需要创建两个文件夹。建议在主目录中建一个redis文件夹在里面再分成redis-data和redis-sentinel文件夹mkdirrediscdredismkdirredis-datamkdirredis-sentinel最终你在redis目录中会有这两个文件夹进入redis-datacdredis-data新建配置文件vimdocker-compose.yml注意这个文件名称必须是docker-compose.yml然后把这段配置粘贴进去version:3.7services:master:image:redis:5.0.9container_name:redis-masterrestart:alwayscommand:redis-server--appendonly yesports:-6379:6379slave1:image:redis:5.0.9container_name:redis-slave1restart:alwayscommand:redis-server--appendonly yes--slaveof redis-master 6379ports:-6380:6379slave2:image:redis:5.0.9container_name:redis-slave2restart:alwayscommand:redis-server--appendonly yes--slaveof redis-master 6379ports:-6381:6379最后启动docker-composeup-d哨兵配置进入哨兵文件夹cdredis-sentinel同样创建配置文件vimdocker-compose.yml配置内容如下version:3.7services:sentinel1:image:redis:5.0.9container_name:redis-sentinel-1restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel1.conf:/etc/redis/sentinel.confports:-26379:26379sentinel2:image:redis:5.0.9container_name:redis-sentinel-2restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel2.conf:/etc/redis/sentinel.confports:-26380:26379sentinel3:image:redis:5.0.9container_name:redis-sentinel-3restart:alwayscommand:redis-sentinel /etc/redis/sentinel.confvolumes:-./sentinel3.conf:/etc/redis/sentinel.confports:-26381:26379# 用于解析处于不同局域网的主节点。# 主从节点使用另一个 docker-compose 配置这个 Docker 网络内无法直接解析对应域名。# 可以用 docker network ls 列出 Docker 中的局域网。networks:default:external:name:redis-data_default最后执行docker-composeup-d-d的意思是在后台运行。执行到这里就部署完成了。如果想查看 Redis 日志可以使用docker-composelogs这是各个哨兵节点的日志也能查看主从节点日志只需切换到对应文件夹即可