redis中的Sentinel详解

Redis Sentinel是高可用解决方案,负责主服务器选举和故障转移。Sentinel启动时会初始化redis服务器,监视主服务器并创建网络连接。当主服务器下线,Sentinel会选择一个从服务器晋升为主,并使旧主成为新主的从服务器。Sentinel通过定期发送INFO命令获取服务器信息,与其他Sentinel通信以协调故障转移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以后还是要好好写博客,把好东西或者是在工作中遇到的问题记录下来

菜鸡的提升之路

最近在看《redis的设计与实现》,这本书比较底层,应用说的很好,主要还是对redis底层的详解吧,个人觉得很不错,还是很好看的一本书,特别是刚开始对redis底层的各种数据结构的介绍,步步升入。。

闲话少说,不如正题

sentinel

sentinel(哨兵)是redis高可用的解决方案。它的本质是一个运行在特殊模式下的redis服务器。
sentinel做的主要的工作是

  1. 主服务器选举:sentinel系统会挑选server1属下的一个从服务器,并将这个从服务器提升为主服务器
  2. 故障转移:向从服务器发送(slave of no one)命令,将从服务器提升为主服务器。从服务器发送复制指令,(sync,psync),当所有的从服务器完成复制新的服务器时,故障转移操作执行完毕
  3. sentinel还会继续监视已经下线的server1,并在它重新上线时,将他设置为新的主服务器的从服务器。

sentinel服务初始化

sentinel其实就是一个运行在特殊模式下的redis服务器。一个sentinel启动时,他需要执行以下步骤

  • 初始化redis服务器
  • 将普通的redis服务器使用的代码替换成sentinel专用代码
  • 初始化sentinel的状态
  • 根据给定的配置文件,初始化sentinel的监视主服务器列表
  • 创建连向主服务器的网络连接

在这里插入图片描述

redis向主redis服务器创建通信的主要步骤如下:

  1. 初始化setinel状态的master属性
  2. 创建连向主服务器的网络连接
  3. 获取主服务信息
  4. 获取从服务信息
  5. 向主服务器和从服务器发送消息
  6. 接收来自主服务器和从服务器的频道消息
  7. 更新sentinels字典
  8. 创建连向其他sentinel的连接
  9. 检查客观下线状态
  10. 选取领头sentinel
  11. 故障转移
    a. 选出新的主服务器
    b 修改从服务器的复制目标
    c. 将旧的主服务器变为从服务器

下面我将简述这几个过程的具体如何操作的。

初始化sentinel的master属性

master

创建连向主服务器的网络连接

sentinel会创建两个连向主服务器的异步网络连接

  1. 一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令服务
  2. 另一个是订阅连接,这个连接专门用于订阅主服务器的_sentinel_:hello频道

创建连接

获取主服务器信息

sentinel默认以10秒一次的频率,通过命令连接向被监控的服务器发送Info命令,并通过分析INFO命令的回复来获取主服务器当前的信息

#server

run_id:8979803798379273980987980yhiuh979i7we678

#replication
role:master

slave0:ip=127.0.0.1,port=11111,state=online,offset=43,lag=0
slave1:ip=127.0.0.1,port=22222,state=online,offset=43,lag=0
slave2:ip=127.0.0.1,port=33333,state=online,offset=43,lag=0

sentinel向带有三个从服务器的主服务器发送Info命令

获取从服务器信息

当sentinel发生主服务器与新的从服务器出现时,sentinel除了会为这个新的从服务创建相应的实例结构之外,sentinel还会创建连接到从服务器的命令连接和订阅连接

sentinel与各个从服务器建立命令连接和订阅连接

创建连向其他sentinel命令连接

各sentinel之间的网络连接

故障转移

选取领头的sentinel,然后对故障进行转移

  • 在下线服务器的从服务器中挑选一个作为新的主服务器
  • 已下线的服务器下的其他从服务器复制新的主服务器
  • 已下线的主服务器再上线的时候会作为新服务器的从服务器0.

重点知识掌握

  1. sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式不同的命令表,所以sentinel模式能够使用命令和普通redis服务器能够使用的命令不同
  2. sentinel会读入用户指定的配置文件,为每个要被监视的服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接。
  3. 在一般情况下,sentinel以每十秒一个的频率向被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者sentinel正在对主服务器做故障转移时,sentinel向从服务器发送Info命令的频率会改为每秒一次
  4. 对于监视同一主服务器和从服务器的多个sentinel来说,他们会以每两秒一次的方式通过向被监视的服务器的_sentinel_:hello频道发送消息来向其他sentinel宣告自己的存在
  5. 每个sentinel也会从_sentinel_:hello频道接收其他sentinel发来的消息,并根据这些信息为其他的sentinel创建实例结构,以及连接命令
  6. sentinel会与主服务器创建命令连接和订阅连接,sentinel和sentinel之间只能通过命令连接
  7. sentinel以每秒一次的频率向实例(包括主服务器,从服务器,其他sentinel)发送ping命令,并根据实例对ping的命令回复来判断实例是否在线当一个实例在指定时长中连接向sentinel发送无效回复的时候,sentinel会将这个实例判断为主观下线
  8. 当sentinel将主服务器判断为主观下线的时候,他会想同样监视这台主服务器的sentinel询问,看它是否支持主服务器的下线。
  9. 当sentinel搜集到足够多的主观下线投票时,他会将主服务器下线,并发起一次主服务器的故障转移
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值