Redis——哨兵 哨兵是什么哨兵就是一种自动监视程序即一个进程他可以监视redis主从架构自动故障转移通知故障。如果主从架构中的主节点瘫痪哨兵可以自动推举出新的主节点避免了人工干预恢复写功能如果主从架构中的从节点瘫痪哨兵可以将该节点标记为不可用并使得客户端得知该消息客户端就会从其他节点进行读取。一般来说一个主从架构不止被一个哨兵监视而是被一个哨兵集群监视这主要是出于以下两点考虑单点哨兵可用性不高如果瘫痪就无法对redis主从架构进行监视单点哨兵判断不可信有可能是因为网络抖动误判了redis节点的瘫痪而如果有多个哨兵都认为该节点瘫痪那大概率是可信的。总而言之哨兵就是将人工需要做的事情用程序来做问题发现更及时解决更及时出错概率小。下面是哨兵和redis的关系图故障转移流程哨兵会定期给各个redis节点发送心跳包如果某节点没有在规定时间做出回复那么哨兵就有理由认为该节点瘫痪主观下线SDown触发条件Redis 主节点master宕机与所有哨兵之间的心跳通信中断。哨兵行为每个哨兵独立判断主节点“严重故障”将其标记为主观下线。特点此时只是单个哨兵自己的看法不代表集群共识。客观下线ODown投票判定所有哨兵例如 sentinel1、sentinel2、sentinel3就“主节点是否故障”发起投票。法定票数quorum当赞成票数 ≥ 配置的quorum值时故障被做实。结果一旦达到 quorum主节点被标记为客观下线确认需要执行故障转移。选举哨兵 LeaderRaft 算法目的只需要一个哨兵作为“代表”来完成后续的选主、提主操作避免多人同时干预。选举过程每个哨兵向其他所有哨兵发送“拉票请求”。收到拉票请求的哨兵回复“投票响应”每个哨兵只有一票。如果回复者还没有给任何人投过票就投给第一个来拉票的哨兵如果已经投过则不再投票先到先得。一轮投票后得票数超过半数的哨兵自动成为 Leader。如果出现平票如三人各得一票则重新发起一轮投票直到选出 Leader。设计建议哨兵节点数配置为奇数如 3、5可降低平票概率减少重选开销。关键因素网络延时的微小差异决定了谁先发出拉票请求因此结果带有随机性——这并不重要只要能选出一个 Leader 即可。Leader 挑选新 Master 的规则Leader 从剩余的 slave 节点中按以下优先级顺序挑选新 master比较优先级slave-priority / replica-priority数值越小优先级越高节点优先级高的直接上位类似“钦定”优先级可以在配置文件中设置。比较复制偏移量replication offset数据同步进度领先的 slave 上位复制数据越多越新。比较 run id若前两项都相同则选择 run id 字典序更小的 slave相当于按随便选了。执行故障转移一旦某个 slave 被选定Leader 会执行让该 slave 执行SLAVEOF NO ONE使其成为新的 master。通知其余 slave 节点将它们的主节点指向这个新 master完成切换。其他哨兵一旦发现新 master 出现就知道选举与转移已结束整个集群恢复正常。如果后续原来的主节点恢复他将被设置为新主节点的从节点。