30、Redis 7系列:哨兵(sentinel)
一、官网
官网地址: High availability with Redis Sentinel | Redis
二、介绍
吹哨人巡查监控后台 master
主机是否出现故障。如果出现故障了,根据 投票数 自动将某一从库转为新主库,从而继续对外服务。俗称:无人值守运维。
三、作用
1、主从监控
监控主从 Redis
的运行是否正常
2、故障转移
如果 master
运行异常,会进行主从切换。将其中的一个 slave
作为新的 master
。
3、消息通知
哨兵可以将 故障转移 的结果发送给客户端。
4、配置中心
客户端通过哨兵来获得当前 Redis
服务的主节点地址。
四、案例演示
1、基本架构
- 3个哨兵: 自动监控和维护集群,不存放数据,只是吹哨人。
- 1主2从: 数据的读取和存放。
- 架构图如下:
2、案例步骤
(1)sentinel.conf
文件
在自定义的工作目录下新建或者拷贝一份 sentinel.conf
文件,名称绝对不能错。
# 命令
cd /opt/redis/redis-7.2.0/
cp sentinel.conf /home/ulanhada/customConfig/redis/
(2)sentinel.conf
重点参数项说明
# 1、服务监听地址,用于客户端连接。通常默认为本机。
bind
# 2、是否支持后台运行
daemonize
# 3、是否开启安全保护模式
protected-mode
# 4、端口
port
# 5、日志文件路径
logfile
# 6、pid文件路径
pidfile
# 7、工作目录
dir
# 8、设置要监控的master服务器
# master-name:master的名字
# ip:master的IP
# redis-port:master的端口
# quorum:表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数。
# 网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,在sentinel集群环境下需要多个sentinel互相沟通来确认某个master是否真的死了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个sentinel认为这个master有故障,才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因,导致无法连接master,而此时master并没有出现故障,所以,这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 9、master设置了密码,连接master的服务密码
# master-name:master的名字
# password:master的服务密码
sentinel auth-pass <master-name> <password>
拓展:
# 1、指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
sentinel down-after-milliseconds <master-name> <milliseconds>
# 2、表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
sentinel parallel-syncs <master-name> <numreplicas>
# 3、故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
sentinel failover-timeout <master-name> <milliseconds>
# 4、配置当某一事件发生时所需要执行的脚本
# script-path:脚本绝对路径
sentinel notification-script <master-name> <script-path>
# 5、客户端重新配置主节点参数脚本
# script-path:脚本绝对路径
sentinel client-reconfig-script <master-name> <script-path>
(3)sentinel
文件通用配置
正常来说,3个哨兵应该是三台服务器。但是由于硬件问题,本次案例将3个哨兵部署在同一台服务器上。
分别编辑3个配置文件的内容如下:
sentinel26379.conf
# 服务监听地址,用于客户端连接。通常默认为本机。
bind 0.0.0.0
# 是否支持后台运行
daemonize yes
# 是否开启安全保护模式
protected-mode no
# 端口
port 26379
# 日志文件路径
logfile /home/ulanhada/customConfig/redis/sentinel26379.log
# pid文件路径
pidfile /home/ulanhada/customConfig/redis/redis-sentinel26379.pid
# 工作目录
dir /home/ulanhada/customConfig/redis
# 设置要监控的master服务器
sentinel monitor mymaster 192.168.250.130 6379 2
# master设置了密码,连接master的服务密码
sentinel auth-pass mymaster 123456
sentinel26380.conf
# 服务监听地址,用于客户端连接。通常默认为本机。
bind 0.0.0.0
# 是否支持后台运行
daemonize yes
# 是否开启安全保护模式
protected-mode no
# 端口
port 26380
# 日志文件路径
logfile /home/ulanhada/customConfig/redis/sentinel26380.log
# pid文件路径
pidfile /home/ulanhada/customConfig/redis/redis-sentinel26380.pid
# 工作目录
dir /home/ulanhada/customConfig/redis
# 设置要监控的master服务器
sentinel monitor mymaster 192.168.250.130 6379 2
# master设置了密码,连接master的服务密码
sentinel auth-pass mymaster 123456
sentinel26381.conf
# 服务监听地址,用于客户端连接。通常默认为本机。
bind 0.0.0.0
# 是否支持后台运行
daemonize yes
# 是否开启安全保护模式
protected-mode no
# 端口
port 26381
# 日志文件路径
logfile /home/ulanhada/customConfig/redis/sentinel26381.log
# pid文件路径
pidfile /home/ulanhada/customConfig/redis/redis-sentinel26381.pid
# 工作目录
dir /home/ulanhada/customConfig/redis
# 设置要监控的master服务器
sentinel monitor mymaster 192.168.250.130 6379 2
# master设置了密码,连接master的服务密码
sentinel auth-pass mymaster 123456
(4)Redis
实例配置
-
架构图
-
master(6379)配置文件
6379
后续可能会变成 从机,需要设置访问新主机的密码, 请设置masterauth
项访问密码为123456
。
不然后续可能报错 master_link_status:down -
master(6380)配置文件
-
master(6381)配置文件
注: 具体 IP地址 和 密码 根据本地真实情况,酌情修改。
(5)启动3台 Redis
实例
master
slave 1
slave 2
(6)启动3台哨兵
# 启动命令
redis-sentinel sentinel26379.conf --sentinel
redis-sentinel sentinel26380.conf --sentinel
redis-sentinel sentinel26381.conf --sentinel
同时,会生成相对应的 log文件 和 pid文件 。
打开一个 log文件
查看里面内容,试一下信息记录,后期遇到报错,也来到此处查看。
vim sentinel26379.log
查看 conf文件 内容,配置信息在原有的基础上新增加 哨兵 的配置。
vim sentinel26379.conf
(7)shutdown
master
服务器
模拟 master
异常,此时此刻我们在 slave
上查询数据,会出现如下错误:
此时此刻, 哨兵 内部正在进行着激烈的投票选举 新的 master
,稍等片刻,进行网络的重新读取和规划,然后再次读取数据:
上图所示,发现 端口:6381 黄袍加身,成为了新的 master
。
查看一下日志:sentinel26379.log
-
如果,
6379
重启的话,会不会出现双master
冲突呢?
验证如下:
上图所示,6379
重启归来已经是slave
的身份,如今大势已去,大清已经亡了~
6379
如今已经不写,只能读了。
-
新的
master
是否可以保证主从复制呢?
验证如下:
(8)对比配置文件 -
6379
自动新增加了一部分配置,主要内容就是让 6381 作为自己的master
。还有持久化RDB
的配置。
vim redis6379.conf
-
6380
自动修改并增加一些配置文件。
-
6381
由于自己变成master
,则会自动将replicaof
配置内容删除。
-
sentinel配置
监控的master
自动修改为新的master
。
自动新增加的配置信息。
-
结论
配置文件内容,在运行期间会被sentinel
动态进行修改。
当master
和slave
在身份进行改变后,master_redis.conf
,slave_redis.conf
,sentinel.conf
的内容都会发生改变。及master_redis.conf
中会多一行slaveof
的配置,sentinel.conf
监控的目标也会随之切换。
3、哨兵的运行流程和选举原理
(1)概括:
当一个主从配置中的 master
失效之后,sentinel
会选举出一个新的 master
用于自动接替原 master
的工作。主从配置中的其他 redis
服务器自动向新的 master
同步数据。
一般建议 sentinel
采取奇数台,少数服从多数,防止某一台 sentinel
无法连接到 master
而导致误切换。
(2)下线方式
- SDown主观下线(Subjectively Down)
单个sentinel
自己主观上,检测到的关于master
的状态。从sentinel
角度来看,如果发送了PING心跳后,在一定的时间内没有收到合法的回复,就达到了SDOWN
的条件。
sentinel
配置文件中的sentinel down-after-milliseconds
设置了判断主观下线的时间长度。 - ODown客观下线(Objectively Down)
需要一定数量的sentinel
,多个哨兵达成一致意见,才能认为master
客观上宕掉。
# quorum这个参数是进行客观下线的一个依据,法定人数/法定票数
sentinel monitor <master-name> <ip> <redis-port> <quorum>
至少有 quorum
个 sentinel
认为这个 master
有故障才会对这个 master
进行下线以及故障转移。因为有的时候,某个 sentinel
节点可能因为自身网络原因导致无法连接 master
,而此时 master
并没有出现故障,所以这就需要多个 sentinel
都一致认为该 master
有问题,才可以进行下一步操作,这就保证了公平性和高可用。
(3)选举出领导者哨兵(兵王)
当主节点被判断客观下线后,各个哨兵节点会进行协商,先选举出一个 领导者哨兵节点(兵王) 进行failover(故障迁移)。
# 依次查看3个哨兵的日志,查看投票信息。
vim sentinel26379.log
vim sentinel26380.log
vim sentinel26381.log
找到如下日志,则为 领导者哨兵(兵王)。
- 领导者哨兵(兵王)是怎么选出来的?
Raft算法。
监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是 Raft算法 。
Raft算法 的基本思路: 先到先得:
即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。
(4)领导者哨兵(兵王)推动故障切换流程并选出新的 master
-
新主登基
选出某个slave
作为新的master
。
在剩下的都是健康的slave
情况下,选举的规则如下:
-
群臣俯首
一朝天子一朝臣。
执行slaveof no one
命令,让选出来的从节点成为新的主节点,并通过slaveof
命令,让其他节点成为其从节点。
Sentinel leader (兵王) 会对选举出的新master
进行slaveof no one
命令,将其提升为master
。
Sentinel leader (兵王) 向其他slave
发送命令,让剩余的slave
成为新master
主节点的slave
。 -
旧主拜服
将之前已下线的老master
设置为新选出的新master
的从节点。当老master
重新上线后,它会成为新master
的从节点。
Sentinel leader (兵王) 会将老master
降级为slave
,从而恢复正常工作。 -
总结
上述的failover
(故障迁移)操作均由sentinel
本身自动完成,无需人工干预。
五、总结
1、哨兵的使用建议
- 哨兵节点的数量应为多个。哨兵本身应该是集群,保证高可用。
- 哨兵节点的个数应该为奇数。
- 各个哨兵的配置保持一致,包括服务器硬件设备。以免影响公平的投票机制。
- 如果哨兵节点部署在
Docker
等容器上,一定要保证端口的正确映射。 - 哨兵集群+主从复制,并不能保证数据的零丢失。由于只有一台
master
,当master宕机之后,在哨兵选择出新master
之前,这之间存在一段空白时间。这段空白时间内,master
是不能存储数据的,所以有可能会出现数据的丢失。所以,接下来引出 Redis集群(cluster) 。
Redis集群(cluster) 在我的下一篇文章~~~
到这里 Redis 7系列:哨兵(sentinel) 就结束了!!!🎉🎉🎉
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎