zookeeper已经介绍了它的原理设计以及实现方式,我们接下来介绍zookeeper的使用方法以及简单配置。

下载

获取Zookeeper的发布包,从Apache下载映像中下载一个最新稳定版本。

单机操作

安装Zookeeper的单机模式非常简单。服务包含在一个单独的压缩文件中,所以安装只需要创建配置文件。

下载了Zookeeper稳定的发布版本之后,解压并进入根目录。

启动Zookeeper之前需要一个配置文件。 conf/zoo.cfg是一个实例文件:

1 tickTime=2000
2 dataDir=/var/lib/zookeeper
3 clientPort=2181

这个文件本来可以叫任何名字,此时我们叫它conf/zoo.cfg。修改dataDir的值为一个已经存在的(空的开始)文件夹。下面是每个字段的含义:

  • tickTime:Zookeeper使用的以毫秒为单位的基本时间单位。它用于心跳机制和最小的session超时时间为两倍心跳时间。
  • dataDir:保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
  • clientPort:监听客户端连接的端口。

创建了配置文件之后,就可以启动Zookeeper了:

 

1 bin/zkServer.sh start

 

管理Zookeeper存储

长时间运行的生产系统上的Zookeeper存储必须要在外部管理(datadir 和 logs),查看 管理员指南的maintenance部分获取更多信息。

连接Zookeeper

1 bin/zkCli.sh -server 127.0.0.1:2181

一旦连接上了,你应对会看到这些信息:

1 Connecting to localhost:2181
2 log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
3 log4j:WARN Please initialize the log4j system properly.
4 Welcome to ZooKeeper!
5 JLine support is enabled
6 [zkshell: 0]

从shell脚本输入help,可以获取客户端可执行的命令列表,如:

1 [zkshell: 0] help
 2 ZooKeeper host:port cmd args
 3        get path [watch]
 4        ls path [watch]
 5        set path data [version]
 6        delquota [-n|-b] path
 7        quit
 8        printwatches on|off
 9        createpath data acl
10        stat path [watch]
11        listquota path
12        history
13        setAcl path acl
14        getAcl path
15        sync path
16        redo cmdno
17        addauth scheme auth
18        delete path [version]
19        setquota -n|-b val path

 第一,通过发行的列表命令开始,像ls :

1 [zkshell: 8] ls /
2 [zookeeper]

下一步,通过运行create /zk_test my_data,创建一个新的znode。这将创建一个新的znode节点和一个相关联的字符串"my_data"。你应该看到:

1 [zkshell: 9] create /zk_test my_data
2 Created /zk_test

使用ls / 命令查看目录:

1 [zkshell: 11] ls /
2 [zookeeper, zk_test]

注意 zk_test目录现在已经创建了。

接下来,使用 get 命令验证数据是否与znode关联上了:

1 [zkshell: 12] get /zk_test
 2 my_data
 3 cZxid = 5
 4 ctime = Fri Jun 05 13:57:06 PDT 2009
 5 mZxid = 5
 6 mtime = Fri Jun 05 13:57:06 PDT 2009
 7 pZxid = 5
 8 cversion = 0
 9 dataVersion = 0
10 aclVersion = 0
11 ephemeralOwner = 0
12 dataLength = 7
13 numChildren = 0

我们可以是用set命令改变与zk_test关联的数据:

1 [zkshell: 14] set /zk_test junk
 2 cZxid = 5
 3 ctime = Fri Jun 05 13:57:06 PDT 2009
 4 mZxid = 6
 5 mtime = Fri Jun 05 14:01:52 PDT 2009
 6 pZxid = 5
 7 cversion = 0
 8 dataVersion = 1
 9 aclVersion = 0
10 ephemeralOwner = 0
11 dataLength = 4
12 numChildren = 0
13 [zkshell: 15] get /zk_test
14 junk
15 cZxid = 5
16 ctime = Fri Jun 05 13:57:06 PDT 2009
17 mZxid = 6
18 mtime = Fri Jun 05 14:01:52 PDT 2009
19 pZxid = 5
20 cversion = 0
21 dataVersion = 1
22 aclVersion = 0
23 ephemeralOwner = 0
24 dataLength = 4
25 numChildren = 0

最后,让我们delete节点:

1 [zkshell: 16] delete /zk_test
2 [zkshell: 17] ls /
3 [zookeeper]
4 [zkshell: 18]

运行主从复制的Zookeeper

运行Zookeeper的独立模式方便评估、开发和测试。但是在生产中,你要运行Zookeeper的主从复制模式。相同应用中服务器主从复制组叫做 quorum , 并且在主从复制模式中,在quorum中的所有服务器有相同的配置文件副本。

注意:

对于主从模式,三台服务器是最小的要求,并强烈建议有基数个服务器。如果你只有两台服务器,其中的一个故障的时候,没有足够的机器形成多数quorum。在本质上两台服务比单台服务更不稳定,因为有两个单点。

配置文件和使用独立模式相似,但有一点点的区别,这是一个实例:

1 tickTime=2000
2 dataDir=/var/lib/zookeeper
3 clientPort=2181
4 initLimit=5
5 syncLimit=2
6 server.1=zoo1:2888:3888
7 server.2=zoo2:2888:3888
8 server.3=zoo3:2888:3888

  新的条目,initLimit 是Zookeeper用它来限定quorum中的Zookeeper服务器连接到Leader的超时时间。syncLimit限制了一个服务器从Leader多长时间超时。

使用这两种超时,你指定的时间单位使用tickTime.在这个例子中,initLimit的超时时间是5个标记号,2000毫秒一个标记,就是10秒。

条目server.x列出了构成Zookeeper服务的服务器。当服务启动时,它通过查找data目录中的myid文件知道是哪个服务。这个myid个文件包含了服务编号,用ASCII.

  最后,注意每个服务器名称后面的两个端口号:"2888"和"3888"。服务器节点使用前面的端口连接到其他节点。这样的一个连接非常重要,以便于同事之间可以通讯,例如,对更新的顺序取得统一的意见。更具体的说,一个Zookeeper的服务器用这个端口连接follower到leader。当一个新的leader产生时,follower使用这个端口打开一个TCP连接,连接到leader。因为默认的leader选举也使用TCP。我们现在需要另一个端口用来leader选举。这是在服务器条目的第二个端口。

  注意:如果你想在一台机器上测试多台服务器,在服务器配置文件为每个server.x指定servername为localhost,和独有的quorum & leader选举端口(也就是 2888:3888, 2889:3889, 2890:3890在上面的示例中)。当然分开dataDir和不同的clientPort也是非常重要的(在上面的主从复制示例中,在单个主机上运行,你仍然需要三个配置文件)。