相关的知识可以参看zookeeper的官网地址:http://zookeeper.apache.org/
一、单机部署(Standalone Operation)
下载zookeeper的稳定版本,或者自己想要的版本,在zookeeper的官网页面可以找到下载地址。
这个教程下载的是zookeeper-3.4.5.tar.gz版本的文件。
然后把文件移动到合适的位置,使用下面的命令进行解压:
$ tar -zxvf zookeeper-3.4.5.tar.gz
如果遇到权限问题,就在命令最前面加上sudo就好了。
在独立模式下可以进行一些配置,并启动zookeeper。
首先在zookeeper的解压目录下创建一个配置文件 conf/zoo.cfg,其内容为:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
这个文件可以命名为任何名字,但是为了讨论就命名为conf/zoo.cfg了。其中dataDir可以被指定为一个已经存在的空文件夹路径。
各个配置字段的含义如下:
-
tickTime
the basic time unit in milliseconds used by ZooKeeper. It is used to do heartbeats and the minimum session timeout will be twice the tickTime.
-
dataDir
the location to store the in-memory database snapshots and, unless specified otherwise, the transaction log of updates to the database.
-
clientPort
the port to listen for client connections
创建好配置文件后,现在可以启动Zookeeper了:
bin/zkServer.sh start
Zookeeper的日志使用的是log4j。现在配置的是单机模式,后面的步骤还会配置分布式模式。
二、简单操作与测试
首先连接到Zookeeper:
$ bin/zkCli.sh -server 127.0.0.1:2181
这可以让你执行一些简单的文件操作。
一旦你连接上了,可以看到类似于下面的这些信息:
Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
上面其实就是zookeeper提供的shell的信息于欢迎界面。
在zookeeper的shell中,键入help可以查看有哪些可以在客户端执行的命令,命令列表如下:
[zkshell: 0] help
ZooKeeper host:port cmd args
get path [watch]
ls path [watch]
set path data [version]
delquota [-n|-b] path
quit
printwatches on|off
createpath data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
从这个shell中,你可以尝试一些简单的命令来感觉一下这个简单命令行界面。
首先,使用一下列表命令——“ls”,就像下面这样:
[zkshell: 8] ls /
[zookeeper]
接下来,通过运行’create /zk_test my_data’创建一个新的节点(a new znode)。这将会创建一个新的节点,并且节点联系到字符串“my_data”,将会看到:
[zkshell: 9] create /zk_test my_data
Created /zk_test
运行另外一个 ls /
命令来看一下文件夹内容:
[zkshell: 11] ls /
[zookeeper, zk_test]
注意到zk_test文件目录已经被新建立了。
接下来通过运行get命令来查验一下联系到节点(znode)的数据,如下:
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
我们可以通过运行set命令来改变联系到zk_test节点的数据,如下所示:
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
注意,在设置完数据后,使用了get命令查看,可以看到确实联系到节点的数据已经改变了。
最后,我们把这个发布的节点删除了。
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
如果想了解更多,可以参看Programmer’s Guide
三、运行重复模式的zookeeper (Running Replicated ZooKeeper)
将zookeeper运行在单机模式可以方便于评估、一些开发和测试。但是在产品中,你应该运行zookeeper的重复模式。在一些应用中,一个重复的服务器组被称为一个仲裁(a quorum)。在重复模式中,在仲裁中的所有服务器都有同一个配置文件的拷贝。
注意: 在重复模式中,最少需要三个服务器,并且强烈建议你有奇数个服务器。如果你仅仅只有两个服务器,在这种情况下,如果其中一个失败,那么将没有足够的机器来形成一个主要的仲裁。两个服务器还不如一个服务器稳定,因为存在两个单点失败(because there are two single points of failure)。
重复模式中的配置文件和单机模式中的配置文件详细,但有一些差别,下面是一个例子:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
其中,initLimit字段是一个超时时间,zookeeper用这个超时时间来限制在仲裁中的服务器必须连接上leader的时间长度。syncLimit字段限制了一个服务器可以断开leader的过期时间。
你可以使用tickTime来指定这两个超时时间的时间单元。在这个例子中,initLimit超时时间设置为5个时钟(ticks),每个时钟是2000毫秒,也就是说initLimit超时时间为10秒。
字段server.X列出了组成zookeeper服务的服务器。当服务器启动的时候,机器可以通过查找数据目录(the data directory)中的myid来确定自己是哪个服务器。这个文件包含用ASCII码编码的服务器编号。
最后要注意一下服务器名后面的两个端口号:“2888”和"3888"。节点通过形式化的端口去连接其他节点。
这个连接对于节点直接的通信是必要的,例如,节点之间决定更新信息的顺序。更具体一点,Zookeeper使用这个端口将follower连接到leader。当一个新leader出现时,follower使用这个端口来打开一个到leader的TCP连接。因为默认的leader选举也是使用TCP协议,所以我们现在需要另外一个端口来进行leader的选举。这个端口就是第二个端口。
注意:在同一个机器上,可以配置不同的端口来模拟多个zookeeper节点。也可以建立多个虚拟机,但这仍然时脆弱的。最好是使用多个实体物理机器。
四、配置zookeeper分布式模式
将上面重复模式的文件夹整体发送到各个服务器上,并且在每个机器上为zoo.cfg中dataDir字段对应的路径建立空文件夹,并且在建立的文件夹中创建一个myid文件,在其中写上一个数字。每个服务器节点上的myid文件中的数字都不能一样。
然后在每个服务器节点上的zookeeper安装目录下执行下面的命令来启动zookeeper服务。
bin/zkServer.sh start
查看每个节点是follower还是leader可以使用下面的命令:
bin/zkServer.sh status
总结
不一定一下就成功了,中间配置的时候尽量慢一点、仔细一点。如果出现什么问题,一定要查看日志。zookeeper的日志会输出在执行zkServer.sh start
命令的工作目录下,文件名称为zookeeper.out。也可以通过修改bin/zkEnv.sh文件中的变量来指定日志输出位置,具体参看修改Zookeeper输出日志 zookeeper.out输出路径。
五、异常情况处理
在执行zkServer.sh start
命令启动zookeeper后,再使用zkServer.sh status
查看状态时,可能会出现下面的异常信息:
hduser@vm-01:/opt/zookeeper/zookeeper-3.4.5$ bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.5/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
出现这异常的原因是在查看状态的时候,其他zookeeper节点还没有启动起来,所以也就还没办法选举出leader,其他zookeeper节点启动后,稍等一会儿再使用zkServer.sh status
查看状态,那么就可以看到正常的状态报告了,如下所示:
hduser@vm-01:/opt/zookeeper/zookeeper-3.4.5$ bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower