21人参与 • 2025-10-10 • Redis
在一主多从的 redis 架构中,从节点可以起到数据冗余备份和读写分离的作用。
如果主节点遇到故障导致无法提供服务时,可以采用手动方式将其一个从节点提升为主节点,保证 redis 主从能够正常工作。
主从切换通过手动完成比较耗时、费力,并且影响 redis 正常服务。为此,reids 提供了哨兵功能,实现了自动化的系统监控和故障恢复功能。
哨兵(sentine1),主要负责监控主从节点运行是否正常,以及当主节点出现故障时自动将一个从节点转换为新的主节点。
哨兵是一个独立的进程。,最基础的通用哨兵架构如下所示:

哨兵最基础架构由两部分组成,包括哨兵节点和数据节点。
其中,哨兵节点是特殊的 redis 节点,并不存储数据,出于高可用方面考虑,哨兵架构中通常都是多个哨兵节点共同提供服务。
数据节点用于存储 redis 数据。包括主节点和从节点。
哨兵节点的配置文件中需要添加如下配置:
sentinel monitor master-name ip port quorum
其中,sentinel monitor 是配置哨兵的命令,接着是主节点的名称、ip 地址和端口号,最后的 quorum 用来表示执行故障恢复操作之前至少需要几个哨兵节点同意。一个哨兵节点可以同时监控多个 reids 主从系统,多个哨兵节点也可以同时监控同一个 redis 主从系统。
配置修改好之后,就可以启动哨兵节点了。当哨兵节点启动时,会与要监控的主数据库(master)建立连接,连接建立之后,哨兵会定时地执行以下3个任务:
这3个定时任务贯穿哨兵进程的整个生命周期,非常重要。
当哨兵节点启动后,会向主节点发送 info 命令,通过解析返回的结果可以获得从节点的列表,然后与每个从节点建立连接。
之后,哨兵会每隔 10 秒定时向所有已知主从节点发送 info 命令来获取西悉尼更新并进行相应的操作。
接下来哨兵会向主从节点发送信息与同样监控主从节点的哨兵分享自己的信息。当其他哨兵节点收到信息后,会判断发送信息的哨兵是不是新发现的哨兵,如果是则将其加入已发现的哨兵列表中并创建到该节点的连接,这样就实现了自动发现从节点和其他哨兵节点。
之后哨兵要做的就是监控主从节点是否停止服务,通过发送ping 命令来实现的。
ping 命令是每隔1秒发送一次,如果被 ping 的节点超时一定的时间没有回复,哨兵就会认为其主观下线,是哨兵节点“主观地” 判断下线。
如果该节点是主节点,则哨兵会进一步判断是否需要对其进行故障恢复,具体过程如下:该哨兵节点会询问其他哨兵节点来了解它们是否也认为该主节点已经主观下线,如果达到指定数量,则哨兵会认为其客观下线,此时各哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者哨兵节点对其进行故障转移操作。
领导者哨兵节点执行故障恢复可以保证同一时间内只有一个哨兵节点在执行故障恢复,避免多个节点同时操作。选举领导者哨兵的过程适用了 raft 算法,具体的过程如下:
选出领导者哨兵后,领导者哨兵会对主节点进行故障转移恢复。恢复过程可以分为以下3个步骤:
实验需要环境
| 操作系统 | 配置 | ip | 主机名 | 角色 |
| 0peneuler24 | 2c4g | 192.168.10.104 | sentine101 | 哨兵节点 |
| 0peneuler24 | 2c4g | 192.168.10.105 | sentine102 | 哨兵节点 |
| 0peneuler24 | 2c4g | 192.168.10.106 | sentine103 | 哨兵节点 |
| 0peneuler24 | 2c4g | 192.168.10.101 | master | 主节点 |
| 0peneuler24 | 2c4g | 192.168.10.102 | slave0l | 从节点 |
| 0peneuler24 | 2c4g | 192.168.10.103 | slave02 | 从节点 |
(1) 关闭防火墙、selinux。
systemctl stop firewalld systemctl disable firewalld
(2) 设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave01
hostnamectl set-hostname slave02
hostnamectl set-hostname sentine101
hostnamectl set-hostname sentine102
hostnamectl set-hostname sentine103
操作节点:master、slave01、slave02
# 安装编译依赖 yum -y install gcc zlib-devel # 解压&编译安装 tar -zxvf redis-6.2.4.tar.gz -c /usr/src/ cd /usr/src/redis-6.2.4/ make && make prefix=/usr/local/redis install # 配置软链接 ln -s /usr/local/redis/bin/* /usr/local/bin/ # 准备配置文件目录 mkdir /etc/redis cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
cat > /etc/systemd/system/redis.service << eof [unit] description=redis after=network.target [service] type=forking execstart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf [install] wantedby=multi-user.target eof
(1)主节点
vim /etc/redis/6379.conf # 修改内容: bind 127.0.0.1 192.168.10.101 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 启动服务 systemctl daemon-reload systemctl start redis systemctl enable redis # 验证端口 netstat -anpt | grep 6379
(2)从节点 1
vim /etc/redis/6379.conf # 修改内容: bind 127.0.0.1 192.168.10.102 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 启动服务 systemctl daemon-reload systemctl start redis systemctl enable redis # 验证端口 netstat -anpt | grep 6379
(3)从节点 2
vim /etc/redis/6379.conf # 修改内容: bind 127.0.0.1 192.168.10.103 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 启动服务 systemctl daemon-reload systemctl start redis systemctl enable redis # 验证端口 netstat -anpt | grep 6379
vim /etc/redis/6379.conf # 添加: replicaof 192.168.10.101 6379 # 重启生效 systemctl restart redis
(1) 主节点验证
redis-cli 127.0.0.1:6379> info replication # 预期:role=master,connected_slaves=2(slave01、slave02)
(2) 从节点验证
redis-cli 127.0.0.1:6379> info replication # 预期:role=slave,master_host=192.168.10.101,master_link_status=up
操作节点:sentine101、sentine102、sentine103(步骤相同,以sentine101为例)
# 安装依赖(若未装) yum -y install gcc gcc-c++ make # 解压&编译(同主从) tar -zxvf redis-6.2.4.tar.gz -c /usr/src/ cd /usr/src/redis-6.2.4/ make && make install # 准备配置文件 mkdir /etc/redis cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
vim /etc/redis/6379.conf # 添加: sentinel monitor master 192.168.10.101 6379 2 # 监控主节点,quorum=2 bind 0.0.0.0 # 允许所有ip通信 daemonize yes # 后台运行
cat > /etc/systemd/system/redis.service << eof [unit] description=redis after=network.target [service] type=forking execstart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf # 启动哨兵 [install] wantedby=multi-user.target eof
systemctl daemon-reload systemctl start redis systemctl enable redis # 验证进程(查看redis-sentinel) ps aux | grep redis # 预期:/usr/local/bin/redis-sentinel 0.0.0.0:6379 [sentinel]
redis-cli 127.0.0.1:6379> info sentinel # 预期:sentinel_masters=1,master0=192.168.10.101:6379,slaves=2,sentinels=3
(1) 停止主节点服务
systemctl stop redis
(2) 观察哨兵自动切换
redis-cli 127.0.0.1:6379> info sentinel # 预期:原主节点降级为从,某从节点(slave01/slave02)升级为主
关键注意事项:
sentine101、sentine102、sentine103,避免拼写错误。replicaof、sentinel monitor),必须替换为 192.168.10.101。redis.service,但启动命令不同(主从用 redis-server,哨兵用 redis-sentinel),需注意区分。按此步骤执行,即可完成 主机名修正后 的 redis 主从 + 哨兵集群部署。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论