客户端创建连接后,您将尝试连接。如果连接成功,它将被调用到发送连接请求的方法。这是一个会话。我们不会解释客户端的服务方面。
Zookeeper服务器的会话操作如下:
在服务器上保存会话会话信息。
有以下属性:
故障队列具有以下属性:
然后,我们继续分析上一章的案例。如果客户端启动请求,则如何确定第一次创建请求的后端?它反映在上一个案例源代码中,而某些关键源代码如下:
目前,如果这意味着需要创建第一个连接,请在此处拨打电话,将在方法中设置设置。仅在处理连接请求后,才设置设置来处理客户端的其他命令。
以上方法还调用处理连接请求。第一次从请求获得。目前,创建将作为一家企业创建。
创建会话调用。此方法将首先创建一个sessionID,并将SessionID用作会话ID来创建创建会话会话的请求,并将请求交给业务链作为业务流程。源代码如下:
上述方法中使用的两个操作是创建SessionID和Configuration SessionID的跟踪信息。方法源代码如下:
会话信息的跟踪实际上是将会话信息添加到队列中。任何地方都可以根据会话ID找到会话信息,并且可以通过创建会话,会话队列存储和到期队列存储来实现该方法。方法源代码如下:
调用该方法,关键代码如下:
TXN(创建会话的操作)的持久性实际上将提交会话,实际上是ID的ID和出售。
因为中间链接太复杂了,所以我们编写了调用链接。您可以遵循此订单:
中文代码以上称为:
以上方法主要处理并提交给中间,提交的方法代码如下:
无论何种请求命令(添加或ping请求,例如ping或ping),服务器都会更新会话的到期时间。当我们执行其他删除或ping命令时,我们将通过运行方法,中间呼叫为叫。该方法的源代码如下:
更新Session Expiryqueue失败队列中的故障时间的方法,源代码如下:
该方法将根据当前时间增加超时,并将故障时间更新为newExpiryTime。关键源代码如下:
这是一个线程类,继承,我们可以查看其运行方法。它首先获得下一个会话到期,睡觉并等待会话到期的到期,然后获得过期的客户端会话集合和周期。源代码如下:
上述方法被调用。此方法代码主要是为了获得与到期时间相对应的客户端会话集合。源代码如下:
上面的方法实际上是将会话会话的状态设置为true。方法源代码如下:
使客户失败的方法实际上是业务操作。它主要调用该方法。在此方法获得SessionID之后,我们创建一个请求并将其移交给业务链处理。我们检查方法源代码如下:
在操作方法中,操作的最后一部分清楚地将会话的划分设置为true。源代码如下:
调用业务链处理对象方法,并执行该方法,该方法准确地删除了会话信息。方法源代码如下:
删除会话的方法将删除会话ID和过期的会话对象。源代码如下:
为了使Zookeeper的对话更加深刻,我们对会话过程进行测试,首先测试会话创建,然后测试会话刷新。
1)会话创建测试
我们打开方法并首次跟踪第一会议。调试情况如下:
目前,将建立远程连接和sessionID。我们调试该方法。目前,建立了链接,并获得了sessionID = 0。
当SessionID = 0时,它将执行会话创建,呼叫会话创建方法以实现会话创建,并将会话存储在跟踪队列中。调试测试如下:
会话创建代码如下:
跟踪测试后,控制台输出以下信息:
2)会话刷新测试
我们执行指令,然后首先跟踪方法,然后执行以下操作:
执行程序到达,即将开始刷新会话。我们测试的效果如下:
呼叫时,您将首先确定会话是否为空,以及会话是否已关闭。
刷新会话实际上是会话时间的增加,并增加了会话时间。
测试后的效果如下:
让我们先构建动物园管理器群集,然后分析选举算法。
如上所述:
配置3个启动类,如下所示:
如上图所示,上图是Zookeeper单基机/集群启动过程。每个细节所做的事情在上面说明。我们将根据流程图分析源代码。
程序启动,运行过程启动集群模式,如下所示:
开始服务,如下:代码:
方法代码如下:
该方法的主要步骤开始:
两件事开始打开领导选举方法。首先,创建一个初始化的投票以选择自己,然后创建选举投票方法。源代码如下:
选举算法只有3种类型,而其他两种类型已被放弃。方法源代码如下:
此方法创建以下三个对象:
①创建一个cuorumcnxmanager对象
②,Quorumcnxmanager.listener
③,封装
动物园管理选举主要取决于封装算法。其他算法已被消除,但是封装算法是典型的Paxos算法。因此,我们必须首先学习PAXOS算法,该算法有助于掌握fastlelelect算法。
1)PAXOS简介
分布式交易中的共同交易模型包括2pc和3pc。无论是2pc提交还是3PC提交,它都无法完全解决分布式分布的一致性问题,并且不能解决过于保守和容忍度。也就是说,Paxos和所有其他一致的算法都是Paxos算法的不完整版本。Paxos算法被认为是晦涩难懂的,很难表明它很难实现,但是在项目中很难实现,因此有许多Paxos算法算法算法诸如胖胖,木筏,Zab,微信phxpaxos之类的项目。本文将介绍该Paxos算法被公认为难以理解但有效。Paxos算法是一种基于共识的一致算法,该算法是由Leslie Lamport提出的。“兼职议会”,“ Paxos变得简单”。很难理解如何解释该算法。
2)PAXOS算法背景PAXOS算法是基于消息传输和高容错特性的一致性算法。它是目前被认为是分布式一致性的最有效问题的最有效算法之一。某个值(解决方案)达成协议。达成关于诸如Zookeeper之类的主奴隶群集的分辨率的协议,即副本或领导者选举的副本。我认为此算法与狭窄的分布式交易不相同机器停机时间或网络异常(包括延迟,损失,重复,混乱和网络分区)(即,异常分布式系统)等。在可能发生在上述异常分布系统中的可能分布式系统中集群中的某些数据。它也可以理解为状态在TH中的一致性E分布式系统。
3)PAXOS算法理解
PAXOS算法是一种分布式一致性算法,可以解决分布式系统如何达到一定值的问题(分辨率)。一个典型的场景是,如果每个节点的初始状态一致并且每个节点都能执行分布式数据库系统中的一个典型场景相同的操作顺序,然后他们最终可以得到一致的状态。按顺序确保每个节点的相同命令顺序,有必要在每个指令上执行“一致性算法”,以确保指令查看每个节点一致。分布式分布式。系统通常由多个副本保证,并且在多个副本之间存在不一致的数据。因此,必须有一种一致性算法来确保数据的一致性。描述如下:如果分布式系统中的每个节点的数据相同,则每个节点执行一系列操作,然后每个节点的最终数据与相同的数据一致。paxos算法为解决此分布式场景中的一致性问题。对于普通开发人员,您只需要知道Paxos是一个分布式选举算法。有两个节点之间的两个通信模型:阴影内存,消息传递和PAXOS基于消息传递通信模型。
4)与Paxos相关的概念
在Paxos算法中,有三个角色:
在特定的实施中,一个过程可以同时充当多个角色。学习者负责学习提案的结果。也有一个非常重要的概念称为建议。最终,一致的价值是在提案中。只要提案者发出的提案被接受者接受(不超过更多)提议者认为,一半受托人同意的同意)认为,选择了提案中的价值。学科者告诉学习者的价值要选择,学习者认为选择价值。选择。为了避免单点故障,将有一个受体集。建议者将向受体集合发送建议。受体集合中的每个成员都可以同意该提案,每个访问者只能批准一个建议。只有一半以上的成员被认为选择了。
Quorumcnxmanager:在每个服务器的开始期间,将启动一台,负责每个服务器之间的基础领导者选举期间网络通信类别。
每个节点的设计非常灵活,主要包括四个组件:客户端请求接收器(),data Engine(),epletoral(),核心功能组件()。
工作流相对复杂,如下所示:
Quorumpeer工作流程:
内部保持一系列队列以保存接收,向发件人发送消息和消息。除了接收队列外,其他队列还根据SID组形成队列集合,然后三台机器将分别创建一个发送队列,这不会彼此干扰。
QUORUMCNXMANAGER.LISTENER:为了能够互相投票,Zookeeper群集中的所有机器都需要建立网络连接。QuorumcnxManager将创建一个serversocket,以监视领导者的通信端口。在打开Monitoring Monitoring,Zookeeeeepe Can CAN,继续从其他服务器接地接收连接请求,并且在接收其他服务器接地TCP连接请求时将进行处理。在顺序以避免在两台机器之间反复创建TCP连接,Zookeeper仅允许大型SID服务器积极地与其他连接建立其他连接机器,否则连接了连接。接收到连接请求的创建后,服务器可以通过比较自身和远程服务器的SID值来确定是否接收连接请求。如果当前服务器发现其SID较大,则将断开当前连接的连接,然后将与远程服务器的连接单独连接。(作为“客户端”)。(作为“客户端”)。一旦建立了连接,则相应的消息发送器SendWorker和消息发送器将根据远程服务器的SID创建,并启动消息发射机。
可以通过监视开始可以查看的方法。源代码如下。您可以在断点上进行调试以查看。目前,我们称的投票端口是:
以上是听众。我们需要打开一个线程以在每个服务之间进行通信。运行方法中有一个方法调用。此方法是接收每个选举投票的信息。这次,该方法将被阻止。选举执行后,该程序将被执行。我们可以首先启动服务,然后开始第二和第三站。目前,客户将收到投票链接。执行,源代码如下:
我们开始2个服务,效果如下:
尽管以上可以证明投票访问当前侦听端口,但您如何知道它是哪种服务?我们可以继续使用源代码学习,但源代码如下:
该方法仅获得数据流并未进行特殊处理,并调用该方法。该方法的源代码如下:
通过网络连接获得数据SID,并获得SID,指示连接哪个连接。我们可以打印输出SID,测试输出以下数据:
在群集中,它主要分为三个字符,每个节点只能同时扮演一个角色。这三个字符是:
(1)接受所有追随者的提案请求,并统一协调启动提案的计划,负责与所有追随者交换内部数据交换(同步);
(2)直接向客户提供服务并参与提案,同时与数据交换(同步)一起提供服务;
(3)为客户服务但不参与提案投票,同时也交换了数据(同步);
选举算法是标准算法实施,可以解决选举算法缓慢收敛的问题。
只需要创建以下代码:
创建会议方法将被创建,队列和对象。物体的作用非常关键。方法源代码如下:
创建Messenger时,它将创建并将其封装到线程中,创建并将其封装到线程中。很容易理解名称。它用于发送数据,用于接收数据,源代码如下:
创建创建后,该方法将被调用以启动选举算法。代码如下:
启动选举算法以调用start()方法,start()方法如下:
上述执行(这是以下方法)意味着两者都会启动。源代码如下:
从封装中,此时将调用的方法,运行方法将调用该方法,源代码如下:
该方法被调用。目前,相应的SID作为消息发送。这实际上是在发送投票信息。源代码如下:
您可以为自己投票或投票给他人。如果您选择自己,则只需要在中间添加投票信息即可。源代码如下:
在该方法中,它将从中获得,并将发送给队列的其他服务的投票包装并移交给发送过程。源代码如下:
选举是一个非常复杂的过程。考虑了许多场景,选举过程中有许多概念要理解。
3.5.1选举概念1)ZK服务状态:
2)服务角色:
3)投票消息广播:
4)投票模型:
5)消息发送对象:
3.5.2选举过程Quorumpeer本身是启动群集时将执行的线程。目前,将调用它的重写方法,并将调用父类。运行方法是选举过程的入口。我们查看运行方法的关键源代码如下:
所有节点的初始状态都在寻找,该状态将进入选举过程。选举过程必须首先获得算法。获得该算法的方法是该方法返回一个实例,而核心选举过程是方法。
这是选举过程的关键过程。源代码分析如下:
上述位置中使用了以上一半的方法。
构造函数反映了操作的一半以上,代码如下:
3.5.3投票规则,以了解投票PK的方法。该方法实际上是领导者选举规则。规则如下:
源代码如下:
所有交易操作将由领导者执行,数据将与其他节点(例如跟随者和观察者)同步。我们可以分析领导者和追随者的操作行为,以分析数据同步过程。
总体过程:
我们返回基于确认的不同字符执行分析的方法。
追随者主要连接领导者以实现数据同步。让我们看一下追随者的工作。我们仍在沿Quorumpeer.run()学习。关键代码如下:
创建跟随者的方法相对简单,代码如下:
让我们看一下数据同步中整个追随者的所有操作。源代码如下:
上述源代码中的方法主要完成了以下操作:
我们分析了其他呼叫方法,其中正在寻找当前的领导者节点。源代码如下:
该方法被调用是从领导者注册的追随者,当前的关注器节点信息将发送给领导者节点。有必要向领导者发送信息。
在读取同步方法的数据包执行的最后方法中,此方法是读取领导者数据包的包。源代码如下:
当我们查看方法的主要部分时,我们可以看到首先创建了领导者对象,然后设置领导者,然后称为执行的核心业务过程。源代码如下:
该方法是领导者执行的核心业务流程。源代码如下:
该方法将执行以下操作:
12881只有一个),运行方法源代码如下:
运行方法创建一个对象。收到链接后,它将被调用,但是一个线程。该方法在其运行方法中调用该方法。源代码如下:
该方法将阻止关注者的连接,并在有连接时生成套接字对象。然后根据当前套接字生成LearnerHandler线程,每个引线将打开LearnerHandler线程。方法源代码如下:
这是要读取或写入数据包以与学习者交换数据包。如果没有数据包读数,则将阻止当前方法。源代码如下:
让我们再次返回该方法,该方法是调用该方法的,该方法是确定连接范围向领导者发送给领导者的时期是否超过一半。如果它太半了,它将被阻止。从一半的机制中,源代码如下:
在该方法中,当发送时期超过一半时,将当前的ZXID设置为ZK并等待Epochack。关键源代码如下:
该方法还将等待一半以上的(追随者和观察者)获得新的时代并返回领导者。Ackepoch在封锁之前,否则将始终被阻止。等待EpoChack分解后,最新时期已更新到当前服务,当前领导者节点的ZAB状态如下:方法源代码如下:
方法还需要等待(追随者和观察者)的一半以上,以成功地进行数据同步,并将Leader.Ack返回到将要提起的程序中。以下代码如下:
在上述所有过程已经消失之后,证明数据已同时成功,并且将执行startzkserver();
该线程是连接结束后建立的线程。EHT终端创建线程。
我们详细解释了该方法。
读取数据包不断读取节点中的数据,如果不读取,它将被阻止。
如果数据数据包类型不是领导者。FolllowerInfo或regner.ObserVerinfo,它将返回,因为我们本身就是领导者节点。读取数据必须读取非领导者节点。
获取SID和版本信息。
获取FollowerInfo和LastAcceptEdepoch,信息如下:
将Leader.newleader数据包放入QueuedPackets中,然后将其发送给其他节点。源代码如下:
过去,干货:本文是由Chuanzhi教育学者野生建筑教学和研究团队发行的。如果本文对您有所帮助,请注意并喜欢;如果您有任何建议,则可以发表评论或私人消息。您的支持是我坚持下去。请说明创作的力量重印之源!
原始:https://juejin.cn/post/7112681401601769486