画布 1
Sentinel故障转移的原理
  定时任务
    每隔 10s，sentinel 往所有 M/S 发 info 获取最新的拓扑结构
      从主节点可以实时获知从节点的信息
    每隔 2s，sentinel 节点会向 Redis 数据节点的 _sentinel_:hello 频道上发送改 Sentinel 节点对主节点的判断，以及当前 Sentinel 节点的信息。同时每隔 Sentinel 节点也会订阅该频道，来了解其他 Sentinel 节点以及它们对主节点的判断。
      sentinel 可以通过这个频道获取 sentinel 之间的信息
      交换主节点的状态，可以作为后续操作的依据
        客观下线
        领导者选举
    每隔 1s，sentinel 会向M/S和其他 Sentinel 发送一条 ping 命令做一次心跳检测，来确认节点是否可达。
  主观/客观下线
    主观下线
      任意sentinel ping master 超时，就可以局部认为该节点已失败。这时候 epoch 会通过命令，产生事件加一。
    客观下线
      第一个进入主观下线状态的节点，往往成为进入客观下线的节点。
      发送 SENTINEL is-master-down-by-addr <masterip> <masterport> <sentinel.current_epoch> * 命令直接询问其他哨兵节点对主节点的判断。当主观下线的 哨兵数量超过<quorum>的个数，Sentinel 节点认为主节点确实有问题，这时候 Sentinel 就可以客观下线的决定。
        runId等于*时，sentinel 交换的是主节点下线的判定
        runId 等于哨兵的runId时，哨兵请求的是其他节点同意它成为领导者
  leader election
    1 先进行主观下线的 sentinel 向其他节点发出 `sentinel is-master-down-by-addr masterIp epoch runId`命令。
2 没有投过票的 follower 节点开始投票。
3 收集够足够选票的 sentinel 成为 leader，开始主动发起 FO。
  failover
    大致等价于 sentinel failover master 命令，但是 sentinel 集群中自动执行的命令编排。
      1 选出合适的从节点，步骤有一点像负载均衡。
      2 对从节点发出 slaveof no one 命令，使其上升为主节点。
      3 切换其他从节点来复制新的主节点。
      4 把 master 置为新的从节点，密切关注，伺机开始新的复制