欢迎大家注意github.com/hsfxuebao。我希望这对每个人都会有所帮助。如果您认为有可能
上一篇文章说明了ZK群集的基本结构和重要组成部分,并分析了重要组成部分在ZK集群中起作用的分析。选举详细信息,选举过程,如何完成机器之间的交互式交流以及什么组件以及什么组件简而言之,这是上一篇文章中提到的五个点的第二点和第三点。作为ZK群集数据的五点,让我们在下一篇文章中对其进行分析。
注意:本文基于ZK版本3.7分析。
群集通信结构图如下:
上面的通信图描述了启动过程中两家机器的通信状况,并准备开始选举过程。在A1,A2,A3,A4,B1,B2,B3和B4的八个过程的数字中,1-4过程可以同时被视为基本执行,而A1-B1,A2-B2 ...这八个过程对于处理后的处理的操作完全相同,但是触发时间有些不同。因此,A1过程的引入等同于引入B1过程,依此类推。接下来,我将介绍其交互顺序和一些详细信息:
当当前的ZK群集具有三台机器,SID分别为1、3和5,分别代表机器A,B和C。
我个人认为,沟通过程应分为两个部分。第一部分是主动将套接字连接过程发送到其他机器,第二部分是接收执行其他机器监视过程的套接字连接请求。只有两个进程。一切后,您可以构建前面提到的群集通信结构。
每台计算机都会主动将套接字连接请求和通知发送到配置文件中的群集。粗略的图片如下:
您会看到途中有六个外部关节。这些箭头表示机器开始发送并将通知发送到其他机器时,将连接和通知连接到其他机器的过程。这六个步骤几乎是相同的,因为启动时间基本上是相同的。
:查看途中的过程,您会发现一个有趣的现象。大SID已成功发送到小岛屿上。如果国立台湾大学继续向机器发送投票通知。
:启动插座连接过程时,SID将小于或等于与SID SID.Connect的套接字连接;
在此过程之后,大型SID机器将积极创建一个小型通信发送者和RecvWorker。结果如下:
SID最小的机器SenderWorkerMap是空的。B机器的SenderWorkerMap仅具有一个通信对A,而C机器的SenderWorkerMap具有A和B的通信对。
在上一章中,每台机器将创建一个侦听器,以监视监视其他机器的机器的套接字连接。在发送插座连接过程中,每台计算机都会将套接字连接发送到其他机器。该机器触发了serversocket服务。监视结果如下:
上图中只有三个成功的触发过程,但是插座过程中显然发送了六个插座。应该有六个成功的触发过程。这是一个问题吗?不用担心,首先查看下图中的触发结果:
:从结果中,在SID大发送插座连接请求之后,将触发监视并生成SIDWORKENTER对SINDWORKENTION对SID SMALL MACHICER上的通信对。
总结:
在前两个进程之后,每台计算机中的SenderWorkMap状态:
在积极和被动地创建通信对之后,集群中的每台机器都将拥有另一台机器的通信对,以在选举期间保留投票通知。
我们这次我们模拟的选举通信的示例是,这三台机器是同时启动的,因此将套接字连接发送到另一台计算机等操作可以被视为相同的操作。机器的通信。操作,机器A已重新启动或机器SID首先发射,然后SID很小,然后开始。目前,一个聚会尚未开始。根据这两个过程,这必须是不合理的。
因此,有一个插座连接重置操作,以确保后者启动的机器也可以成功地与首先启动的计算机建立通信。确定该机器A和C已成功启动,但是在此中创建通信的过程选举沟通仍然如下:目前,一般流程图如下:
除了较早出现的完整,上面和触发器外,还有另一个重置事件,代表插座连接重置事件。这张图片正常接近ZK群集的正常使用,因为正常的启动过程是在正常的启动过程中。
:当SID机器B将大型机器C发送到SID机的插座请求时,将在C机器上触发重置事件。机器和B通信之间的通信将重置大型SID机器将插座请求发送到SID小型机器,以在B机器上创建一对通信对。
:在上述过程之后,您可以发现重置操作类似于需要大型SID机器再次与机器联系的小SID机器的操作,以便满足大型SID机器以主动发送插座连接场景。可以将重置操作视为主动通信和被动触发器的转换操作,并将主动发送转换为被动接收,并将被动收据转换为主动发送。
建立通信过程是选举沟通过程的必然。完成以前的交流对建立后,可以启动选举投票交流。选举的规则如下,优先级是从上到下安排的:
选举过程将涉及以下参数交换:
大选沟通过程如下所示:
过程分析如下:
可以将Quorumpeer理解为准备参加选举的服务器,即配置文件中配置的服务器zoo.cfg代表选举权的服务器。它有三个状态,遵循领先(不包括观察状态)。
在系统的初始化时,每个Quorumpeer对象都保持一个封装对象以认可其选举工作。
我们只需要了解该类的近似效果,因此Quorumcnxmanager类别。
此类维护当前服务器和其他服务器之间的TCP连接,并确保服务器之间只有一个连接。此外,此类还维护了地图结构化的数据queuesendMap。关键是集群中其他服务器的服务器,值是消息队列,当当前服务器将消息发送到其他服务器时,该消息的副本失败了。有一个需要关注的点。通过本地维护队列,您可以确定当前服务器和群集之间的连接是否正常,如下所示:
QuorumcnxManager还具有继承可运行接口的线程的内部类,该界面负责发送和接收SenderWorker和RecVworker。
每个SenderWorker或RecvWorker都有一个SID变量。显然,与每个SID相对应的Quorumpeer将具有相应的Senderworker和RecvWorker来处理接收消息或发送消息。
接下来,查看对应的run()方法sendworker.run()::
recvworker.run():
可以看出,SenderWorker负责读取负责SID对应消息的相应消息的列表,然后将消息发送到相应的SID。
RecvWorker负责阅读与他负责的SID建立的TCP连接的数据。
从Quorumcnxmanager.senderworker和Quorumcnxmanager.older.older.older.rcvworker的运行方法中,这两名工人基于Quorumcnxmanager的连接,发送和接收消息与相应的服务器。该新闻还通过fastledereleclection处理。因此,Quorumcnxmanager的两名工人对特定算法实现不承担任何责任,而是消息由消息发送和接收的代理类别。这些详细信息仅需要从Quorumcnxmanager提供的队列中拾取消息或输入消息。
在选举过程中,您需要与消息进行通信,因此在FastleadRelection中保持了两个变量:
在recalconus期间收到的消息是在选举过程中存储的,该消息被移交给了fastlederelect的核心方法。
同时,每个封装变量都保持一个内置的messager。Messager类包含两个实现可运行界面的WorkerReceiver和Workersersender类。可以从两个类负责发送和接收消息的名称中可以看出。WorkerSender负责捡起该消息,等待从Sendqueue发送,并移交给较低的管理管理类方形群体进行发送。
下面,让我们看一下fastlederelection.messager.workeksender和fastlederelection.messager.workerreceiver的运行方法:
worker.run():很容易说。
workerreceiver.run():
自3.5版本以来,ZK可以实现动态扩展能力。Quorumverifier实际上对应于Zoo.cfg.dynamic的动态配置的版本。
它的主要实施QuorumhierArchical如下:
本文主要分析集群选举交流原理和过程结构,以及重要类别和成员变量。我们已经分析了源代码。
Zookeeper 3.7版本GitHub源代码注释分析
## ZK源代码分析系列
Zookeeper原理和源代码学习系列Zookeeper学习系列Zookeeper源代码系列
原始:https://juejin.cn/post/7100493566778015774