redis哨兵如何选举的
-
Redis哨兵是用于监控Redis主从高可用性的一个组件,它的一项重要功能就是进行主节点的选举。当Redis主节点失效时,哨兵会自动选举一个新的主节点来接管服务。下面我将详细介绍Redis哨兵的选举过程。
选举过程如下:
-
哨兵集合的形成:在一开始,有一个或多个哨兵节点与Redis主从集群建立连接,这些哨兵节点会进行通信组成一个哨兵集合。
-
哨兵节点间的通信:哨兵节点之间通过PUBLISH和SUBSCRIBE命令进行消息的发布和订阅,用来传递监控和选举的相关信息。
-
主观失效检测:每个哨兵节点会定时向集群中的主节点发送PING/SENTINEL命令,通过检测主节点是否活着来确认主节点是否失效。如果一个哨兵节点连续发送多次PING命令没有收到回应,则认为主节点失效。
-
对主观失效主节点的选举:如果一个哨兵节点认为主节点失效,它会开始对主观失效的主节点进行选举。
-
哨兵节点首先会选择从节点中的一个作为新的主节点,这个从节点必须满足以下条件:复制偏移量最大(即数据更新最多)、优先级最高(可以设置,优先级越高越有可能被选中)、复制连接的状态正常。
-
如果从节点没有满足条件的,则哨兵节点会选择自己成为新的主节点。
-
-
对新的主节点的选举:选举出新的主节点后,哨兵节点会向所有哨兵节点发送包含新主节点信息的REVIVE消息,各个哨兵节点再次进行选举,确保对新主节点的认可性。只有当大部分哨兵节点都同意选举结果,新的主节点才会被认可。
-
同步选举结果:最终选举结果会保存在哨兵节点的sentinel.conf配置文件中,并通过向集群中的所有Redis节点发送新主节点信息的命令(PUBLISH和SUBSCRIBE)来通知其他节点。
通过以上选举过程,Redis哨兵能够实现主节点的自动选举,确保Redis主从集群的高可用性。
1年前 -
-
Redis哨兵(Redis Sentinel)是Redis提供的高可用解决方案,用于监控和管理Redis集群。当主节点(master)失效时,哨兵会进行选举,选出一个新的主节点。下面是Redis哨兵选举的过程:
-
哨兵发现主节点失效:每个哨兵都会定时向Redis集群中的所有节点发送
PING命令,如果一个节点在指定的时间内没有回复,哨兵就会认为该节点失效,然后开始选举。 -
选举开始:当多个哨兵同时发现主节点失效时,它们会通过集体决策确定新的主节点。这个决策过程按照以下步骤进行:
- 哨兵互相通信:哨兵节点之间会进行通信,通过发送消息来达成共识。
- 哨兵检查剩余的从节点:哨兵会遍历集群中的所有从节点,检查它们是否可用。
- 哨兵选举候选人:每个哨兵节点都会根据一定的算法选择一个候选人(通常是从节点)作为新的主节点。选择候选人时,哨兵会考虑节点的可用性、优先级以及最近一次复制的偏移量等因素。
- 哨兵投票:选举过程中每个哨兵会投票给自己认为最适合成为主节点的候选人。
-
选举结果:当哨兵完成投票后,会统计每个候选人的得票数。选票最多的候选人将成为新的主节点。
-
主节点切换:选举结果确定了新的主节点后,哨兵会向Redis集群中的所有节点发送
FAILOVER命令,将新的主节点的地址广播给其他节点。其他节点接收到广播后,会将自己的从节点重新连接到新的主节点,实现主节点的切换。
需要注意的是,选举过程中哨兵节点之间需要保持通信,如果有哨兵节点失效或网络分区情况,可能会出现选举延迟或选举冲突的情况。为了防止这种情况,Redis哨兵采用了Quorum(仲裁)的概念,只有在大多数哨兵节点参与投票并达成共识时,选举才会成功。
1年前 -
-
Redis哨兵是Redis的高可用方案之一,它负责监控和管理Redis主从节点,并在主节点失败时,自动进行选举,选出新的主节点。本文将详细介绍Redis哨兵的选举过程。
-
哨兵的监控
哨兵通过向Redis节点发送PING命令来监控Redis节点的状态,如果哨兵在一定的时间内没有收到PONG回复,就会判断节点为无响应节点。 -
哨兵的选举规则
(1)正在投票的哨兵必须具有更高的runid(唯一标识符),runid越大,表示哨兵加入集群的时间越晚,具有更高的优先级;
(2)哨兵必须满足以下条件才能投票:- 哨兵状态为正常(non-failover模式),或者已经过了
dir-down-time时间(failover模式); - 哨兵在配置的
quorum数量的哨兵中排名前面。
- 哨兵状态为正常(non-failover模式),或者已经过了
-
哨兵选举流程
(1)哨兵发现主节点下线后,会发送SENTINEL is-master-down-by-addr命令给其他哨兵,尝试进行选举,发送的命令中包含主节点的地址和端口号;
(2)收到SENTINEL is-master-down-by-addr命令的哨兵根据以下条件进行判断:- 如果收到的命令中指定的主节点已经被其他哨兵选出,并且该哨兵认为选出的主节点是可用的,则该哨兵不会执行选举操作;
- 如果收到的命令中指定的主节点已经是该哨兵已经选出的主节点,则该哨兵也不会进行选举;
- 如果收到的命令中指定的主节点是无响应节点,则该哨兵也不会进行选举。
(3)如果收到的命令中指定的主节点是可选节点,且没有被其他哨兵选出,则会尝试进行选举: - 哨兵会先检查自己是否可以投票,满足条件的话则将自己的投票信息发给其他哨兵;
- 其他哨兵收到投票信息后,根据一定的规则进行验证,如果验证通过,则更新自己的投票信息,并将其转发给其他哨兵;
- 在一定的时间内,如果有足够多的哨兵投票给某个候选节点,且没有其他候选节点得到足够的票数,则该候选节点被选为新的主节点。
-
选举后的处理
(1)当一个新的主节点被选出后,哨兵会将新的主节点的地址和端口号广播给其他Redis节点,并通知其他哨兵和Redis客户端;
(2)被选为新的主节点的Redis节点会向从节点发送命令,让从节点复制新的主节点;
(3)哨兵会根据一定的配置,将旧主节点设置为从节点,并添加到新主节点的从节点列表中,进行数据同步和故障切换的准备工作。
总结:Redis哨兵选举是通过一定的规则和条件来判断哨兵是否可以投票,以及是否可以接受其他哨兵的投票,并根据得到的投票结果选择新的主节点。选举后,哨兵会通知其他Redis节点和Redis客户端,进行数据同步和故障切换的处理。
1年前 -