环境准备
-
先从ZooKeeper的官网找到下载地址
-
准备四台配置已经安装过JDK的linux机器,本文就通过虚拟机软件来模拟集群了,四台机器我分别称之为
node01
,node02
,node03
,node04
。 -
先进入node01环境中,找到想保存安装包的目录,通过命令
wget {download_link}
进行下载,其中download_link是我们第一步拿到的网址。 -
将上述得到的安装包进行解压,建议解压到
/opt
目录下,本文解压到opt/zookeeper
目录中tar xf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/zookeeper/
-
首先来准备ZooKeeper的配置文件。从解压后的目录中,我们会发现一个
conf
目录,进入这个目录后会发现一个文件名为zoo_sample.cfg
的文件。将这个文件复制,并命名为zoo.cfg
。cd apache-zookeeper-3.6.3-bin/conf/ cp zoo_sample.cfg zoo.cfg
-
创建完zookeeper的配置文件后,对这个文件进行一些魔改。
dataDir
改为/var/zookeeper
,这个目录是用来持久化的。在该文件的最后添加下面一段
server.1={node01的ip地址}:2888:3888 server.2={node02的ip地址}:2888:3888 server.3={node03的ip地址}:2888:3888 server.4={node04的ip地址}:2888:3888
需要把大括号中的内容替换掉。
最后一段的意思是说,当前ZK集群一共有四台机器。
当没有leader被选出来的时候,四台机器通过端口
3888
进行沟通。当leader被选出来后,其他机器连接leader的
2888
端口进行通信。 -
将刚才指定的持久化目录创建出来
mkdir /var/zookeeper
-
然后第六步创建的目录中新建一个名为
myid
的文件,其中只写一个数字——1
。 -
将node01中
/opt/zookeeper/
的内容分发给其他几台node,通过scp的命令。# 在/opt目录下 scp -r ./zookeeper/ xxx.xxx.xxx.xxx:`pwd`
xxx.xxx.xxx.xxx
是指其他node的ipv4地址。 -
在每一台node的目录
/var/zookeeper
中,新建一个myid的文件,然后将对应的编号填上,比如node02的文件中就写2。# 例如,在node02中 mkdir /var/zookeeper echo 2 > /var/zookeeper/myid
-
将ZooKeeper的命令加到系统路径中,这样就可以直接在命令行中执行ZK的命令了。
vi /etc/profile
ZOOKEEPER_HOME=/opt/zookeeper/apache-zookeeper-3.6.3-bin PATH=$ZOOKEEPER_HOME/bin:PATH
然后通过下面命令让上面的变化生效。
. /etc/profile
-
验证:在命令行中输入
zk
,然后按Tab
键,就会看到命令补全提示:> zk zkCleanup.sh zkEnv.sh zkSnapShotToolkit.cmd zkCli.cmd zkServer.cmd zkSnapShotToolkit.sh zkCli.sh zkServer-initialize.sh zkTxnLogToolkit.cmd zkEnv.cmd zkServer.sh zkTxnLogToolkit.sh
-
用与第9步相同的方法,将上面修改完的
profile
文件分发给其他node。scp /etc/profile xxx.xxx.xxx.xxx:/etc
启动集群
-
为了实验目的,为了能让各个节点之间相互通信,需要关闭防火墙,注意,在生产环境中不能关闭防火墙,需要跟运维沟通,但此处只是为了做实验。
systemctl stop firewalld.service
-
在每一台ZK node中执行启动命令
zkServer.sh start-foreground
-
在本文的实验环境中,因为在配置文件中已经声明了只有四台机器,所以当启动机器数目达到半数以上(3台),即可选出leader。
通过命令
zkServer.sh status
可以查看当前节点的角色:> zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leader
-
如果把当前的主节点——node3给停掉,ZK集群会快速的选出另外一个节点当做主节点。
交互
集群启动完后之后,就可以与ZK进行交互了。
一点前置知识:ZK在单个节点上是以目录树的形式存在的。
-
通过命令
zkCli.sh
进入命令行界面。 -
通过
help
命令可以查看可用的命令 -
在当前目录下创建一个新目录:
create /testDir "testData"
-
查看某个目录下的情况,通过
ls
命令。> ls / [testDir, zookeeper]
-
获取某个目录的内容:get
> get /testDir testData
-
获取某个目录更详细的内容:get -s
> get -s /testDir testData cZxid = 0x100000002 ctime = Mon May 24 00:22:57 EDT 2021 mZxid = 0x100000002 mtime = Mon May 24 00:22:57 EDT 2021 pZxid = 0x100000002 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 8 numChildren = 0
cZxid
—— (create) ZK Transaction IDmZxid
——(modify)ZK Transaction IDpZxid
——(parent) ZK Transaction IDephemeralOwner
—— 归属者。如果创建一个临时节点的时候,就会看到这里有变化。