一、分布式系统概念
在聊Zookeeper之前,我们先来聊聊什么是分布式系统;所谓分布式系统就是一个系统的软件或硬件组件分布在网络中的不同计算机之上,彼此间通过消息传递进行通信和协作的系统;简单讲就是一个系统的组件分布在不同网络中的各主机上,彼此通过消息传递通信和协作,我们把这样的系统就叫做分布式系统;
二、分布式系统的特征
1、分布性:所谓分布性就是指我们在上面描述的各组件分布在不同的网络中的不同计算机上;
2、对等性:所谓对等性是指不同计算节点上的组件没有主从之分,所有组件的角色身份都是平等的;
3、并发性:指集群中的各节点同时对一些资源进行并发访问;各节点同时并发访问一些资源,如何协调这些节点对同一资源的访问是一个分布式系统面临的一个问题;
4、缺乏全局时钟:集群各节点组件没有一个全局时钟;
5、故障必然会发生:这个是说一个分布式系统中的各个节点一定会故障发生;
三、分布式系统常见的故障
1、通信异常:集群各节点都是通过网络通信,如果因各网络设备故障或异常,或者网络线路故障都可导致通信异常;
2、网络分区:在发生通信异常后,各节点间通信延迟变得越来越高,最终会导致一个分布式系统的所有节点中,一部分能够正常通信,一部分不能正常通信,我们把这种现象叫做网络发生了分区;比如,两台server组成的集群,当其中一台server不能够正常的联系到另一台server,这个时候我们就说网络发生了分区;对于网络分区,如何界定哪台server的网络故障就先得尤为重要;
3、三态:指在分布式系统中各组件间的每一次请求和应答状态;如果能够正常响应请求我们就说本次请求成功被响应;反之,我们就说本次请求失败;除了这两种状态外,还有第三种,在分布式系统中网络是不可靠因素,因此各组件间调用就很有可能存在超时;所谓超时是指在一定时间范围内请求一直没有得到响应;
4、节点故障:指分布式系统中各节点因各种原因导致节点故障;比如节点断电宕机,人为操作不当等等;
四、CAP理论和BASE理论
CAP理论指一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance);这三个要素最多只能同时满足两个;这样一来我们的系统要么满足一致性和可用性,要么满足一致性和分区容错性,要么满足可用性和分区容错性;我们知道一个分布式系统各组件间传递消息来通信,所以网络分区容错性应该必须满足;这样一来我们的系统就必须在一致性和可用性之间做权衡;
BASE理论:BA表示基本可用,S表示软状态,E表示最终一致性;它主要是对CAP理论中的一致性和可用性进行权衡的结果;意思是说一个分布式系统应该满足系统基本可用(允许部分节点不可用),在一定时间窗口内我们允许各节点之间数据不一致,但要保证最终一致;
五、zookeeper简介
zookeeper是一个开源的分布式协调服务,由知名互联网公司Yahoo创建,它是Chubby的开源实现;换句话讲,zookeeper是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列;
zookeeper集群中的相关概念
集群角色:Leader、Follower、Observer;一个zookeeper(简称zk)集群,是由一个leader,多个Follower和Observer角色组成;其中Leader是由follower和observer选举产生,提供读写服务;Leader参与选举,能够被选举,提供读服务;Observer参与选举,不能够被选举,提供读服务;
zk会话:指客户端和服务端建立的tcp长链接;
数据节点(ZNode):即zk数据模型中的数据单元;zk的数据都存储于内存中,数据模型为树状结构(ZNode Tree);每个ZNode都会保存自己的数据于内存中;其中ZNode节点又分持久节点和临时节点,所谓持久节点指仅显式删除才消失的节点;临时节点指会话中止即自动消失的节点;
版本(version):ZK会为每个ZNode维护一个称之为Stat的数据结构,记录了当前ZNode的三个数据版本;当前版本(version),当前znode的子节点的版本(cversion),当前znode的ACL的版本(aversion);
ACL:ZK使用ACL机制进行权限控制;CREATE, READ,WRITE,DELETE,ADMIN;
事件监听器(Watcher):ZK上,由用户指定的触发机制,在某些事件产生时,ZK能够将通知给相关的客户端;
ZAB协议:Zookeeper Atomic Broadcast,ZK原子广播协议;Zab协议是为分布式协调服务Zookeeper专门设计的一种 支持崩溃恢复的原子广播协议; 主要作用是在zk集群leader崩溃以后,能够基于此协议选举新leader,并且保证数据最终一致性和完整性;zk客户端连接zk集群中的任何一个节点,发起请求,如果客户端发送读请求,则直接由当前节点响应;如果客户端发送的是写请求,且当前节点不是leader节点,则由当前节点把写请求,转发给leader,由leader进行写事务广播,只有超过集群节点半数的响应允许写,该事务才会被并提交;只有当leader写成功后,leader会通知各follower来同步数据;对于zab协议来讲,它存在三种状态,分别是Looking,Following和Leading;所谓looking状态指zk集群正在启动或leader崩溃以后,各节点进行选举的过程时的状态;following状态指当zk集群中有leader以后,各个follower的状态;leading状态就是指leader所属状态;所以zk集群中的各节点都会在这三个状态上来回转换,在集群刚启动或leder崩溃以后,各节点都会切换为looking状态,在选举产生leader以后,当选leader的节点会从looking切换为leading状态,其他follower会从looking切换为following状态;只要zk集群触发一次新的选举,都会经过上述状态的转换;
六、zookeeper集群部署
环境说明
主机名 | ip地址 |
node01 | 192.168.0.41 |
node02 | 192.168.0.42 |
node03 | 192.168.0.43 |
1、集群各节点安装jdk
1 | [root@node01 ~] # yum install -y java-1.8.0-openjdk-devel |
提示:各节点的时间同步、selinux、iptables和firewalld服务的配置都要提前做好;
验证:在各节点执行java -version看看对应java的版本是不是我们安装的版本?
提示:只要在各节点上能够看到对应版本的java信息出现,并且是我们指定的版本,说明java环境没有问题;
2、下载zookeeper二进制包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | [root@node01 ~] # cd /usr/local/ [root@node01 local ] # ll total 0 drwxr-xr-x. 2 root root 6 Nov 5 2016 bin drwxr-xr-x. 2 root root 6 Nov 5 2016 etc drwxr-xr-x. 2 root root 6 Nov 5 2016 games drwxr-xr-x. 2 root root 6 Nov 5 2016 include drwxr-xr-x. 2 root root 6 Nov 5 2016 lib drwxr-xr-x. 2 root root 6 Nov 5 2016 lib64 drwxr-xr-x. 2 root root 6 Nov 5 2016 libexec drwxr-xr-x. 2 root root 6 Nov 5 2016 sbin drwxr-xr-x. 5 root root 49 Sep 15 20:33 share drwxr-xr-x. 2 root root 6 Oct 19 19:42 src [root@node01 local ] # wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz --2020-10-19 19:42:52-- https: //mirrors .tuna.tsinghua.edu.cn /apache/zookeeper/zookeeper-3 .6.2 /apache-zookeeper-3 .6.2-bin. tar .gz Resolving mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1 Connecting to mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12515974 (12M) [application /x-gzip ] Saving to: ‘apache-zookeeper-3.6.2-bin. tar .gz’ 100%[================================================================================>] 12,515,974 4.02MB /s in 3.0s 2020-10-19 19:42:55 (4.02 MB /s ) - ‘apache-zookeeper-3.6.2-bin. tar .gz’ saved [12515974 /12515974 ] [root@node01 local ] # ll total 12224 -rw-r--r-- 1 root root 12515974 Sep 9 19:36 apache-zookeeper-3.6.2-bin. tar .gz drwxr-xr-x. 2 root root 6 Nov 5 2016 bin drwxr-xr-x. 2 root root 6 Nov 5 2016 etc drwxr-xr-x. 2 root root 6 Nov 5 2016 games drwxr-xr-x. 2 root root 6 Nov 5 2016 include drwxr-xr-x. 2 root root 6 Nov 5 2016 lib drwxr-xr-x. 2 root root 6 Nov 5 2016 lib64 drwxr-xr-x. 2 root root 6 Nov 5 2016 libexec drwxr-xr-x. 2 root root 6 Nov 5 2016 sbin drwxr-xr-x. 5 root root 49 Sep 15 20:33 share drwxr-xr-x. 2 root root 6 Oct 19 19:42 src [root@node01 local ] # scp apache-zookeeper-3.6.2-bin.tar.gz node02:/usr/local/ apache-zookeeper-3.6.2-bin. tar .gz 100% 12MB 26.8MB /s 00:00 [root@node01 local ] # scp apache-zookeeper-3.6.2-bin.tar.gz node03:/usr/local/ apache-zookeeper-3.6.2-bin. tar .gz 100% 12MB 32.7MB /s 00:00 [root@node01 local ] # |
解压二进制包,并把解压后的目录做软链接
提示:其他两个节点都要做相同的操作;
3、配置zookeeper
提示:zookeeper在二进制包中给我们提供了一个示例配置文件其路径为conf/下名为zoo_sample.cfg,我们需要将其复制为zoo.cfg,然后基于此文件做修改即可;这里主要修改dataDir,从名字上我们可以知道,这个参数是指定zookeeper的数据目录;上面的tickTime用于指定节点向leader发送心跳的间隔时间,单位毫秒,一般不用改;initLimit用于指定初始化阶段要经过多个tickTime时长;超出则为初始化超时或初始化失败;syncLimit用户指定同步阶段需要经过多少个tickTime时长,超出指定的时长,则为同步失败,或同步超时;clientPort用于指定客户端连接zk集群所用端口,即zk集群客户监听端口;后面的server.1使用于配置集群第一个节点的信息;其语法格式为server.id=[hostname or ipaddr ]:port:port[:observer];其中第一个port用于指定follower与leader进行通信和数据同步时所使用端口;第二个port是指定leader选举时使用的端口;集群中有多少zk主机就要配置多少个server,并且每个server的ID必须唯一,除此之外对应在配置文件中配置的serverID必须同对应server上的数据目录下的myid文件内容中的ID保持一致;
zk配置参数说明
除了以上配置,zk还有其他配置
复制配置文件到集群各节点,创建数据目录并在其数据目录下各自创建用于保存节点id的myid文件,其内容仅为当前节点的server id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@node01 conf] # scp zoo.cfg node02:/usr/local/zookeeper/conf/ zoo.cfg 100% 1244 412.3KB /s 00:00 [root@node01 conf] # scp zoo.cfg node03:/usr/local/zookeeper/conf/ zoo.cfg 100% 1244 486.7KB /s 00:00 [root@node01 conf] # mkdir /data/zookeeper -pv mkdir : created directory ‘ /data ’ mkdir : created directory ‘ /data/zookeeper ’ [root@node01 conf] # echo 1 >/data/zookeeper/myid [root@node01 conf] # cat /data/zookeeper/myid 1 [root@node01 conf] # ssh node02 'mkdir -pv /data/zookeeper/ && echo 2 >/data/zookeeper/myid && cat /data/zookeeper/myid' mkdir : created directory ‘ /data ’ mkdir : created directory ‘ /data/zookeeper/ ’ 2 [root@node01 conf] # ssh node03 'mkdir -pv /data/zookeeper/ && echo 3 >/data/zookeeper/myid && cat /data/zookeeper/myid' mkdir : created directory ‘ /data ’ mkdir : created directory ‘ /data/zookeeper/ ’ 3 [root@node01 conf] # |
提示:这里的myid中的server id是根据其配置文件中配置的server id,意思就是主配置文件中的server id 要和其当前主节点中的myid保持一致,否则zk集群启动不了;如果只有一台zkserver,可以只配置单台zkserver的属性信息,不用在其数据目录下创建myid保存serverID;
在各节点启动zookeeper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | [root@node01 ~] # /usr/local/zookeeper/bin/zkServer.sh --help /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Usage: /usr/local/zookeeper/bin/zkServer .sh [--config <conf- dir >] {start|start-foreground|stop|version|restart|status|print-cmd} [root@node01 ~] # /usr/local/zookeeper/bin/zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Starting zookeeper ... STARTED [root@node01 ~] # ssh node02 '/usr/local/zookeeper/bin/zkServer.sh start' /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Starting zookeeper ... STARTED [root@node01 ~] # ssh node03 '/usr/local/zookeeper/bin/zkServer.sh start' /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Starting zookeeper ... STARTED [root@node01 ~] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.41:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::2181 :::* LISTEN 0 50 :::35879 :::* [root@node01 ~] # |
提示:可以看到node01上3888、2181、8080这三个端口都处于监听状态了;8080是jetty监听的端口,用于管理用,如果修改其监听端口可以在配置文件中加admin.serverPort=来定义即可;
node02上监听端口情况
1 2 3 4 5 6 7 8 9 10 11 12 | [root@node02 local ] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.42:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::2181 :::* LISTEN 0 50 :::35589 :::* LISTEN 0 50 ::ffff:192.168.0.42:2888 :::* [root@node02 local ] # |
提示:node02相对node01多监听了一个2888端口,这个端口只有leader节点才会监听,从查看端口的情况就可以判断node02此时是leader节点;
node03上监听端口情况
1 2 3 4 5 6 7 8 9 10 11 | [root@node03 local ] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.43:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::46683 :::* LISTEN 0 50 :::2181 :::* [root@node03 local ] # |
提示:node03和node01一样,都没有监听2888端口,说明这两个几点是follower节点;到此一个三节点的zookeeper集群就搭建好了;
测试:使用zkServer.sh status查看当前节点状态
提示:可以看到node02是leader;
把node02的zk重启,看看它是否还是leader?
提示:可以看到当node02重启后,再次加入集群就不再是leader了;
使用zkCli.sh连接zk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | [zk: localhost:2181(CONNECTED) 0] ? ZooKeeper -server host:port -client-configuration properties- file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [- v version] path deleteall path [-b batch size] delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [- v version] [[- file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [- v version] path data setAcl [-s] [- v version] [-R] path acl setquota -n|-b val path stat [-w] path sync path version Command not found: Command not found ? [zk: localhost:2181(CONNECTED) 1] |
提示:在集群任意一个节点使用zkCli.sh 即可连接当前节点的2181端口;连接以后会有一个zk的控制台,我们输入一个不存在的命令,可打印在当前控制台上所使用的命令有哪些;
查看数据节点
1 2 3 4 5 | [zk: localhost:2181(CONNECTED) 1] ls ls [-s] [-w] [-R] path [zk: localhost:2181(CONNECTED) 2] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 3] |
提示:zk的数据节点类似Linux文件系统,它也是一颗倒置的树状结构;
创建一个数据节点,并给一个数据内容将其存入到创建的节点
1 2 3 4 5 | [zk: localhost:2181(CONNECTED) 11] create /test "test01" Created /test [zk: localhost:2181(CONNECTED) 12] ls / [ test , zookeeper] [zk: localhost:2181(CONNECTED) 13] |
提示:默认不指定任何选项,创建的节点都是持久节点,即会话断开对应节点不会自动删除;如果需要创建一个临时节点需要用到-e选项来明确指定创建一个临时节点;
查看/test节点的数据
1 2 3 | [zk: localhost:2181(CONNECTED) 13] get /test test01 [zk: localhost:2181(CONNECTED) 14] |
修改/test节点的数据
1 2 3 4 | [zk: localhost:2181(CONNECTED) 14] set /test "test data version 2" [zk: localhost:2181(CONNECTED) 15] get /test test data version 2 [zk: localhost:2181(CONNECTED) 16] |
删除/test节点
1 2 3 4 | [zk: localhost:2181(CONNECTED) 16] delete /test [zk: localhost:2181(CONNECTED) 17] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 18] |
提示:delete是删除一个下面没有子节点的节点,如果对应节点下还有子节点,需要用到deleteall来删除;
删除带有子节点的节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [zk: localhost:2181(CONNECTED) 25] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 26] create /test "test01" Created /test [zk: localhost:2181(CONNECTED) 27] ls / [ test , zookeeper] [zk: localhost:2181(CONNECTED) 28] create /test/aa "test02" Created /test/aa [zk: localhost:2181(CONNECTED) 29] ls /test [aa] [zk: localhost:2181(CONNECTED) 30] ls -R /test /test /test/aa [zk: localhost:2181(CONNECTED) 31] delete /test Node not empty: /test [zk: localhost:2181(CONNECTED) 32] deleteall /test [zk: localhost:2181(CONNECTED) 33] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 34] |
提示:ls -R表示递归查看指定节点及其子节点;
查看集群成员配置信息
1 2 3 4 5 6 | [zk: localhost:2181(CONNECTED) 38] config server.1=192.168.0.41:2888:3888:participant server.2=192.168.0.42:2888:3888:participant server.3=192.168.0.43:2888:3888:participant version=0 [zk: localhost:2181(CONNECTED) 39] |
查看指定节点的状态信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [zk: localhost:2181(CONNECTED) 40] stat stat [-w] path [zk: localhost:2181(CONNECTED) 41] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x200000014 cversion = 9 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 42 |
zk四字命令使用
查看生效的配置
1 2 3 | [root@node01 ~] # echo conf |nc node01 2181 conf is not executed because it is not in the whitelist. [root@node01 ~] # |
提示:默认zk没有开启四字命令;需要到配置文件中配置4lw.commands.whitelist=*,然后保存重启zk即可支持四字命令;
重启zk,再来使用conf命令查看生效配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [root@node01 ~] # /usr/local/zookeeper/bin/zkServer.sh restart /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Stopping zookeeper ... STOPPED /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/ .. /conf/zoo .cfg Starting zookeeper ... STARTED [root@node01 ~] # echo conf |nc node01 2181 clientPort=2181 secureClientPort=-1 dataDir= /data/zookeeper/version-2 dataDirSize=134218360 dataLogDir= /data/zookeeper/version-2 dataLogSize=134218360 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 clientPortListenBacklog=-1 serverId=1 initLimit=10 syncLimit=5 electionAlg=3 electionPort=3888 quorumPort=2888 peerType=0 membership: server.1=192.168.0.41:2888:3888:participant server.2=192.168.0.42:2888:3888:participant server.3=192.168.0.43:2888:3888:participant version=0[root@node01 ~] # |
查看当前server上的zk连接信息
1 2 3 4 | [root@node01 ~] # echo cons | nc node01 2181 /192 .168.0.41:58920[0](queued=0,recved=1,sent=0) [root@node01 ~] # |
测试zk是否能够正常连接
1 2 | [root@node01 ~] # echo ruok | nc node01 2181 imok[root@node01 ~] # |
提示:返回imok表示zk节点上可以正常连接的;
列出当前zkserver的版本信息、数据接收/发送量、连接数、节点模式、Node数、最大/平均/最小延迟数
1 2 3 4 5 6 7 8 9 10 11 | [root@node01 ~] # echo srvr | nc node01 2181 Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09 /04/2020 12:44 GMT Latency min /avg/max : 0 /0 .0 /0 Received: 6 Sent: 5 Connections: 1 Outstanding: 0 Zxid: 0x200000016 Mode: follower Node count: 5 [root@node01 ~] # |
列出事件监听器的连接数和总数
1 2 3 4 | [root@node01 ~] # echo wchs |nc node01 2181 0 connections watching 0 paths Total watches:0 [root@node01 ~] # |
列出当前zkserver的环境信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@node01 ~] # echo envi| nc node01 2181 Environment: zookeeper.version=3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09 /04/2020 12:44 GMT host.name=node01. test .org java.version=1.8.0_262 java.vendor=Oracle Corporation java.home= /usr/lib/jvm/java-1 .8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 /jre java.class.path= /usr/local/zookeeper/bin/ .. /zookeeper-server/target/classes : /usr/local/zookeeper/bin/ .. /build/classes : /usr/local/zookeeper/bin/ .. /zookeeper-server/target/lib/ *.jar: /usr/local/zookeeper/bin/ .. /build/lib/ *.jar: /usr/local/zookeeper/bin/ .. /lib/zookeeper-prometheus-metrics-3 .6.2.jar: /usr/local/zookeeper/bin/ .. /lib/zookeeper-jute-3 .6.2.jar: /usr/local/zookeeper/bin/ .. /lib/zookeeper-3 .6.2.jar: /usr/local/zookeeper/bin/ .. /lib/snappy-java-1 .1.7.jar: /usr/local/zookeeper/bin/ .. /lib/slf4j-log4j12-1 .7.25.jar: /usr/local/zookeeper/bin/ .. /lib/slf4j-api-1 .7.25.jar: /usr/local/zookeeper/bin/ .. /lib/simpleclient_servlet-0 .6.0.jar: /usr/local/zookeeper/bin/ .. /lib/simpleclient_hotspot-0 .6.0.jar: /usr/local/zookeeper/bin/ .. /lib/simpleclient_common-0 .6.0.jar: /usr/local/zookeeper/bin/ .. /lib/simpleclient-0 .6.0.jar: /usr/local/zookeeper/bin/ .. /lib/netty-transport-native-unix-common-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-transport-native-epoll-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-transport-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-resolver-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-handler-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-common-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-codec-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/netty-buffer-4 .1.50.Final.jar: /usr/local/zookeeper/bin/ .. /lib/metrics-core-3 .2.5.jar: /usr/local/zookeeper/bin/ .. /lib/log4j-1 .2.17.jar: /usr/local/zookeeper/bin/ .. /lib/json-simple-1 .1.1.jar: /usr/local/zookeeper/bin/ .. /lib/jline-2 .14.6.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-util-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-servlet-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-server-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-security-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-io-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/jetty-http-9 .4.24.v20191120.jar: /usr/local/zookeeper/bin/ .. /lib/javax .servlet-api-3.1.0.jar: /usr/local/zookeeper/bin/ .. /lib/jackson-databind-2 .10.3.jar: /usr/local/zookeeper/bin/ .. /lib/jackson-core-2 .10.3.jar: /usr/local/zookeeper/bin/ .. /lib/jackson-annotations-2 .10.3.jar: /usr/local/zookeeper/bin/ .. /lib/commons-lang-2 .6.jar: /usr/local/zookeeper/bin/ .. /lib/commons-cli-1 .2.jar: /usr/local/zookeeper/bin/ .. /lib/audience-annotations-0 .5.0.jar: /usr/local/zookeeper/bin/ .. /zookeeper- *.jar: /usr/local/zookeeper/bin/ .. /zookeeper-server/src/main/resources/lib/ *.jar: /usr/local/zookeeper/bin/ .. /conf : java.library.path= /usr/java/packages/lib/amd64 : /usr/lib64 : /lib64 : /lib : /usr/lib java.io.tmpdir= /tmp java.compiler=<NA> os.name=Linux os.arch=amd64 os.version=3.10.0-693.el7.x86_64 user.name=root user.home= /root user. dir = /root os.memory. free =26MB os.memory.max=889MB os.memory.total=37MB [root@node01 ~] # |
好了,到此zk集群搭建就完成了,通常zk集群应用的场景很多,比如分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列;很多分布式服务都可以借助zk集群做服务发现和服务注册;