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也是非常重要的(在上面的主从复制示例中,在单个主机上运行,你仍然需要三个配置文件)。