1、简介
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.
2、单机部署
[root@localhost ~]# cd /usr/src
[root@localhost src]# wget https://downloads.apache.org/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
[root@localhost src]# tar zxvf apache-zookeeper-3.6.1-bin.tar.gz
[root@localhost src]# mv apache-zookeeper-3.6.1-bin /usr/local/zookeeper
[root@localhost src]# cd /usr/local/zookeeper/
[root@localhost zookeeper]# ll
总用量 32
drwxr-xr-x 2 zabbix zabbix 289 2月 25 22:36 bin
drwxr-xr-x 2 zabbix zabbix 77 2月 25 22:36 conf
drwxr-xr-x 5 zabbix zabbix 4096 2月 25 22:37 docs
drwxr-xr-x 2 root root 4096 4月 30 10:09 lib
-rw-r--r-- 1 zabbix zabbix 11358 2月 25 22:36 LICENSE.txt
-rw-r--r-- 1 zabbix zabbix 432 2月 25 22:36 NOTICE.txt
-rw-r--r-- 1 zabbix zabbix 1963 2月 25 22:36 README.md
-rw-r--r-- 1 zabbix zabbix 3166 2月 25 22:36 README_packaging.md
[root@localhost zookeeper]# cd conf/
[root@localhost conf]# cp zoo_sample.cfg zoo_sample.cfg.bak
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
启动服务
[root@localhost bin]# ll
总用量 64
-rwxr-xr-x 1 zabbix zabbix 232 2月 25 22:36 README.txt
-rwxr-xr-x 1 zabbix zabbix 2066 2月 25 22:36 zkCleanup.sh
-rwxr-xr-x 1 zabbix zabbix 1158 2月 25 22:36 zkCli.cmd
-rwxr-xr-x 1 zabbix zabbix 1620 2月 25 22:36 zkCli.sh
-rwxr-xr-x 1 zabbix zabbix 1843 2月 25 22:36 zkEnv.cmd
-rwxr-xr-x 1 zabbix zabbix 3690 2月 25 22:36 zkEnv.sh
-rwxr-xr-x 1 zabbix zabbix 1286 2月 25 22:36 zkServer.cmd
-rwxr-xr-x 1 zabbix zabbix 4559 2月 25 22:36 zkServer-initialize.sh
-rwxr-xr-x 1 zabbix zabbix 9515 2月 25 22:36 zkServer.sh
-rwxr-xr-x 1 zabbix zabbix 988 2月 25 22:36 zkSnapShotToolkit.cmd
-rwxr-xr-x 1 zabbix zabbix 1377 2月 25 22:36 zkSnapShotToolkit.sh
-rwxr-xr-x 1 zabbix zabbix 996 2月 25 22:36 zkTxnLogToolkit.cmd
-rwxr-xr-x 1 zabbix zabbix 1385 2月 25 22:36 zkTxnLogToolkit.sh
[root@localhost bin]# sh zkServer.sh start &
[1] 9237
[root@localhost bin]# ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 服务端名称 QuorumPeerMain
[root@localhost bin]# jps
9255 QuorumPeerMain
9303 Jps
# 启动状态 standalone
[root@localhost bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
CLI 访问
[root@localhost bin]# sh zkCli.sh -server localhost:2181
...
Welcome to ZooKeeper!
JLine support is enabled
...
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
CLI 退出
[zk: localhost:2181(CONNECTED) 0] quit
[root@localhost bin]#
停止服务
[root@localhost bin]# sh zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
3、集群部署
准备三台机器分别部署zookeeper:
server.1=10.0.0.147:2188:2888
server.2=10.0.0.149:2188:2888
server.3=10.0.0.150:2188:2888
echo “1”>/tmp/zookeeper/myid
echo “2”>/tmp/zookeeper/myid
echo “3”>/tmp/zookeeper/myid
10.0.0.147部署
# 添加以下配置
[root@localhost bin]# vim /usr/local/zookeeper/conf/zoo.cfg
server.1=10.0.0.147:2188:2888
server.2=10.0.0.149:2188:2888
server.3=10.0.0.150:2188:2888
[root@localhost bin]# mkdir /tmp/zookeeper/
[root@localhost bin]# touch /tmp/zookeeper/myid
[root@localhost bin]# echo "1">/tmp/zookeeper/myid
[root@localhost bin]# sh zkServer.sh start &
[1] 12072
[root@localhost bin]# ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
10.0.0.149部署
# 添加以下配置
[root@localhost bin]# vim /usr/local/zookeeper/conf/zoo.cfg
server.1=10.0.0.147:2188:2888
server.2=10.0.0.149:2188:2888
server.3=10.0.0.150:2188:2888
[root@localhost bin]# mkdir /tmp/zookeeper/
[root@localhost bin]# touch /tmp/zookeeper/myid
[root@localhost bin]# echo "2">/tmp/zookeeper/myid
[root@localhost bin]# sh zkServer.sh start &
[1] 6506
[root@localhost bin]# ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
10.0.0.150部署
# 添加以下配置
[root@localhost bin]# vim /usr/local/zookeeper/conf/zoo.cfg
server.1=10.0.0.147:2188:2888
server.2=10.0.0.149:2188:2888
server.3=10.0.0.150:2188:2888
[root@localhost bin]# mkdir /tmp/zookeeper/
[root@localhost bin]# touch /tmp/zookeeper/myid
[root@localhost bin]# echo "3">/tmp/zookeeper/myid
[root@localhost bin]# sh zkServer.sh start &
[1] 12072
[root@localhost bin]# ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
10.0.0.147查看状态为leader
[root@localhost bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
10.0.0.149查看状态为follower
[root@localhost bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
10.0.0.150查看状态为follower
[root@localhost bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
集群访问
[root@localhost bin]# sh zkCli.sh -server 10.0.0.147:2181;10.0.0.149:2181;10.0.0.150:2181
...
[zk: 10.0.0.147:2181(CONNECTED) 0] ls /
[zookeeper]
如果出现NoRouteToHostException异常,请查看防火墙和Selinux,ConnectException也会在单节点刚启动时出现,由于其他集群节点尚未启动,故无法与集群其他节点进行连接。
java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:677)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:748)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:776)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:958)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1425)
java.net.ConnectException: 拒绝连接 (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:677)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:748)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:776)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:958)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1425)
4、配置文件解析
# 默认2000
tickTime=2000
# 接受客户端连接zk初始化的最长等待心跳时长=initLimit*tickTime
initLimit=10
# Leader和Follower之间的通讯时长最长不超过syncLimit*tickTime
syncLimit=5
# 数据目录
dataDir=/tmp/zookeeper
# 服务端暴露端口号
clientPort=2181
# 集群第一台服务器的IP=10.0.0.147,Leader和Follower之间通信端口为2188,集群通过2888端口进行Leader选举
server.1=10.0.0.147:2188:2888
server.2=10.0.0.149:2188:2888
server.3=10.0.0.150:2188:2888
5、命令详解
ls 查看某个目录包含的所有文件
ls -s 查看某个目录包含的所有文件,可以查看到time、version等信息
create 创建znode,并设置初始内容
get 获取znode的数据
set 修改znode内容
delete 删除znode
quit 退出客户端
help 帮助命令
rmr 递归删除
[zk: 10.0.0.147:2181(CONNECTED) 6] create /cluo 666
Created /cluo
[zk: 10.0.0.147:2181(CONNECTED) 7] ls /
[cluo, zookeeper]
[zk: 10.0.0.147:2181(CONNECTED) 8] get /cluo
666
[zk: 10.0.0.147:2181(CONNECTED) 9] set /cluo 777
[zk: 10.0.0.147:2181(CONNECTED) 10] get /cluo
777
[zk: 10.0.0.147:2181(CONNECTED) 15] ls -s /cluo
[]
cZxid = 0x100000002
ctime = Thu Apr 30 14:12:36 CST 2020
mZxid = 0x100000004
mtime = Thu Apr 30 14:13:35 CST 2020
pZxid = 0x100000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0