Zookeeper
介绍
-
ZooKeeper
是Hadoop的开源子项目(Google Chubby
的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护
、命名服务
、分布式同步
、组服务
等。 -
Zookeeper
的核心是一个精简的文件系统
,它提供一些简单的操作和一些额外的抽象操作,例如排序和通知。 -
理解
Zookeeper
的一种方法就是将其看作一个具有高可用性的文件系统,但这个文件系统中没有文件和目录,而是统一使用"节点"的概念,称为znode
。 -
分布式系统中的进程通信有两种选择:直接通过网络进行信息交换或读写某些共享存储,
Zookeeper
使用共享存储模型来实现应用间的协作和同步原语,对于共享存储本身,又需要在进程和存储间进行网络通信。
安装
单击安装
-
安装JDK6或者以上版本
-
安装
Zookeeper
$ tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/ $ cd /usr/local/zookeeper-3.4.6/ 复制一份配置文件,Zookeeper默认会找名称为zoo.cfg的文件 $ cp zoo_sample.cfg zoo.cfg
-
配置详解
tickTime
:这个时间是作为Zookeeper
服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime
时间就会发送一个心跳。dataDir
:数据目录,可以是任意目录dataLogDir
: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.clientPort
: 监听client连接的端口号.clientPort=2181
-
修改日志输出,默认
Zookeeper
的日志输出信息都打印到了zookeeper.out
文件中,这样输出路径和大小没法控制。- 修改
bin/zkEnv.sh
文件
- 修改
conf/log4j.properties
- 修改
-
启动
扫描二维码关注公众号,回复: 3717709 查看本文章$ cd /usr/local/zookeeper-3.4.6/bin $ ./zkServer.sh start
-
客户端连接
$ cd /usr/local/zookeeper-3.4.6/bin $ ./zkCli.sh -server localhost:2181
集群安装
-
为了获得可靠的
ZooKeeper
服务,用户应该在一个集群上部署ZooKeeper
。只要集群上大多数(过半)的ZooKeeper
服务启动了,那么总的ZooKeeper
服务将是可用的。另外,最好使用奇数台机器(仅仅是建议并非强制)。如果ZooKeeper
拥有5台机器,那么它就能处理2台机器的故障了,2n+1=总数
,n即为可容纳的故障节点 -
在服务器的data目录(dataDir参数所指定的目录)下创建一个名称为
myid
的文件,这个文件仅仅只有一行的内容(1-255之间的数字),指定的是自身的id(集群中所有节点的id都不一样) -
集群环境准备,实际ip可以使用内网域名代替
节点 ip地址 myid master 192.168.3.245 1 slave1 192.168.3.243 2 slav2 192.168.3.242 3 -
server.id=host:port:port
,server.id
指示不同的Zookeeper
服务器的自身标识,第一个port用于集群成员的信息交换,第二port是在当leader挂掉时用来进行选举leader的 -
master节点配置文件(
zoo.cfg
)内容tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.4.6/data clientPort=2181 server.1=192.168.3.245:2888:3888 server.2=192.168.3.243:2888:3888 server.3=192.168.3.242:2888:3888
-
slave1节点配置文件(
zoo.cfg
)内容tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.4.6/data clientPort=2181 server.1=192.168.3.245:2888:3888 server.2=192.168.3.243:2888:3888 server.3=192.168.3.242:2888:3888
-
slave2节点配置文件(
zoo.cfg
)内容tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.4.6/data clientPort=2181 server.1=192.168.3.245:2888:3888 server.2=192.168.3.243:2888:3888 server.3=192.168.3.242:2888:3888
-
启动,每个节点都执行启动脚本
$ cd /usr/local/zookeeper-3.4.6/bin $ ./zkServer.sh start 如果指定配置文件 $ ./zkServer.sh start ../conf/zoo.cfg 启动后查看状态,会显示Mode:leader或者follower $ ./zkServer.sh status ../conf/zoo.cfg
-
启动过程日志会出现如下错误日志,这个不需要管它,等所有节点都启动完成就不会有错误输出了
2015-11-22 23:36:14,814 [myid:1] - WARN [WorkerSender[myid=0]:QuorumCnxManager@588] - Cannot open channel to 2 at election address /192.168.3.245:3888 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:562) at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:538) at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452) at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433) at java.lang.Thread.run(Thread.java:745)
开发环境docker部署
-
开发环境基于docker部署
$ docker pull wurstmeister/zookeeper:3.4.6 $ docker run -itd -p 2181:2181 -name zookeeper wurstmeister/zookeeper
客户端命令
-
连接服务器,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。
./zkCli.sh –server 127.0.0.1:2181
-
创建文件
create [-s] [-e] $path $value
,-s
和-e
指定节点特性,顺序或者临时节点。创建一个新的znode
节点/user
关联的字符串值为jannal
[zk: 127.0.0.1:2181(CONNECTED) 1] create /user "jannal" Created /user
-
获取节点
get $path
[zk: 127.0.0.1:2181(CONNECTED) 2] get /user 'jannal' ... 省略剩余输出
-
修改节点
set $path $value
[zk: 127.0.0.1:2181(CONNECTED) 3] set /user 'jannal2'
-
删除节点
delete $path
-
显示节点下的包含的内容
[zk: 127.0.0.1:2181(CONNECTED) 26] ls /user [username, password]
-
帮助命令
[zk: 127.0.0.1:2181(CONNECTED) 27] help ZooKeeper -server host:port cmd args connect host:port get path [watch] ls path [watch] set path data [version] rmr path delquota [-n|-b] path quit printwatches on|off create [-s] [-e] path data acl stat path [watch] close ls2 path [watch] history listquota path setAcl path acl getAcl path sync path redo cmdno addauth scheme auth delete path [version] setquota -n|-b val path
-
退出客户端:
quit
-
四字查询命令:
ZooKeeper
支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取ZooKeeper
服务的当前状态及相关信息。用户在客户端可以通过telnet
或nc
向ZooKeeper
提交相应的命令。提前安装nc
1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader 2. 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。 3. echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。 4. echo kill | nc 127.0.0.1 2181 ,关掉server 5. echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。 6. echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。 7. echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。 8. echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。 9. echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。 10. echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。 11. echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。
-
使用telnet
mac:~ jannal$ telnet 127.0.0.1 2181 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ## 使用stat进行服务器启动验证 stat Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT Clients: /172.17.0.1:56602[1](queued=0,recved=38,sent=38) /172.17.0.1:56608[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/0/21 Received: 3390 Sent: 3389 Connections: 2 Outstanding: 0 Zxid: 0x51 Mode: standalone Node count: 7 Connection closed by foreign host.