redis-哨兵

redis-哨兵

简介

哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。

作用

  • 监控
    • 不断的检查master和slave是否正常运行。master存活检测、master与slave运行情况检测
  • 通知
    • 当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
  • 自动故障转移
    • 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址

启动并初始化哨兵

一、结构配置
  • ① 配置三个哨兵(26379、26380、26381)
  • ② 配置一个master(6379)和两个slave(6380和6381)
二、启动哨兵

​ 命令:redis-sentinel /path/yo/your/sentinel.confredis-server sentinel.conf --sentinel

​ conf配置文件如下

在这里插入图片描述

​ 当一个Sentinel启动时,需要执行以下步骤

  • 初始化服务器。
  • 将普通Redis服务器使用的代码替换成Sentinel专用代码。
  • 初始化Sentinel状态。
  • 根据给定的配置文件,初始化Sentinel的监视主服务器列表。
  • 创建连向主服务器的网络连接。
三、工作原理
① 监控
  • 获取各个sentinel的状态(是否在线)
  • 获取master的状态
    • master属性
      • runid
      • role:master
    • 各个slave的详细信息
  • 获取所有slave的状态(根据master中的slave信息)
    • slave属性
      • runid
      • role:slave
      • master_host、master_port
      • offset

在这里插入图片描述

② 通知阶段
  • 在默认情况下,Sentinel 会以每两秒一次的频率, 通过命令连接向所有被监视的主服务
    器和从服务器发送以下格式的命令:
    PUBLISH __sentine1__ :he11o "<s_ ip>,<s_ port>,<s_ runid>,<s_ epoch>,<m_ name>, <m_ip>,<m_ port>, <m_ epoch>"
  • 当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel 就会通过订阅连接,向服务器发送以下命令:
    SUBSCRIBE __sentinel__ :hello
    Sentinel对__ sentinel__ :hello 频道的订阅会一直持续到Sentinel与服务器的连接断开为止。这也就是说,对于每个与Sentinel连接的服务器,Sentinel 既通过命令连接向服务器的___ sentinel__ :hello 频道发送信息,又通过订阅连接从服务器的__ sentinel___ :hello
    频道接收信息。

在这里插入图片描述

③ 故障转移阶段
  • 主观下线

    • 在默认情况下,Sentinel 会以每秒一次的频率向所有与它创建了命令连接的实例(
      主服务器、从服务器、其他Sentinel在内)发送PING命令,并通过实例返回的PING
      回复来判断实例是否在线。
    • Sentinel配置文件中的down-after-milliseconds选项指定了Sentinel 判断实例进人主观下线所需的时间长度:如果一个实例在down-after-milliseconds毫秒内,连续向Sentinel 返回无效回复,那么Sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_ S_DOWN 标识,以此来表示这个实例已经进人主观下线状态。
  • 客观下线

    • 当Sentinel将-一个 主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一- 主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel 那里接收到足够数量的已下线判断之后,Sentinel 就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。
    • Sentinel使用:SENTINEL is-master-down-by-addr <ip> <port> <current_ epoch> <runid> 命令询问其他Sentinel是否同意主服务器已下线
  • 选举领头Sentinel

    当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel 会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法:

    • 所有在线的Sentinel 都有被选为领头Sentinel的资格,换句话说,监视同一个主服
      务器的多个在线Sentinel中的任意一 个都有可能成为领头Sentinel。
    • 每次进行领头Sentinel选举之后,不论选举是否成功,所有Sentinel的配置纪元(configuration epoch)的值都会自增一次。 配置纪元实际上就是一个计数器, 并没有
      什么特别的。
    • 在一个配置纪元里面,所有Sentinel都有一次将某个Sentinel设置为局部领头Sentinel的机会,并且局部领头一旦设置,在这个配置纪元里面就不能再更改。口每个发现主服务器进人客观下线的Sentinel都会要求其他Sentinel将自已设置为局部领头Sentinel。
    • 当一个Sentinel (源Sentinel)向另一个Sentinel (目标Sentinel)发送SENTINEL
      is-master-down-by-addr命令,并且命令中的runid参数不是*符号而是源
      Sentinel的运行ID时,这表示源Sentinel要求目标Sentinel将前者设置为后者的局
      部领头Sentinel。
    • Sentinel设置局部领头Sentinel的规则是先到先得:最先向目标Sentinel发送设置要
      求的源Sentinel将成为目标Sentinel的局部领头Sentinel,而之后接收到的所有设置
      要求都会被目标Sentinel拒绝。
    • 目标Sentinel在接收到SENTINEL is-master-down-by-addr 命令之后,将向源Sentinel返回一条命令回复,回复中的leader_ runid 参数和leader_ epoch参数分别记录了目标Sentinel的局部领头Sentinel的运行ID和配置纪元。
    • 源Sentinel在接收到目标Sentinel返回的命令回复之后,会检查回复中leader_epoch参数的值和自己的配置纪元是否相同,如果相同的话,那么源Sentinel 继续取出回复中的leader_ runid 参数,如果leader_ runid 参数的值和源Sentinel的运行ID一致,那么表示目标Sentinel将源Sentinel设置成了局部领头Sentinel。
    • 如果有某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel成为领头Sentinel。举个例子,在一个由10 个Sentinel组成的Sentinel 系统里面,只要有大于等于10/2+1=6个Sentinel将某个Sentinel设置为局部领头Sentinel,那么被设置的那个Sentinel就会成为领头Sentinel。
    • 因为领头Sentinel的产生需要半数以上Sentinel的支持,并且每个Sentinel在每个配置纪元里面只能设置一次局部领头Sentinel,所以在一个配置纪元里面,只会出现一个领头Sentinel。
    • 如果在给定时限内,没有一个Sentinel被选举为领头Sentinel,那么各个Sentinel将
      在一段时间之后再次进行选举,直到选出领头Sentinel为止。
  • 选出新的主服务器
    故障转移操作第一步要做的就是在已下线主服务器属下的所有从服务器中,挑选出一个状态良好、数据完整的从服务器,然后向这个从服务器发送SLAVEOF no one命令,将这个从服务器转换为主服务器。

    • 删除列表中所有处于下线或者断线状态的从服务器。
    • 删除列表中所有最近五秒内没有回复过领头Sentinel的INFO命令的从服务器。
    • 删除所有与已下线主服务器连接断开超过down-after-milliseconds * 10毫秒的从服务器: down-after-milliseconds选项指定了判断主服务器下线所需的
      时间,而删除断开时长超过down-after-milliseconds * 10毫秒的从服务器,则
      可以保证列表中剩余的从服务器都没有过早地与主服务器断开连接,换句话说,列表中
      剩余的从服务器保存的数据都是比较新的。
    • 领头Sentinel将根据从服务器的优先级,对列表中剩余的从服务器进行排序,并选出其中优先级最高的从服务器。
    • 如果有多个具有相同最高优先级的从服务器,那么领头Sentinel将按照从服务器的复制偏移量,对具有相同最高优先级的所有从服务器进行排序,并选出其中偏移量最大的从服务器(复制偏移量最大的从服务器就是保存着最新数据的从服务器)。
    • 如果有多个优先级最高、复制偏移量最大的从服务器,那么领头Sentinel将按照运行ID对这些从服务器进行排序,并选出其中运行ID最小的从服务器。

量最大的从服务器(复制偏移量最大的从服务器就是保存着最新数据的从服务器)。

  • 如果有多个优先级最高、复制偏移量最大的从服务器,那么领头Sentinel将按照运行ID对这些从服务器进行排序,并选出其中运行ID最小的从服务器。

  • 向其他slave发送slaveof 新masterIP端口

Redis Sentinel 执行故障转移的整个过程。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值