前边步骤可参考:
Zookeeper[1]-Zookeeper介绍与安装以及集群环境准备_豆虫儿的博客-CSDN博客Zookeeper的介绍和安装Zookeeper客户端使用ZookeeperJavaAPI使用我们为了学习Dubbo,而在dubbo中需要一个注册中心,而Zookeeper是我们在使用Dubbo是官方推荐的注册中心,所以我们先来介绍ZookeeperZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。https://blog.csdn.net/listeningdu/article/details/128307053?spm=101.2014.3001.5502
4.1 获取安装文件
下载地址:Index of /apache/zookeeper
通过wget命令将安装文件下载到opt目录下
注意:
apache-zookeeper-3.5.9-bin.tar.gz和apache-zookeeper-3.5.9.tar.gz的区别 -bin是编译后的文件 我们用这个
wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
解压缩文件
进入Zookeeper目录
4.2 修改配置
修改zoo.cfg文件,系统默认的名称是 zoo_smple.cfg我们需要重命名为zoo.cfg
修改cfg的内容
修改了两块:
1是Zookeeper中存储数据的文件夹,还有就是Zookeeper集群环境节点信息
配置myid文件
我们需要在Zookeeper的数据存储的目录中创建一个myid文件,文件中的内容只有一行信息,即表示我们集群几点的标识,范围是1-255,每个节点的myid的数字和我们在zoo.cfg中配置的server.数字是对应的
1
4.3 分发文件
当我们配置好了一个Zookeeper节点后,我们就可以将Zookeeper文件夹分发给其他几个节点了
scp -r zookeeper bobo02:`pwd` scp -r zookeeper bobo03:`pwd`
分发成功后我们需要修改各个节点中的myid的信息为配置文件中对应的数字
4.4 启动测试
整个集群环境都配置好了之后我们就可以测试启动了
启动命令
./bin/zkServer.sh start
当我们仅仅启动一个节点的时候,因为半数存活机制,3个节点只启动一个节点是没有效果的,
当我们启动第二个节点后发现集群环境可以使用了
然后第一个节点的状态也改变了
然后再把第三个节点也启动起来
5. Zookeeper的选举机制
为什么要进行Leader选举? Leader 主要作用是保证分布式数据一致性,即每个节点的存储的数据同步。遇到以下两种情况需要进行Leader选举
-
服务器初始化启动
-
服务器运行期间无法和Leader保持连接,Leader节点崩溃,逻辑时钟崩溃。
5.1 服务器初始化时Leader选举
Zookeeper由于其自身的性质,一般建议选取奇数个节点进行搭建分布式服务器集群。以3个节点组成的服务器集群为例,说明服务器初始化时的选举过程。启动第一台安装Zookeeper的节点时,无法单独进行选举,启动第二台时,两节点之间进行通信,开始选举Leader。
-
每个Server投出一票。他们两都选自己为Leader,投票的内容为(SID,ZXID)。 SID即Server的id,安装zookeeper时配置文件中所配置的myid;ZXID,事务id, 为节点的更新程度,ZXID越大,代表Server对Znode的操作越新。由于服务器初始化, 每个Sever上的Znode为0,所以Server1投的票为(1,0),Server2为(2,0)。 两Server将各自投票发给集群中其他机器。
-
每个Server接收来自其他Server的投票。集群中的每个Server先判断投票有效性, 如检查是不是本轮的投票,是不是来Looking状态的服务器投的票。
-
对投票结果进行处理。先了解下处理规则
-
首先对比ZXID。ZXID大的服务器优先作为Leader
-
若ZXID相同,比如初始化的时候,每个Server的ZXID都为0,
-
就会比较myid,myid大的选出来做Leader。
对于Server而言,他接受到的投票为(2,0),因为自身的票为(1,0),所以此时它会选举Server2为Leader, 将自己的更新为(2,0)。而Server2收到的投票为Server1的(1,0)由于比他自己小, Server2的投票不变。Server1和Server2再次将票投出,投出的票都为(2,0)。
-
统计投票。每次投票之后,服务器都会统计投票信息,如果判定某个Server有过半的票数投它, 那么该Server将会作为Leader。对于Server1和Server2而言,统计出已经有两台机器接收了(2,0)的投票信息, 此时认为选出了Leader。
-
改变服务器状态。当确定了Leader之后,每个Server更新自己的状态, Leader将状态更新为Leading,Follower将状态更新为Following。
5.2 服务器运行期间的Leader选举
Zookeeper运行期间,如果有新的Server加入,或者非Leader的Server宕机,那么Leader将会同步数据到新Server或者寻找其他备用Server替代宕机的Server。若Leader宕机,此时集群暂停对外服务,开始在内部选举新的Leader。假设当前集群中有Server1、Server2、Server3三台服务器,Server2为当前集群的Leader,由于意外情况,Server2宕机了,便开始进入选举状态。过程如下
-
变更状态。其他的非Observer服务器将自己的状态改变为Looking,开始进入Leader选举。
-
每个Server发出一个投票(myid,ZXID),由于此集群已经运行过,所以每个Server上的ZXID可能不同。 假设Server1的ZXID为145,Server3的为122,第一轮投票中,Server1和Server3都投自己, 票分别为(1,145)、(3,122),将自己的票发送给集群中所有机器。
-
每个Server接收接收来自其他Server的投票,接下来的步骤与初始化时相同。