Zookeeper开始向导
目录树
·开始:用Zookeeper协调分布式应用
· 前期准备
· 下载
· 单机操作
· 管理Zookeeper存储
· 连接Zookeeper
· Zookeeper编程
· 运行复制Zookeeper
· 其它优化
-------------------------------------------------------------
开始:用Zookeeper协调分布式服务
这个文档包含了让你快速入门Zookeeper的文档,它主要针对的是希望尝试它的开发人员,并且包含了单个ZooKeeper服务器的简单安装说明,一些命令来验证它正在运行,以及一个简单的编程示例。最后,为了提供方便,有一些关于更复杂的安装的部分,例如运行复制的部署,以及优化事务日志。但是,对于商业部署的完整说明,请参考ZooKeeper管理员指南。
前期准备
请在管理员指南中查看前期准备部分
下载
要下载一个Zookeeper的发布,请从tomcat下载镜像中获取一个稳定的发布版本
单机操作
在单机模式下设置一个ZooKeeper服务器是很简单的。服务器包含在单个JAR文件中,因此安装包括创建一个配置。
下载Zookeeper稳定版本之后,将它解压并进入解压目录
启动Zookeeper需要一个配置文件,下面是一个示例,在conf/zoo.cfg文件中配置:
tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181
这个配置文件文件名可以任意起,但是为了讨论,这里配置为conf/zoo.cfg。指定其中的dataDir配置到一个已有的空目录。下面是每一个配置的含义:
tickTime
Zookeeper使用这个已毫秒为单位的时间。它被用来做心跳检测,最小的会话超时将是tickTime的两倍。
dataDir
存储内存中的数据库快照的位置,除非另有说明,还会存储数据库更新的事物日志。
clientPort
监听客户端连接的端口
现在你创建了配置文件,用下面的命令启动Zookeeper
bin/zkServer.sh start
Zookeeper使用log4j记录日志消息,你可以查看程序员指南的日志章节了解更多信息。你会看到默认的log4j配置是将日志消息打印到console中 并且/或者到一个日志文件中
这个步骤只是列出Zookeeper运行在单机模式,没有复制。如果Zookeeper运行失败,服务将会挂掉。在大多数开发的情况下这样是好的,但是如果想要运行复制模式,请参考运行复制模式的Zookeeper。
管理Zookeeper存储
对于长时间运行的生产系统,Zookeeper的存储必须在外部进行管理(dataDir和日志)。有关维护的部分,请参阅关于维护的部分。
连接到Zookeeper
$ bin/zkCli.sh -server 127.0.0.1:2181
这让您可以执行简单的、文件式的操作。
连接上Zookeeper以后,你会看到类似下面的输出:
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]
在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
现在,你可以在这个命令行接口中尝试几种简单的命令。首先,从发出列表命令开始,就像ls命令一样:
[zkshell: 8] ls / [zookeeper]
接下来,使用create /zk_test my_data命令创建一个新的znode。这会创建一个节点,并且包含“my_data”的数据。你会看到:
[zkshell: 9] create /zk_test my_data Created /zk_test
输入另外一个ls /命令会看到目录看起来是这样的:
[zkshell: 11] ls / [zookeeper, zk_test]
注意到zk_test目录已经被创建了。
接下来,用get命令验证这个节点关联的数据,输入:
[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命令,看到结果的确改变了。)
最后,用delete命令删除这个节点:
[zkshell: 16] delete /zk_test [zkshell: 17] ls / [zookeeper] [zkshell: 18]
介绍到这里,要进一步探索,请继续阅读本文的其余部分,并查看程序员指南。
用Zookeeper编码
Zookeeper有java和c的绑定,他们的功能是一样的。c的绑定存在两个变量:单线程和多线程。这只在消息循环的实现上有所不同。如果需要更多信息,请在Zookeeper程序员指南中的编码实例中的查看使用不同api的简单代码示例。
运行复制版本的Zookeeper
在单机模式下运行Zookeeper,便于评估、开发和测试,但是在生产环境。你需要运行Zookeeper的复制模式。同一个应用程序中的一个复制的服务器组称为quorum,在复制模式下,quorum中的所有服务器都具有相同配置文件的副本。
使用复制模式,至少需要三台服务器,并且强烈建议你有奇数台服务器。如果你只有两台服务器,那么您就处于这样一种情况:如果其中一个服务器出现故障,那么就没有足够的机器来形成多数的quorum。两个服务器天生就不像一个服务器那么稳定,因为有两个单点故障。
复制模式下的conf/zoo.cfg配置文件和单机模式下很相似,但是会有一些不同,下面是一个示例:
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用来限制Zookeeper服务器在quorum中必须连接到leaders的时间长度。条目syncLimit限制了一台服务器可以脱离leaders的最长时间。
有了这两个超时,您就可以使用tickTime指定时间单位。在本例中,initLimit的超时时间为5个节拍,即2000秒,即10秒。
配置server.X 表示组成Zookeeper服务的服务器。当这些服务器启动时,通过data目录中文件myid可以知道这是哪台服务器,这个文件包含了这个服务器的ASCII编号。
最后,注意每个服务器后面跟了两个端口号:“2888”和“3888”。服务器之间使用相同的端口进行连接,他们需要这样的一个连接进行通讯,例如:同意一个更新命令。更具体的说,Zookeeper 服务使用这个端口将followers连接到leader。当一个新的leader出现,follower通过这个端口打开一个tcp连接去连接到leader,因为默认的leader选举也需要使用tcp连接,我们现在需要另外一个端口去用来leader选举。这就是服务器中的第二个端口。
如果你需要在单机上测试多个服务,在每个服务的server.X配置中,将服务名设置为localhost,并且leader选举端口(i.e. 2888:3888,2889:3889,2890:3890 在上面的示例中)。在那个服务的配置文件中,当然,单独的dataDirs和截然不同的client端口也是必需的(在上面的复制示例中,在单个localhost上运行,您仍然有三个配置文件)。
注意,在单机上设置多服务不会产生任何的冗余,如果发生了导致机器宕机的情况,所有的Zookeeper服务将会下线。完全冗余需要每一个服务有独自的机器,必须是完全的物理分隔服务器,同一个物理主机运行多个虚拟机任然会收到该主机完全故障的影响。
其它优化
还有一些其他的配置参数可以极大地提高性能:
· 为了获得低延迟的更新,有一个专用的事务日志目录是很重要的。默认情况下,事务日志被放在与数据快照和myid文件相同的目录中。dataLogDir参数表明用于事务日志的不同目录。
· [tbd: what is the other config param?]