首页 > 其他分享 >三大常用集群leader选举+哨兵模式原理

三大常用集群leader选举+哨兵模式原理

时间:2023-02-10 18:01:12浏览次数:62  
标签:leader Sentinel master sentinel 哨兵 节点 三大

一,Zookeeper集群的leader选举

Zookeeper的选举机制两个触发条件:集群启动阶段和集群运行阶段leader挂机(这2种场景下选举的流程基本一致)
1,Zookeeper集群中的follower检测到leader挂机,然后把自己的状态置为LOOKING,开始进行leader选举。
2,每台服务器选举自己为leader,然后把自己的选票通过广播通知其他服务器。
3,每台服务器接收来自其他服务器的选票,并进行合法性校验,主要有两点校验,选举轮次校验和服务器的状态的校验。
4,处理选票。每台服务器都会将自己的选票与其他服务器的选票进行PK,PK的规则如下:
第一个规则:首先进行ZXID的PK,大者获胜。
第二条规则:如果ZXID相等,则进行myid的PK,大者获胜
经过PK以后,如果当前服务器PK失败,则会把自己的选票重新投给胜者,然后把更新后的选票通过广播通知其他服务器。
5,统计选票。根据超过半数的原则,每台服务器都会统计leader的选票,如果超过半数,则结束选举。
6,更新服务器状态。follower把自己的状态更新为FOLLOWING,leader把自己的状态更新为LEADING。
OK,这就是Zookeeper的leader选举机制。经过若干轮选举以后,Zookeeper集群继续对外提供服务。由于选票PK首先比较的是ZXID,所以Zookeeper能够保证leader的数据是最新的。
备注:在ZAB协议中,每个事务都有一个编号ZXID,ZXID由两部分组成,高32位是epoch,低32位为递增计数器。
epoch:选举周期,也就是每换一次Leader,epoch的值加一;
计数器:随事务的到来每次加一,每当换一次Leader,计数器会清零,从零开始加;
当我们搭建zookeeper的集群时,我们需要手动创建一个myid的文件,这个文件里面我们随便写入一个数字,但zk集群里面每个节点的数字都不能相同

二,kafka集群的controller选举
kafka集群保证高可用性
kafka通过Zookeeper管理集群配置、选举leader、consumer group发生变化时进行rebalance。
kafka选举leader
Kafka选举leader的过程是这样的:kafka的所有broker,在Zookeeper的/controller路径下创建临时节点,成功创建的那个broker就会成为leader,其他的broker就会成为follower。
当leader挂机时,临时节点会被删除,这是其他节点通过Zookeeper的watch机制,会监听到leader的变化,然后所有的follower会再次进行leader选举。
kafka的选举其实就是创建临时节点,这和Zookeeper分布式锁的实现原理基本相同。

三,redis集群的主从切换
redis主从切换和redis集群的理解。
redis集群是通过主从切换来保证高可用性的。
redis主从切换有2种方式:手动切换和自动切换。
自动切换,redis主从自动切换需要哨兵模式的支持,哨兵模式简单来说就是:监控master和slave,在master出现故障的时候,自动将slave切换成master,master恢复以后,作为新master的slave对外提供服务。

哨兵模式工作机制+原理

哨兵模式架构

 


 



 


哨兵功能:监控各个服务器+其他哨兵
哨兵模式是Redis的高可用解决方案,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点挂掉时,哨兵会第一时间感知到,并且在slave节点中重新选出来一个新的master,然后将新的master信息通知给client端,从而实现高可用。这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息
哨兵主要任务:
(1)监控:哨兵会不断地检查你的Master和Slave是否运作正常。

(2)提醒:当被监控的某个Redis节点出现问题时,哨兵可以通过 API 向管理员或者其他应用程序发送通知。

(3)自动故障迁移:当一个Master不能正常工作时,哨兵会进行自动故障迁移操作,将失效Master的其中一个Slave升级为新的Master,并让失效Master的其他Slave改为复制新的Master;当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用新Master代替失效Master。
哨兵工作原理:
1、心跳机制:
(1)Sentinel 与 Redis Node:Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,需要通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送 info 命令获取其拓扑结构和状态信息。

(2)Sentinel与Sentinel:基于 Redis 的订阅发布功能, 每个 Sentinel 节点会向主节点的 sentinel:hello 频道上发送该 Sentinel 节点对于主节点的判断以及当前 Sentinel 节点的信息 ,同时每个 Sentinel 节点也会订阅该频道, 来获取其他 Sentinel 节点的信息以及它们对主节点的判断

通过以上两步所有的 Sentinel 节点以及它们与所有的 Redis 节点之间都已经彼此感知到,之后每个 Sentinel 节点会向主节点、从节点、以及其余 Sentinel 节点定时发送 ping 命令作为心跳检测, 来确认这些节点是否可达

2、判断master节点是否下线:
(1)每个 sentinel 哨兵节点每隔1s 向所有的master、slave以及其他 sentinel 节点发送一个PING命令,作用是通过心跳检测,检测主从服务器的网络连接状态

(2)如果 master 节点回复 PING 命令的时间超过 down-after-milliseconds 设定的阈值(默认30s),则这个 master 会被 sentinel 标记为主观下线,修改其 flags 状态为SRI_S_DOWN

(3)当sentinel 哨兵节点将 master 标记为主观下线后,会向其余所有的 sentinel 发送sentinel is-master-down-by-addr消息,询问其他sentinel是否同意该master下线

发送命令:sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid>

ip:主观下线的服务ip

port:主观下线的服务端口

current_epoch:sentinel的纪元

runid:*表示检测服务下线状态,如果是sentinel的运行id,表示用来选举领头sentinel

(4)每个sentinel收到命令之后,会根据发送过来的 ip和port 检查自己判断的结果,回复自己是否认为该master节点已经下线了

回复内容主要包含三个参数(由于上面发送的runid参数是*,这里先忽略后两个参数)

down_state(1表示已下线,0表示未下线)

leader_runid(领头sentinal id)

leader_epoch(领头sentinel纪元)。

(5)sentinel收到回复之后,如果同意master节点进入主观下线的sentinel数量大于等于quorum,则master会被标记为客观下线,即认为该节点已经不可用。

(6)在一般情况下,每个 Sentinel 每隔 10s 向所有的Master,Slave发送 INFO 命令。当Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次。作用:发现最新的集群拓扑结构

3、基于Raft算法选举领头sentinel:

到现在为止,已经知道了master客观下线,那就需要一个sentinel来负责故障转移,那到底是哪个sentinel节点来做这件事呢?需要通过选举实现,具体的选举过程如下:

(1)判断客观下线的sentinel节点向其他 sentinel 节点发送 SENTINEL is-master-down-by-addr ip port current_epoch runid

注意:这时的runid是自己的run id,每个sentinel节点都有一个自己运行时id

(2)目标sentinel回复是否同意master下线并选举领头sentinel,选择领头sentinel的过程符合先到先得的原则。举例:sentinel1判断了客观下线,向sentinel2发送了第一步中的命令,sentinel2回复了sentinel1,说选你为领头,这时候sentinel3也向sentinel2发送第一步的命令,sentinel2会直接拒绝回复

(3)当sentinel发现选自己的节点个数超过 majority 的个数的时候,自己就是领头节点

(4)如果没有一个sentinel达到了majority的数量,等一段时间,重新选举

4、故障转移:

有了领头sentinel之后,下面就是要做故障转移了,故障转移的一个主要问题和选择领头sentinel问题差不多,到底要选择哪一个slaver节点来作为master呢?按照我们一般的常识,我们会认为哪个slave节点中的数据和master中的数据相识度高哪个slaver就是master了,其实哨兵模式也差不多是这样判断的,不过还有别的判断条件,详细介绍如下:

(1)在进行选择之前需要先剔除掉一些不满足条件的slaver,这些slaver不会作为变成master的备选

剔除列表中已经下线的从服务
剔除有5s没有回复sentinel的info命令的slave
剔除与已经下线的主服务连接断开时间超过 down-after-milliseconds * 10 + master宕机时长 的slaver
(2)选主过程:

① 选择优先级最高的节点,通过sentinel配置文件中的replica-priority配置项,这个参数越小,表示优先级越高

② 如果第一步中的优先级相同,选择offset最大的,offset表示主节点向从节点同步数据的偏移量,越大表示同步的数据越多

③ 如果第二步offset也相同,选择run id较小的

 

标签:leader,Sentinel,master,sentinel,哨兵,节点,三大
From: https://www.cnblogs.com/lhl-shubiao/p/17109932.html

相关文章

  • 关于技术能力的思考和总结-技术leader思考(三)
    目录技术常用思考方法向前思考,向后倒推目标与路径端到端思考闭环思考指标量化思考故事与形象思考乘数效应小结技术Leader是一个对综合素质要求非常高的岗位,不仅要有解具体......
  • java三大版本
    WriteOnce、RunAnywhere跨平台(JVM[虚拟机])java三大版本JavaSE:标准版(桌面程序,控制台开发……),JavaME:嵌入式开发(手机,小家电……),JavaEE:e企业级开发(web端、服务器......
  • drf day08 三大认证源码分析、断点调试、全局异常处理
    一、后端取COOKIE的几种方式1.GET请求,数据携带在地址中 从地址栏中取 request.query_params.get('token')2.原生djagno,取出前端传入cookie,从哪取的? request.COOKIE.ge......
  • drf-三大认证源码分析、基于APIView编写分页、异常处理
    1.权限源码分析1.APIView源码497行:self.initial(request,*args,**kwargs)中进行了三大认证。2.在initial的源码中,以下三行代码是进行三大认证的代码:se......
  • 三大认证源码分析、基于APIView的分页、异常处理
    三大认证源码分析drf的APIView在执行视图类的方法之前在dispatch中执行了三大认证self.initial(request,*args,**kwargs)initial的源码如下:definitia......
  • drf三大认证源码/全局异常捕获
    三大认证源码分析权限类的执行源码已知在drf中ApiView在执行视图类方法之前先进行了3大认证1.在执行视图类方法前先进行了三大认证在apiview中的dispatch方法中497......
  • drf三大认证类的源码 全局异常捕获 基于APIView的分页
    今日内容概要认证权限频率源码分析1.权限类的执行源码#权限的源码执行流程 -写一个权限类,局部使用,配置在视图类的,就会执行权限类的has_permission方法,完成权限校......
  • drf三大认证源码分析及异常捕获
    drf三大认证源码分析及异常捕获三大认证分析源头:drf的APIView中,重写了dispatch方法,在分发按请求方式分发之前,进行了运行了initial函数,其中就有以下代码,并且整体的将initi......
  • drf 三大认证 排序 以及分页
    今日内容1认证组件#以后,有的接口需要登录后才能访问,有的接口,不登录就能访问 -登录认证的限制#写一个登录接口,返回token,以后只要带着token过来,就是登录了,......
  • DRF三大认证
    DRF三大认证一、认证组件1.基本使用​ 关于认证组件,现实生活中我们经常用到该组件,比如逛淘宝在首页浏览商品不用登录,搜商品也不需要登录,游客模式即可。但是一旦涉及到......