服务器leader选举
为进一步了解ZooKeeper的leader
选举过程,本节实训利用服务器的关闭启动,观察服务器的leader
产生过程。利用以下命令查看当前服务器节点的状态(/xxx
为安装目录):
./xxx/bin/zkServer.sh status
当仅启动1
个服务器节点,服务器状态如下:
服务器通信报错,集群未运行(3
个节点,法定人数至少为2
)。
当启动第2
个节点后,分别查看第1
个和第2
个服务器状态:
可以发现,第1
个服务器转换为follower
,第2
个服务器转换为leader
(可对比上一关启动时leader
选举过程)。
当启动第3
个节点后,由于已经存在了leader
,那么第3
个节点应该为follower
,查看状态如下:
此时,关闭第2
个节点,即模拟leader
崩溃。那么按照上一关所述,myid
较大的节点成为leader
,即第3
个节点成为leader
,关闭第2
个节点并查看第3
个节点状态:
客户端连接服务器
客户端连接多个服务器与连接单个服务器命令相同,使用以下命令连接:
zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
其中,每1
个逗号为1
个服务器(IP + clientPort
)。
可以通过启动命令行,看到当前客户端具体连接到哪一个服务器。如下图所示:
如果连接的127.0.0.1:2181
服务器节点(即第1
个服务器节点)崩溃,是否会拒绝连接。关闭第1
个服务器节点,观察客户端行为:
可以发现,当前连接的服务器崩溃或失去连接时,客户端会自动连接及其中其他服务器,从而保证ZooKeeper服务可用。
当继续关闭第127.0.0.1:2182
服务器节点(即第2
个服务器节点),是否会拒绝连接。关闭第2
个服务器节点,观察客户端行为:
当存活服务器小于法定人数时,服务器会拒绝连接,即使当前第3
个节点仍然存活。
分布式配置
分布式配置与伪分布式配置,主要有以下区别,其余配置均相同:
伪分布式所使用的端口必须不同,分布式端口可以相同。
伪分布式统一使用一个
IP
,分布式需要根据当前网络IP
配置。
以下为分布式与伪分布式配置对比(以3
个服务器节点为例):
配置 | 伪分布式 | 分布式 |
---|---|---|
clienPort | 2181;2182;2183 | 2181;2181;2181 |
server.1 | 127.0.0.1:2888:3888 | xxx.xxx.xxx.xxx:2888:3888 |
server.2 | 127.0.0.1:2889:3889 | xxx.xxx.xxx.xxx:2888:3888 |
server.3 | 127.0.0.1:2890:3890 | xxx.xxx.xxx.xxx:2888:3888 |
编程要求
本关任务是使用命令行,按顺序完成以下操作:
在前一关的基础上,将客户端连接服务器(
IP:127.0.0.1
,端口分别为2181
,2182
,2183
)。观察当前客户端连接的服务器。
创建
/quorum_test
节点,节点数据为quorum_test
。断开客户端与服务器连接(
quit
命令)。
第一关操作成功基础上操作
启动节点
/opt/zookeeper-3.4.12/bin/zkServer.sh start /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
客户端连接服务器 zkCli.sh -server 127.0.0.1:2181 创建节点 create /quorum_test "quorum_test" 关闭节点 quit zkCli.sh -server 127.0.0.1:2182 create /quorum_test "quorum_test" quit zkCli.sh -server 127.0.0.1:2183 create /quorum_test "quorum_test" quit