相关知识
为了完成本关任务,你需要掌握:1.ZooKeeper单节点安装方法,2.命令行基本操作。
ZooKeeper之仲裁模式
standlone
模式运行ZooKeeper,便于评估,开发,测试和学习。但是在实际生产中,使用ZooKeeper均以仲裁模式(quorum mode
)运行,quorum mode
具有一组ZooKeeper服务器,这一组服务器同时服务客户端的请求。具体可划分为两类:分布式模式(即多个服务器在不同计算机上)、伪分布式模式(即多个服务器在同一计算机上)。客户端与服务器之间的关系如下图所示:
法定人数
在quorum mode
模式下,ZooKeeper复制集群中所有服务器的数据树。但是,如果让一个客户端等待每个服务器完成数据保存后再继续,那么可能导致的延迟问题将无法接受。所以,必须指定保证ZooKeeper正常提供服务的最小服务器数量。类似于公共管理领域中的法定人数(进行一项投票所需立法者的最小数量)。
一般情况下,在ZooKeeper分布式模式中,服务器数量为奇数个。例如,5
个服务器中,至少有3
个服务器提供服务(即法定人数),允许2
个服务器崩溃,即多数原则;如果5
个服务器节点,法定人数为2
,在提供服务的2
个服务器上进行了节点创建的操作,而在与另外3
个服务器通信时发生长时间延迟,导致另外3
个服务器无法发现该节点的创建,那么该节点创建操作就是非持久的。但是,如果只有4
个服务器,那么需要保证3
个服务器提供服务才能保证ZooKeeper的正常运行,那么,ZooKeeper容忍服务器崩溃的能力就会减弱。
Leader选举
Leader
作为整个ZooKeeper集群的主节点,负责响应所有对ZooKeeper状态变更的请求和进行选举投票的发起和决议,保证服务器数据一致性。它会将每个状态更新请求进行排序和编号,以便保证整个集群内部消息处理的FIFO
。
服务器具有4
种状态,分别是LOOKING
、FOLLOWING
、LEADING
、OBSERVING
。
-
LOOKING
:寻找Leader
状态。当服务器处于该状态时,当前集群中没有Leader
,因此需要进入Leader
选举状态。 -
FOLLOWING
:跟随者状态。表明当前服务器角色是Follower
。 -
LEADING
:领导者状态。表明当前服务器角色是Leader
。 -
OBSERVING
:观察者状态。表明当前服务器角色是Observer
,Observer
不参与投票和选举过程。
ZooKeeper的leader
选举过程分为两种,服务器初始化启动和服务器运行期间无法和leader
保持连接。选举过程如下图所示:
服务器初始化启动leader
选举分为以下几步:
-
每个Server发出一个投票。投票信息包含
myid
(服务器编号)和ZXID
(Zookeeper状态发生改变的序号),然后发给集群中其他机器。 -
接受来自各个服务器的投票。
-
处理投票。 优先检查
ZXID
。ZXID
大的服务器被选举为Leader
。如果ZXID
相同,myid
较大的服务器被选举为Leader
。 -
统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半服务器接受到相同的投票信息。
-
改变服务器状态。当确定了
leader
后,服务器更新当前状态,如果是Follower
,则更新为FOLLOWING
,如果是leader
,则更新为LEADING
。
服务器运行期间无法和leader
保持连接的leader
选举分为以下几步:
-
变更状态。非
Observer
首先将服务器状态变更为LOOKING
,然后进入Leader
选举过程。 -
其余步骤与服务器初始化启动
leader
选举过程相同,这里不再赘述。
ZooKeeper伪分布式安装
在了解ZooKeeper的仲裁模式(quorum
)后,下面讲解如何安装ZooKeeper的伪分布式(3
个服务器节点,法定人数2
)。
-
安装ZooKeeper第
1
个节点,与standalone
安装方法相同(且开发环境中已经安装,安装目录/opt/zookeeper-3.4.12
),这里不再赘述
cd /opt/zookeeper-3.4.12
vi /opt/zookeeper-3.4.12/conf/zoo.cfg
-
将
zoo.cfg
配置文件修改如下配置:
dataDir=/opt/zookeeper-3.4.12/tmp/data
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
-
其中,每一行分别是
ip
,通信端口,选举leader
端口。
修改后配置文件如下图所示:
指定myid
。在配置项dataDir
指定目录下,新建myid
文件,并写入数字1
(即第1
个服务器节点),使用以下命令:
mkdir -p /opt/zookeeper-3.4.12/tmp/data/
echo 1 > /opt/zookeeper-3.4.12/tmp/data/myid
cat /opt/zookeeper-3.4.12/tmp/data/myid
将ZooKeeper的安装目录复制2
个副本(即第2
个和第3
个服务器节点,命名可根据实际情况更改),使用如下命令(可根据实际安装目录修改):
cp -r /opt/zookeeper-3.4.12 /opt/zookeeper-3.4.12-01
cp -r /opt/zookeeper-3.4.12 /opt/zookeeper-3.4.12-02
cp -r /opt/zookeeper-3.4.12 /opt/zookeeper-3.4.12-03
第一个节点修改zoo.cfg
vi /opt/zookeeper-3.4.12-01/conf/zoo.cfg
dataDir=/opt/zookeeper-3.4.12-01/tmp/data
第二个节点修改zoo.cfg
vi /opt/zookeeper-3.4.12-02/conf/zoo.cfg
clientPort=2182
dataDir=/opt/zookeeper-3.4.12-02/tmp/data
第二个节点添加myid文件
echo 2 > /opt/zookeeper-3.4.12-02/tmp/data/myid
cat /opt/zookeeper-3.4.12-02/tmp/data/myid
第三个节点 修改zoo.cfg
vi /opt/zookeeper-3.4.12-03/conf/zoo.cfg
clientPort=2183
dataDir=/opt/zookeeper-3.4.12-03/tmp/data
第三个节点添加myid文件
echo 3 > /opt/zookeeper-3.4.12-03/tmp/data/myid
cat /opt/zookeeper-3.4.12-03/tmp/data/myid
分别三个启动节点
/opt/zookeeper-3.4.12-01/bin/zkServer.sh start
/opt/zookeeper-3.4.12-02/bin/zkServer.sh start
/opt/zookeeper-3.4.12-03/bin/zkServer.sh start
利用jps
命令查看当前进程,如下图所示,则伪分布式安装成功