redis--哨兵(sentinel)

哨兵(监视别人工作)的作用:

  1. 监控:

    不断检测masterslave是否正常运行

  2. 通知:

    当被监控的服务器出现问题时,通知其他哨兵,客户端

  3. 自动故障转移

    断开masterslave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址

配置

redis提供的默认哨兵配置文件为sentinel.conf,常用配置包括:(部分和redis相同配置忽略)

  1. sentinel monitor mymaster 127.0.0.1 6379 2

    其中mymaster为自定义的名称,后面地址和端口号是要监视的master的,最后的2表示后面的投票至少2票就通过

  2. sentinel down-after-milliseconds mymaster 30000

    经过多久master没有反应就认为它S_DOWN(主观掉线)了,因为这是是某一个哨兵发现的,是这个哨兵的主观行为,后续这个哨兵会通知其他哨兵,其他哨兵也会去hellomaster,当有2个哨兵都认为它S_DOWN了之后,就确定该masterO_DOWN(客观掉线),大众的看法

  3. sentinel parallel-syncs mymaster 1

    设定一次可以有多少的slave能同时和新master进行同步

  4. sentinel failover-timeout mymaster 180000

    故障转移超时时间,同步超时时间?配置文件里的注释有点看不懂

监控阶段

  1. sentinel首先会查询master相关信息(info),随后建立cmd连接,根据得到的信息再去获取slave的信息
  2. sentinel之间通过pub/sub分享自己获取的信息

通知阶段

  1. sentinelmasterslave发送消息publish sentinel:hello......,来确认这些点工作是否正常
  2. sentinel向其他sentinel通知上述得到的结果

故障转移阶段

  1. 某个sentinel发现和master失去了连接,判断为S_DOWN,通知其他sentinel
  2. 其他sentinel也去尝试联系master,半数以上的sentinel认为master挂了后,判定为O_DOWN
  3. sentinel们竞选出一个负责处理此次事件的负责人,大家投票
  4. 负责人进行处理,挑选备选master
    • 在线的
    • 响应快的
    • 和原master通信较近,丢失数据少的
    • 优先原则(优先级/offset/runid
  5. sentinel向新的master发送replicaof no one, 向其他的slave发送replicaof <newmasterip> <newmasterport>