入门:使用ZooKeeper的协调分布式应用html
这个文档使你对ZooKeeper快速入门,它主要针对想尝试它的开发者。而且包含简单的单机的ZooKeeper服务的安装说明,一些验证是否运行的命令,和一个简单的编程例子。最后,为了方便起见,有几部分关于更复杂的安装,例如运行复制的部署,优化事务日志,然而为了商业部署的完整手册,请参考ZooKeeper Administrator's Guide。node
参考管理手册中的 System Requirements。shell
下载数据库
想要得到ZooKeeper的分发。从Apache的下载镜像中下载一个最近的稳定版本。apache
单机操做编程
以单机的模型安装ZooKeeper服务是至关直接的。服务器包含一个单独的JAR包,因此安装过程包含建立一个配置文件。一旦你下载了一个ZooKeeper的稳定发行版本。解压它而后进入到它的根目录。服务器
为了启动ZooKeeper你须要一个配置文件,这里有一个例子,在conf/zoo.cfg中建立它。多线程
1app 2分布式 3 |
|
这个文件能够被叫做任何名字。可是为了这个讨论叫它conf/zoo.cfg。改变dataDir的值使它指向一个存在(一开始为空)的目录,下面是每个字段的含义。
tickTimeZooKeeper使用的最基本的毫秒时间单位,它被用来作心跳而且会话失效的最小时间是两倍的tickTime。
dataDir存储内存数据库快照的地址,而且除非另外指定,也是数据库的更新的事务日志的地址。
clientPort监听客户端链接的端口
如今你已经建立了一个配置文件,你能够用下面的命令启动ZooKeeper。
1 |
|
ZooKeeper使用log4j来记录日志消息,更详细的内容能够在开发者的指导手册中的Logging部分得到。你能够看到日志打印到控制台(默认的)和/或根据log4j的配置的日志文件中。
这里列出的是以单机模式运行ZooKeeper的大纲。这里没有复制,因此若是ZooKeeper进程失败,服务将会中止。这对大部分的开发状况是ok的。可是想要以复制模式运行ZooKeeper,请参考Running Replicated ZooKeeper。
管理ZooKeeper存储
对于一个长时间运行的生产环境系统,ZooKeeper存储必须在外部被管理(dataDir and logs)。参考maintenance部分来获取更多信息。
连接ZooKeeper
一旦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]
从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 create path data acl stat path [watch] listquota path history setAcl path acl getAcl path sync path redo cmdno addauth scheme auth delete path [version] deleteall path setquota -n|-b val path
从这开始,你能够试一些简单的命令来获取这些简单命令行接口的感受。首先,从提交一个列表命令开始,例如ls,生成以下结果:
[zkshell: 8] ls / [zookeeper]
下一步,建立一个节点经过运行create /zk_test my_data。这建立一个新的znode而且给这个节点关联一个string "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命令,例如:
[zkshell: 14] set /zk_test chenkangyao 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 chenkangyao 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操做在set操做以后,而且它确实改变了。
最后,让咱们删除这个节点经过:
[zkshell: 16] delete /zk_test [zkshell: 17] ls / [zookeeper] [zkshell: 18]
先就这些吧,要想获取更多。继续这个文档的剩余部分和Programmer's Guide部分。
ZooKeeper编程
ZooKeeper有一个Java绑定和C绑定。他们在功能上是等价的。C绑定以两种不一样的形式存在:单线程和多线程。他们只在消息循环是如何完成时不一样。更多信息请参考Programming Examples in the ZooKeeper Programmer's Guide。
运行可复制的ZooKeeper
以单机模式运行ZooKeeper对评估,一些开发,和测试来讲是很方便的,可是在生产环境,你应该以复制模式运行ZooKeeper。在同一个应用程序中运行的服务的复制组被称为法定人数,在复制模式,法定人数中的全部的服务器有相同的配置文件。
注意:
对于复制模式,最少须要三台服务器,而且强烈建议你用奇数个服务器。若是你只有两个服务器,那么若是其中的一个失败的话,就没有足够的机器来组成大多数的法定人数。两个服务器本质上比一个服务器更不稳定,由于有两个单点故障。
对于复制模式的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服务器链接领导者的超时时间。syncLimit限制了一个服务器从一个领导者的过时时间。有了这两个超时时间,你用tickTime来指定时间单位。在这个例子中,initLimit的超时时间是5个ticks,每一个ticks是2000毫秒,或者10秒。
server.X这样形式的条目列出了组成ZooKeeper服务的服务器。当服务启动的时候,经过搜寻数据目录下的myid文件它知道是那一台服务器。这个文件以ASCII格式包含服务器数字。
最后,注意每个服务器名字后面的两个端口号:“2888”和“3888”。服务中的节点前一个端口去连接其它的节点。这个的链接是必需的,因此节点之间能够相互通讯,例如,赞成更新的顺序。更具体地说,ZooKeeper用这个端口来链接追随者和领导者。当一个领导者被选举出来,一个追随者打开一个TCP链接用这个端口。由于默认的领导者选举也用TCP,咱们如今须要另外一个端口用来领导者选举,这就是server条目中的第二个端口。
注意:
若是你想在同一台机器上测试多个服务器,用localhost指定服务名和惟一的法定人数和领导者选举端口(也就是说.2888:3888,2889:3889,2890:3890)用于每个server.X在服务器的配置文件中。固然独立的DataDires和不一样clientPorts 也是必需的(在上面的复制例子,运行在单独的一个机器,你也须要三个配置文件)。
请注意在一个机器上安装多个ZooKeeper服务节点将不会建立任何冗余。若是有什么致使这个机器挂掉的事件发生,全部的ZooKeeper节点将会掉线。为了冗余须要每个节点拥有它本身的机器。它必需是完成独立的物理机器。同一个物理主机的多个
虚拟机器对这个主机的失败也是脆弱的。
其它的优化
有其它几个配置参数可能大大地提升性能: