这里我找了网上一些针对sentinel理解的文章了 https://www.cnblogs.com/duanxz/p/4701831.html

使用redis sentinel一般是多个sentinel组成的,防止单点故障

概述

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

它的主要功能有以下几点

  • 不时地监控redis是否按照预期良好地运行;

  • 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);

  • 能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。


  • Sentinel支持集群
    很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要将sentinel集群,这样有几个好处:

  • 即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;

  • 如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题);

  • 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。

  • Sentinel版本
    Sentinel当前最新的稳定版本称为Sentinel 2(与之前的Sentinel 1区分开来)。随着redis2.8的安装包一起发行。安装完Redis2.8后,可以在redis2.8/src/里面找到Redis-sentinel的启动程序。

强烈建议:

如果你使用的是redis2.6(sentinel版本为sentinel 1),你最好应该使用redis2.8版本的sentinel 2,因为sentinel 1有很多的Bug,已经被官方弃用,所以强烈建议使用redis2.8以及sentinel 2。

什么是Sentinel

Redis Sentinel是一个用来监控redis集群中节点的状态,不用来存储数据。当集群中的某个节点有故障时,可以自动的进行故障转移的操作。通常为了保证sentinel的高可用,sentinel也会部署多个。sentinel的结构图如下所示:
file

client客户端只要去链接sentinel就能返回当前可用的master

其原因是:

redis sentine中的3个定时任务

在redis sentinel中,一共有3个定时任务,通过这些任务,来发现新增节点和节点的状态。

  1. 每10秒每个sentinel节点对master节点和slave节点执行info操作:
    file

    sentine 会从 info中获取到对应的从节点和主节点信息,从而发现新增节点和节点的状态

  2. 每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息
    file

    这个是主要用来判断主节点的状态

  3. 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
    file

    这个也是用来判断各个节点的状态和3个sentinel节点之间的状态

主观下线和客观下线

  • 主观下线:当前sentintel节点认为某个redis节点不可用。

  • 客观下线:所有sentinel节点认为某个redis节点不可用。

故障转移过程

当多个sentinel认为master节点不可用,会进行故障转移操作,如下图所示:
file

  1. 领导者选举

作用:选举出一个sentenel节点作为领导者去进行故障转移操作。

过程:

1). 每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者。

2). 收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝。

3). 如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者。

4). 如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举。

  1. 选出新的master节点

redis sentinel会选一个合适的slave来升级为master,那么,如何选择一个合适的slave呢?顺序如下:

1). 选择slave-priority最高的slave节点(默认是相同)。

2). 选择复制偏移量最大的节点。

3). 如果以上两个条件都不满足,选runId最小的(启动最早的)。

  1. 更改slave节点的master节点

当选举出新的master节点后,会将其余的节点变更为新的master节点的slave节点,如果原有的master节点重新上线,成为新的master节点的slave节点。

  1. 通知客户端

当所有节点配置结束后,sentinel会通知客户端节点变更信息。

  1. 客户端连接新的master节点

客户端收到节点信息后,会连接新的master节点。这里predis已经帮我们处理了