目录
一:介绍
1:概述
2:实现原理
二:资源列表
三:基础环境
四:部署Redis服务
1:部署Redis服务
2:编写服务脚本
3:修改配置文件
3.1:Master节点
3.2:Slave01节点
3.3:Slave02节点
3.4:主从配置
3.5:主从验证
五:部署哨兵节点
1:部署哨兵
2:修改配置文件
3:编写服务脚本
4:查看哨兵状态信息
5:故障转移
6:查看哨兵epoch
一:介绍
1:概述
Redis哨兵(Sentinel)是Redis官方提供的高可用性解决方案,用于管理多个Redis实例(主从架构),实现以下核心功能:
监控:持续检查主节点和从节点的运行状态(是否存活、延迟等)。
自动故障转移(Failover):当主节点故障时,自动选举一个从节点晋升为新主节点,并调整其他从节点的配置。
配置提供与通知:客户端可以通过哨兵获取当前的主节点地址,并在故障转移后收到通知。
应用场景:
适用于需要高可用的Redis主从架构,避免单点故障导致服务中断。
2:实现原理
哨兵节点的配置文件中需要添加如下配置:
sentinel monitor master-name ip port quorum
其中,sentinel monitor 是配置哨兵的命令,接着是主节点的名称、IP 地址和端口号,最后的 quorum 用来表示执行故障恢复操作之前至少需要几个哨兵节点同意。一个哨兵节点可以同时监控多个 Reids 主从系统,多个哨兵节点也可以同时监控同一个 Redis 主从系统。
配置修改好之后,就可以启动哨兵节点了。当哨兵节点启动时,会与要监控的主数据库(master)建立连接,连接建立之后,哨兵会定时地执行以下 3 个任务:
(1)每 10 秒哨兵会向主节点和从节点发送 info 命令。
(2)每 2 秒哨兵会向主节点和从节点发送自己的信息。
(3)每 1 秒哨兵会向主节点、从节点和其他哨兵发送 ping 命令。
这 3 个定时任务贯穿哨兵进程的整个生命周期,非常重要。
领导者哨兵节点执行故障恢复可以保证同一时间内只有一个哨兵节点在执行故障恢复,避免多个节点同时操作。选举领导者哨兵的过程适用了 Raft 算法,具体的过程如下:
(1)发现主节点客观下线的哨兵节点(简称为 A)向每个哨兵节点发送命令,要求对方选自己成为领导者哨兵。
(2)如果目标哨兵节点没有选过其他哨兵,则会同意将 A 设置为领导者哨兵。
(3)如果 A 发现有超过一半并且超过 quorum 参数值的哨兵节点同意选自己成为领导者哨兵,那么 A 将成为领导者哨兵。
(4)当有多个哨兵同时参选时,有可能会出现没有任何节点当选的可能。如果出现此种情况,那么会等待一个随机时间重新开始下一轮参选,直到选出领导者哨兵为止。
选出领导者哨兵后,领导者哨兵会对主节点进行故障转移恢复。恢复过程可以分为以下 3 个步骤:
(1)在所有从节点中挑选一个节点作为新的主节点。挑选的基准是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点;如果优先级无法区分,则选择赋值偏移量最大的从节点,如果仍无法区分,则选择 runid 最小的从节点。
(2)更新主从状态。通过 slaveof no one 命令,让选出来的从节点成为主节点,通过 slaveof 命令让其他节点成为其从节点。
(3)将已经停止服务的旧的主节点更新为新的主节点的从节点,当此节点恢复后,能够自动以从节点的身份继续服务。
二:资源列表
操作系统 | 配置 | IP | 主机名 | 角色 |
---|---|---|---|---|
OpenEuler24 | 2C4G | 192.168.207.131 | sentinel01 | 哨兵节点 |
OpenEuler24 | 2C4G | 192.168.207.165 | sentinel02 | 哨兵节点 |
OpenEuler24 | 2C4G | 192.168.207.166 | sentinel03 | 哨兵节点 |
OpenEuler24 | 2C4G | 192.168.207.167 | master | 主节点 |
OpenEuler24 | 2C4G | 192.168.207.168 | slave01 | 从节点 |
OpenEuler24 | 2C4G | 192.168.207.169 | slave02 | 从节点 |
三:基础环境
#关闭防火墙
systemctl stop firewalld
setenforce 0
systemctl disable firewalld#关闭内核机制
vim /etc/selinux/config
SELINUX=disabled#修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
bash
四:部署Redis服务
1:部署Redis服务
Master, slave1, slave2节点上操作
#部署环境
dnf -y install gcc*
#上传安装包redis-6.2.4.tar.gz
tar zxvf redis-6.2.4.tar.gz
cd redis-6.2.4/
#编译安装
make && make PREFIX=/usr/local/redis install
#检查安装目录
ls /usr/local/redis/
#做软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
#创建配置文件目录
mkdir /etc/redis
#适用默认配置文件
cp redis.conf /etc/redis/6379.conf
2:编写服务脚本
cd /etc/systemd/system
vim redis.service
[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
3:修改配置文件
3.1:Master节点
vim /etc/redis/6379.confbind 127.0.0.1 192.168.10.201daemonize yes #启动守护进程logfile "/var/log/redis_6379.log" #日志文件
#启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
#查看监听端口
netstat -anpt | grep 6379
3.2:Slave01节点
vim /etc/redis/6379.confbind 127.0.0.1 192.168.10.202daemonize yes #启动守护进程logfile "/var/log/redis_6379.log" #日志文件
#启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
#查看监听端口
netstat -anpt | grep 6379
3.3:Slave02节点
vim /etc/redis/6379.confbind 127.0.0.1 192.168.10.203daemonize yes #启动守护进程logfile "/var/log/redis_6379.log" #日志文件
#启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
#查看监听端口
netstat -anpt | grep 6379
3.4:主从配置
在所有的从节点上操作slave01,slave02
vim /etc/redis/6379.confreplicaof 129.168.10.201 6379#IP地址和端口添加主库的IP和端口
#启动服务
systemctl start redis
#查看监听端口
netstat -anpt | grep 6379
3.5:主从验证
[root@sentinel01 ~]# redis-cli127.0.0.1:6379> info sentinel
Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master,status=ok,address=192.168.207.167:6379,slaves=2,sentinels=3
五:部署哨兵节点
1:部署哨兵
#部署环境
dnf -y install gcc* gcc-c++
#上传安装包redis-6.2.4.tar.gz
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
2:修改配置文件
[root@sentinel01 redis-6.2.4]# vim /etc/redis/6379.conf
sentinel monitor master 192.168.207.167 6379 2 # 末尾添加即可
bind 0.0.0.0 # 默认 75 行进行修改
daemonize yes # 默认 257 行进行修改
logfile "/var/log/redis_6379.log" #日志文件
- sentinel monitor:哨兵命令
- master:主节点名字
- 192.168.207.167 6379 2:主节点 IP 和端口,最后的 2 表示,当主节点出现故障,至少需要两个哨兵节点同意,才能判定主节点故障
3:编写服务脚本
cd /etc/systemd/system
vim redis.service
[Unit]
Description=Redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/6379.conf[Install]
WantedBy=multi-user.target
EOF#启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis#查看监听端口
netstat -anpt | grep 6379
4:查看哨兵状态信息
[root@sentinel01 ~]# redis-cli127.0.0.1:6379> info sentinel
Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master,status=ok,address=192.168.207.167:6379,slaves=2,sentinels=3
5:故障转移
当主节点出现故障时,故障发现和转移是由哨兵来控制的,此时会将主节点切换到其他从节点上。
下面手动模拟主节点出现故障,停止主节点上的 Redis 服务。具体操作如下:
[root@master ~]# systemctl stop redis
关掉主节点之后,等待一会时间,再次在 sentinel01 上查看哨兵系统状态将会发现,原来的主节点进行了切换。
127.0.0.1:6379> info sentinel
Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
###############################################################################
master0:name=master,status=ok,address=192.168.207.169:6379,slaves=2,sentinels=3
###############################################################################
当主节点进行切换后,一个从节点变成了主节点。此时从节点数量仍然是 2,是因为在进行主从切换时,原来的故障的节点会被设置为新主的从节点,哨兵系统并不会对故障节点进行客观下线,而是认为该从节点一致存在。当故障修复之后,将会变为新的从节点投入适用。
6:查看哨兵epoch
对于哨兵节点,主要是epoch相关配置的变化,进行一次主从切换,epoch相关的参数都会加1
tail -9 /etc/redis/6379.conf