zookeeper - leader/follower/observer启动介绍(8)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 概述    之所以会有这篇文章,是因为我原本想理清楚集群模式下client连接follower的场景下发起写操作,如何被路由到leader以及leader如何通过两阶段提交最终持久化数据 ,但是在这个过程中我发现需要一些前置过程需要理一理,否则理解那个复杂的过程会特别饶,基于将复杂逻辑进行拆分的原则,就有这篇文章。

概述

    之所以会有这篇文章,是因为我原本想理清楚集群模式下client连接follower的场景下发起写操作,如何被路由到leader以及leader如何通过两阶段提交最终持久化数据 ,但是在这个过程中我发现需要一些前置过程需要理一理,否则理解那个复杂的过程会特别饶,基于将复杂逻辑进行拆分的原则,就有这篇文章。


server启动过程

    启动过程分析

    zookeeper集群当中所有的节点都会默认启动accept线程,负责接收client的连接,划重点啊,是所有的节点都会创建client的accept线程。

    整个启动过程如下图所示,基本上就是分为三步走,

    1、通过ServerCnxnFactory创建NIOServerCnxnFactory并进行基本的配置(配置其实就是创建acceptor线程和selector线程);

    2、创建QuorumPeer对象并将NIOServerCnxnFactory注入;

    3、启动QuorumPeer对象并将NIOServerCnxnFactory进行启动,然后acceptor线程就位了,selector线程就位了。整个服务就启动了。

img_47c66d06934b7f0adfeb925f987707fa.png
QuorumPeer启动过程


启动过程源码

img_af0fc1beac4910df61131f7b773a8078.png
整体流程

说明:

    整体流程包括创建工厂、创建quorumPeer对象,注入工厂并启动quorumPeer对象。


img_576f6b7b4f20f6809e82905b8f2b96f3.png
创建工厂

说明:

    创建工厂的过程,其实我们可以看出来这里其实是创建的NIOServerCnxnFactory对象。


img_6ff124f4d281b69dfc8a5d6c792afec3.png
设置工厂参数中初始变量

说明:

    初始化NIOServerCnxnFactory对象,里面主要创建了acceptor的socket对象、线程;创建了selector对象的线程数。


img_785bf55283e7afb2dd9ea4af6f7ca28e.png
启动过程

说明:

    启动了NIOServerCnxnFactory对象。


img_5dd33a841dd1684daf1ca975525c5a03.png
实际执行启动的过程

说明:

    真正是启动了acceptThread和selectorThreads。


leader启动过程

启动过程分析

    在leader启动过程中,核心点在于启动quorumPeer通信的socket的accept线程,然后通过accept线程去accept其他learner等连接,针对每个learner的连接我们都启动一个LearnerHandler线程进行处理。


img_3937994c2a93874c089589d4838fdb37.png
Leader时序图


启动过程源码

img_fa763f9b120902c90595d7960f0aaaaa.png
leader-1

说明:

    通过makeLeader创建leader,通过leader.lead()方法启动服务。



img_92db022bb2ebd16f6ed4c786e5dcd7ed.png
leader-2

说明:

    绑定quorumPeer之间通信的socket。


img_1928e26062912d4a3e2c202848305616.png
leader-3

说明:

    启动LearnerCnxAcceptor线程,负责接收learner的连接且为每个连接启动一个线程。


img_92e2f8e4397348631b754b6a3a80ed1e.png
leader-4


follower/observer启动过程

启动过程分析

    follower和observer的启动过程其实就是一个创建follower对象并向leader发起连接的过程。

img_67edfdfc83c37477a1b9a4f6cf534e15.png
follower时序图


启动过程源码

img_dadb51b5fbce1a5b41ff3bd322f4f881.png
follower-1

说明:

    创建follower。


img_fbb691821d9d8376ec81e363a7c25cce.png
follower-2

说明:

    连接leader,并不停的读取和处理报文。


 server-accept过程

启动过程分析

    server的accept过程由AcceptThread线程负责接收新的socket,然后从selectorThreads当中选取一个selector对象(轮询选择selector)进行注册。

    注册后由selectorThread会通过selector处理注册到这个线程的socket,并进行后续的读写操作。

    AcceptThread继续处理新的连接到来,并注册到selectorThread当中。

img_cdc64425b93393ff829084a75bc103b3.png
AcceptThread处理连接过程


启动过程源码

img_7c0f6409c0454a7a581c1b495aa4a044.png
accept-1

说明:

    循环执行过程中获取accept的socket。


img_5a6a7f75296bb2479402e187b6ab2c51.png
accept-2

说明:

    执行doAccept过程,内部负责accept新的socket。


img_03750ce23eba0fcb6cb0e04627e14f7e.png
accept-3

说明:

    针对accept的socket选择一个selectorThread进行注册。


img_8b1fad4bcbe82379f9467a7afd07ee4d.png
accept-4

说明:

    每次先执行待读取的数据,然后注册新accept的socket。


img_ac37578f552af7c86c1a34c6449b94cc.png
accept-5

说明:

    核心的关键点在于注册到selectorThread的selector当中。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
4月前
|
消息中间件 分布式计算 算法
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(上)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
62 0
|
1月前
|
消息中间件 存储 Kafka
【Kafka】Replica、Leader 和 Follower 三者的概念分析
【4月更文挑战第11天】【Kafka】Replica、Leader 和 Follower 三者的概念分析
|
12月前
Zookeeper Leader选举机制
Zookeeper Leader选举机制
60 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
Zookeeper系列——一文带你了解Zookeeper的选举机制
316 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
【ZooKeeper】⑤ ZooKeeper 的选举机制
在进行 ZooKeeper 集群启动的时候,集群中会有 Leader 节点和 Follower 节点。 一个集群中只会有一个 Leade r节点。启动 ZooKeeper 集群的时候 Leader 并不是固定的,而是通过一定的选举策略产生的。 选择 Leader 节点的时候需要进行投票(Vote)。其中每个集群节点(服务器)都可以进行投票,并把自己的投票结果发送给其他的所有节点。投票的主要的信息 Vote 包含两个字段 myid 和 zxid myid 是服务器节点的 id(服务器的标记) zxid 是选举的全局事务 id(zxid 每次选举都会递增,选举轮次)
125 0
【ZooKeeper】⑤ ZooKeeper 的选举机制
Zookeeper的Leader选举
Leader选举是保证分布式数据一致性的关键所在。Leader选举分为Zookeeper集群初始化启动时选举和Zookeeper集群运行期间Leader重新选举两种情况。在讲解Leader选举前先了解一下Zookeeper节点4种可能状态和事务ID概念。
109 0
Zookeeper的Leader选举
Zookeeper选举机制
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
Zookeeper选举机制
|
算法
ZK源码阅读系列-ZK集群Leader选举解析
ZK服务端启动代码涉及很广,本文就集群下的zookeeper是怎么选举leader的进析。
181 0
ZK源码阅读系列-ZK集群Leader选举解析
|
分布式计算 资源调度 Hadoop
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制