尚硅谷redis7 63-69 redis哨兵监控之理论简介

63 redis哨兵监控之理论简介

什么是哨兵

master挂了如何办?从机原地待命。此时数据只能读取不能更新。因此需要:

吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,

哨兵的作用

1、监控redis运行状态,包括master和slave

2、当master down机,能自动将slave切换成新master

如何使用哨兵

主从监控 监控主从redis库运行是否正常

Sentinel 实时监控 Redis 的主从节点运行状态,检测节点是否宕机或失联。

消息通知 哨兵可以将故障转移的结果发送给客户端

当发生主从切换后,Sentinel 会将新的主节点信息通知给客户端或相关服务,确保其连接到正确的主节点。

故障转移 如果Master异常,则会进行主从切换,将其中一个Slave作为新Master

Sentinel 发现主节点(Master)宕机,并经多个 Sentinel 实例协商确认后,会自动将其中一个从节点(Slave)提升为新的主节点,并将其他从节点重新配置为复制新的主节点。

配置中心 客户端通过连接哨兵来获得当前Redis服务的主节点地址

客户端可以通过连接 Sentinel 获取当前可用的主节点地址,而不需要手动修改配置,从而实现动态主节点发现。

64 redis哨兵监控之案例实操1

3个哨兵 自动监控和维护集群,不存放数据,只是吹哨人

1主2从 用于数据读取和存放

为什么要有 3 个 Sentinel 哨兵?

1.防止一个哨兵挂了,无法实现监控

2.基数好投票

Redis Sentinel 使用一种简单的共识机制来避免误判【有时候主机并不是真死了,可能是网络不好】。哨兵集群通过"投票"来决定主节点是否真的故障。这个过程称为:

故障主观判断(sdown) → 故障客观判断(odown)

  • 每个 Sentinel 实例独立判断主节点是否故障(sdown

  • 当大多数 Sentinel 都认为主节点不可用时,才会触发故障转移(odown)

Redis 集群中通常部署 3 个 Sentinel(哨兵),是为了实现高可用的主从切换机制。哨兵之间通过投票机制达成共识,判断主节点是否真的故障,并协调自动故障转移。3 个是最小可容忍 1 个故障的投票集,是安全性与资源使用的最佳平衡。

由于硬件问题,无法用6台机子去模拟过程,因此6379:master,6390、6381:slave。同时三个哨兵和6379共用一个主机。

先看看/opt目录下默认的sentinel.conf文件【哨兵配置文件】的内容

将此sentinel.conf文件拷贝到myredis文件夹下

重点参数项说明

bind:服务监听地址,用于客户端连接,默认本机地址

daemonize:是否以后台daemon方式运行

protected-mode:安全保护模式

port:端口

logfile:日志文件路径

pidfile:pid文件路径 用于指定 进程 ID 文件(PID 文件) 的保存路径。

dir:工作目录

设置要监控的Master服务器

sentinel monitor <master-name> <ip> <redis-port> <quorum>

参数 说明
<master-name> 主节点的名称(逻辑标识,可自定义)
<ip> 要监控的主节点的 IP 地址
<redis-port> 主节点的端口
<quorum> 最少有多少个 Sentinel 认为主节点挂了,才会进行故障转移(投票数量)

sentinel auth-pass <master-name> <password> 配置主节点认证密码的重要命令,用于确保 Sentinel 在连接主节点时通过密码验证。

参数 说明
<master-name> sentinel monitor 中配置的主节点名称保持一致
<password> 主节点 Redis 的访问密码(即 requirepass 设置的密码)

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel auth-pass mymaster myRedisPassword

这个配置告诉 Sentinel:

"连接并监控名为 mymaster 的主节点时,需要使用密码 myRedisPassword。"

61 redis哨兵监控之案例实操2

我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,在sentinel集群环境下需要多个sentinel互相沟通来确认某个master是否真的死了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个sentinel认为这个master有故障,才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因,导致无法连接master,而此时master并没有出现故障,所以,这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。

其他参数配置

  • sentinel down-after-milliseconds <master-name> <milliseconds>:
    • 指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
  • sentinel parallel-syncs <master-name> <nums>:
    • 表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
  • sentinel failover-timeout <master-name> <milliseconds>:
    • 故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
  • sentinel notification-script <master-name> <script-path> :
    • 配置当某一事件发生时所需要执行的脚本
  • sentinel client-reconfig-script <master-name> <script-path>:
    • 客户端重新配置主节点参数脚本

66 redis哨兵监控之案例实操3

如果你使用的是 redis-sentinel 可执行文件(或者你有一个指向 redis-server 的符号链接,名为 redis-sentinel),你可以通过以下命令来以 Sentinel 模式运行:

redis-sentinel /path/to/sentinel.conf

否则,你也可以直接使用 redis-server 可执行文件,并通过 Sentinel 模式启动,如下所示:

redis-server /path/to/sentinel.conf -- sentinel

哨兵默认监听 TCP 端口 26379,因此要让哨兵正常工作,你的服务器必须开放 26379 端口,以接收来自其他哨兵实例 IP 地址的连接。否则,哨兵之间将无法通信,也无法就该执行什么操作达成一致,故障转移也将无法进行。

本案例sentinel文件通用配置

由于机器硬件关系,我们的3个哨兵都同时配置进一台虚拟机中【例如:192.168.111.169】

sentinel26379.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 26379

logfile "/myredis/sentinel26379.log"

pidfile /var/run/redis-sentinel26379.pid

dir /myredis

sentinel monitor mymaster 192. 168. 111. 169 6379 2

sentinel auth-pass mymaster 111111

配置项 含义
bind 0.0.0.0 监听所有网卡(对外可访问)
daemonize yes 以守护进程方式运行(后台运行)
protected-mode no 关闭保护模式(确保你已配置防火墙,否则不安全)
port 26379 Sentinel 的监听端口,默认就是这个
logfile 日志文件路径(建议确保 /myredis 目录存在)
pidfile PID 文件路径(注意你原来写的是 redis-sentine126379. pid,有空格和拼写错)
dir Sentinel 持久化信息的工作目录
sentinel monitor 配置要监控的主节点(名称、IP、端口、投票数)
sentinel auth-pass Sentinel 连接主节点使用的认证密码

sentinel26380.conf

sentinel26381.conf

请看一眼sentinel26379.conf、sentinel26380.conf、sentinel26381.conf我们自己填写的内容

master主机配置文件说明

67 redis哨兵监控之案例实操4

哨兵内容部分

启动3个哨兵,完成监控

redis-sentinel sentinel26379.conf -- sentinel

redis-sentinel sentinel26380.conf -- sentinel

redis-sentinel sentinel26381.conf -- sentinel

启动3个哨兵后再测试一次主从复制

原有的master挂了

两台从机数据是否OK ok

是否会从剩下的2台机器上选出新的master 是,master变为6381

之前down机的master机器重启回来,谁将会是新老大?会不会双master冲突? 重启回来会变为从机。

69 reids哨兵监控之案例实操6

broken pipe

6379突然断开后会报两种错误:

6379断开后,6380先是会报错,但过一会又能正常使用

这两种错误几乎是一样的原因

认识broken pipe

pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据。当该管道从另一端突然关闭时,会发生数据突然中断,即是broken.对于socket来说,可能是网络被拔出或另一端

的进程崩溃

解决问题

其实当该异常产生的时候,对于服务端来说,并没有多少影响。因为可能是某个客户端突然中止了进程导致了该错误

总结 Broken Pipe

这个异常是客户端读取超时关闭了连接,这时候服务器端再向客户端已经断开的连接写数据时就发生了broken pipe异常!

谁是master

6381被选为新master,上位成功,以前的6379从master降级变成了slave

6380还是slave,只不过换了个新老大6381(6379变6381),6380还是slave

注意!6379后续可能会变成从机,需要设置访问新主机的密码,请设置masterauth项访问密码为111111,不然后续可能报错master_link_status:down

对比配置文件

由于主机从机的位置互换,检查配置文件会发现里面有关主从机配置的参数也会发生改变:

文件的内容,在运行期间会被sentinel动态进行更改

Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

相关推荐
cookqq13 分钟前
mongodb源码分析session接受客户端find命令过程
数据库·sql·mongodb·nosql
小天努力学java1 小时前
Java -- 并发编程
java·数据库
江沉晚呤时1 小时前
深入了解 C# 异步编程库 AsyncEx
java·前端·数据库·c#·.netcore
有很多梦想要实现1 小时前
Nest全栈到失业(四):半小时图书管理系统-Book
开发语言·前端·javascript·数据库·typescript·webstorm
幼儿园口算大王1 小时前
Mysql中索引B+树、最左前缀匹配
数据库·b树·mysql
hixiaoyang1 小时前
MVCC 原理与并发控制实现
运维·服务器·数据库
大新新大浩浩2 小时前
k8s上运行的mysql、mariadb数据库的备份记录
数据库·mysql·kubernetes
MuYiLuck2 小时前
【redis实战篇】第六天
数据库·redis·缓存
敲键盘的小夜猫2 小时前
Milvus索引操作和最佳实践避坑指南
数据库·oracle·milvus
编程自留地3 小时前
第12次04 :首页展示用户名
数据库·python·django·商城