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 动态进行修改。
    masterslave 在身份进行改变后, master_redis.confslave_redis.confsentinel.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>

至少有 quorumsentinel 认为这个 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) 就结束了!!!🎉🎉🎉
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值