This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -200,7 +200,7 @@ function hide_canvas() {
<h4>服务启动时的 Leader 选举</h4>
<p>Leader 服务器的选举操作主要发生在两种情况下。第一种就是 ZooKeeper 集群服务启动的时候,第二种就是在 ZooKeeper 集群中旧的 Leader 服务器失效时,这时 ZooKeeper 集群需要选举出新的 Leader 服务器。</p>
<p>我们先来介绍在 ZooKeeper 集群服务最初启动的时候Leader 服务器是如何选举的。在 ZooKeeper 集群启动时,需要在集群中的服务器之间确定一台 Leader 服务器。当 ZooKeeper 集群中的三台服务器启动之后,首先会进行通信检查,如果集群中的服务器之间能够进行通信。集群中的三台机器开始尝试寻找集群中的 Leader 服务器并进行数据同步等操作。如何这时没有搜索到 Leader 服务器,说明集群中不存在 Leader 服务器。这时 ZooKeeper 集群开始发起 Leader 服务器选举。在整个 ZooKeeper 集群中 Leader 选举主要可以分为三大步骤分别是:发起投票、接收投票、统计投票。</p>
<p><img src="assets/Ciqc1F7zKQyAK4wsAADnGMCxArI126.png" alt="2.png" /></p>
<p><img src="assets/Ciqc1F7zKQyAK4wsAADnGMCxArI126.png" alt="png" /></p>
<h4>发起投票</h4>
<p>我们先来看一下发起投票的流程,在 ZooKeeper 服务器集群初始化启动的时候,集群中的每一台服务器都会将自己作为 Leader 服务器进行投票。<strong>也就是每次投票时,发送的服务器的 myid服务器标识符和 ZXID (集群投票信息标识符)等选票信息字段都指向本机服务器。</strong> 而一个投票信息就是通过这两个字段组成的。以集群中三个服务器 Serverhost1、Serverhost2、Serverhost3 为例三个服务器的投票内容分别是Severhost1 的投票是10、Serverhost2 服务器的投票是20、Serverhost3 服务器的投票是30</p>
<h4>接收投票</h4>
@@ -210,7 +210,7 @@ function hide_canvas() {
<p>在接收到投票后ZooKeeper 集群就该处理和统计投票结果了。对于每条接收到的投票信息,集群中的每一台服务器都会将自己的投票信息与其接收到的 ZooKeeper 集群中的其他投票信息进行对比。主要进行对比的内容是 ZXIDZXID 数值比较大的投票信息优先作为 Leader 服务器。如果每个投票信息中的 ZXID 相同,就会接着比对投票信息中的 myid 信息字段,选举出 myid 较大的服务器作为 Leader 服务器。</p>
<p>拿上面列举的三个服务器组成的集群例子来说,对于 Serverhost1服务器的投票信息是10该服务器接收到的 Serverhost2 服务器的投票信息是20。在 ZooKeeper 集群服务运行的过程中,首先会对比 ZXID发现结果相同之后对比 myid发现 Serverhost2 服务器的 myid 比较大于是更新自己的投票信息为20并重新向 ZooKeeper 集群中的服务器发送新的投票信息。而 Serverhost2 服务器则保留自身的投票信息,并重新向 ZooKeeper 集群服务器中发送投票信息。</p>
<p>而当每轮投票过后ZooKeeper 服务都会统计集群中服务器的投票结果,判断是否有过半数的机器投出一样的信息。如果存在过半数投票信息指向的服务器,那么该台服务器就被选举为 Leader 服务器。比如上面我们举的例子中ZooKeeper 集群会选举 Severhost2 服务器作为 Leader 服务器。</p>
<p><img src="assets/CgqCHl7zKRuARwOdAACqX-dZDEQ790.png" alt="1.png" /></p>
<p><img src="assets/CgqCHl7zKRuARwOdAACqX-dZDEQ790.png" alt="png" /></p>
<p>当 ZooKeeper 集群选举出 Leader 服务器后ZooKeeper 集群中的服务器就开始更新自己的角色信息,<strong>除被选举成 Leader 的服务器之外,其他集群中的服务器角色变更为 Following。</strong></p>
<h4>服务运行时的 Leader 选举</h4>
<p>上面我们介绍了 ZooKeeper 集群启动时 Leader 服务器的选举方法。接下来我们再看一下在 ZooKeeper 集群服务的运行过程中Leader 服务器是如果进行选举的。</p>