首页 > 数据库 >Redis-多机数据库-Sentinel

Redis-多机数据库-Sentinel

时间:2023-01-12 11:44:46浏览次数:36  
标签:__ Redis 命令 多机 Sentinel 服务器 下线 连接

Sentinel

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

 

初始化Sentinel的最后一步是创建连向被监视主服务器的网络连接,Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关的信息。

对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:

  • 一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令回复。
  • 另一个是订阅连接,这个连接专门用于订阅主服务器的__sentinel__:hello频道。

Sentinel默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息。主服务器会将从服务器的信息告知Sentinel。

当Sentinel发现主服务器有新的从服务器出现时,Sentinel会为这个新的从服务器创建相应的实例结构,还会创建连接到从服务器的命令连接和订阅连接。

在创建命令连接之后,Sentinel在默认情况下,会以每十秒一次的频率通过命令连接向从服务器发送INFO命令,获取从服务器与主服务器的连接状态和复制状态。

在默认情况下,Sentinel会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送PUBLISH命令,包括Sentinel本身的信息和主服务器信息。

当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送以下命令:SUBSCRIBE __sentinel__:hello

Sentinel对__sentinel__:hello频道的订阅会一直持续到Sentinel与服务器的连接断开为止。

这也就是说,对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的__sentinel__:hello频道发送信息,又通过订阅连接从服务器的__sentinel__:hello频道接收信息。

对于监视同一个服务器的多个Sentinel来说,一个Sentinel发送的信息会被其他Sentinel接收到,这些信息会被用于更新其他Sentinel对发送信息Sentinel的认知,也会被用于更新其他Sentinel对被监视服务器的认知。

Sentinel在连接主服务器或者从服务器时,会同时创建命令连接和订阅连接,但是在连接其他Sentinel时,却只会创建命令连接,而不创建订阅连接。这是因为Sentinel需要通过接收主服务器或者从服务器发来的频道信息来发现未知的新Sentinel,所以才需要建立订阅连接,而相互已知的Sentinel只要使用命令连接来进行通信就足够了。


检测主观下线状态

在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令,并通过实例的回复来判断实例是否在线。

实例对PING命令的回复可以分为以下两种情况:

  • 有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种。
  • 无效回复:实例返回除+PONG、-LOADING、-MASTERDOWN三种回复之外的其他回复,或者在指定时限内没有返回任何回复。

用户设置的down-after-milliseconds选项的值,不仅会被Sentinel用来判断主服务器的主观下线状态,还会被用于判断主服务器属下的所有从服务器,以及所有同样监视这个主服务器的其他Sentinel的主观下线状态。

down-after-milliseconds选项另一个需要注意的地方是,对于监视同一个主服务器的多个Sentinel来说,这些Sentinel所设置的down-after-milliseconds选项的值也可能不同,因此,当一个Sentinel将主服务器判断为主观下线时,其他Sentinel可能仍然会认为主服务器处于在线状态。


检查客观下线状态

当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。

Sentinel使用:SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid> 命令询问其他Sentinel是否同意主服务器已下线。

根据其他Sentinel发回的SENTINEL is-master-down-by-addr命令回复,Sentinel将统计其他Sentinel同意主服务器已下线的数量,当这一数量达到配置指定的判断客观下线所需的数量时,Sentinel会将主服务器实例结构flags属性的SRI_O_DOWN标识打开,表示主服务器已经进入客观下线状态。


选举领头Sentinel

当发现主服务器客观下线,则要求其他Sentinel将自己选举为零头Sentinel,率先得到超过半数的回复的成为零头Sentinel。


故障转移

在选举产生出领头Sentinel之后,领头Sentinel将对已下线的主服务器执行故障转移操作,该操作包含以下三个步骤:

  • 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。
  • 让已下线主服务器属下的所有从服务器改为复制新的主服务器。
  • 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。

 

标签:__,Redis,命令,多机,Sentinel,服务器,下线,连接
From: https://www.cnblogs.com/gcr277/p/17044688.html

相关文章

  • redis 中的 list
    lpushK1V1V2V3  左边加入list  rpushk1v1v2v3右边加入listlpopk1左边吐出一个值rpopk1右边吐出一个值lrangek10-1输出list中的值从左到右 0......
  • Redis-使用备忘
    Redis-使用备忘基本介绍Redis(RemoteDictionaryServer),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并......
  • Redis做缓存和SpringCache缓存
    记录一下Redis做缓存和SpringCache缓存的区别1.Redis做缓存的话,相当于是一个第三方缓存,所以项目重启之后缓存数据还是存在的2.SpringCache作缓存的话是建立在JVM上的,所以......
  • 《Spring in action 4》(十一)SSM + Redis
    SSM+Redis文章目录​​SSM+Redis​​​​SpringDataRedis​​​​项目整合​​​​项目结构​​​​InitWebApplication​​​​RootConfig​​​​ServletCofig.xml​......
  • Redis-多机数据库-复制
    复制在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的......
  • ThinkPHP5 + predis 环境配置
     首先,下载Predis源代码,地址:https://github.com/nrk/predis/tree/master。将代码至于/vendor  目录下,代码结构如下:  2.创建Redis.php文件【方便引用】路径:\thinkphp......
  • redis连接出现问题的解决方案【待完善】
    项目中最近出现多次下列错误:Connectiontimedoutreaderroronconnection可以看出来,上述问题都是因为连接失败或者在失败的连接上操作出错,因此需要增加重试连接的......
  • redis 中的 字符串
    String是redis中的最基本的类型,为二进制安全 ,意味着String可以表示各种类型 一个字符串value最大为521Msetk1v100setk2v200get命令根据key取值getk1 ......
  • redis本地启动方式
    redis在本地进行启动的方式 第一种使用cmd命令行进行过操作在本地配置好redis之后,启动的话是比较简单的 1-首先打开cmd运行界面 2-定位到本地redis目录 3-运行命......
  • Redis-单机数据库-服务器
    服务器命令请求的执行过程客户端发送命令请求当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:读取套接字中......