ZooKeeper入门指导
入门:在分布式协同系统中使用ZooKeeper
这篇文档包含的内容可以让你快速开始使用ZooKeeper。它主要针对希望尝试它的开发者,文档包含着在单台ZooKeeper服务器上的安装指导,也有一些验证ZooKeeper在运行的简单的命令,还有一些简单的编码案例。最后,为了方便,还有一部分内容是关于更复杂的安装,例如,运行复制部署,并优化事务日志。不过,关于完整的商业环境部署,请参考ZooKeeper管理员指导。
先决条件
请查看管理员指导中的系统要求。
下载
为了得到一个分布式ZooKeeper,请从Apache下载镜像之一下载最新稳定版。
独立操作
以独立模式设置一个ZooKeeper服务器是非常简单的。服务器包含在一个单独的jar文件里,所以需要创建一个配置文件来开始安装。
当你下载完成一个稳定版ZooKeeper后,解压并进入到它的根目录。
运行ZooKeeper需要一个配置文件,这里有一个案例,文件要包含在conf目录下,命名为zoo.cfg。
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
这个文件可以被称为为任何名字,但是为了不必要的讨论我们叫它conf/zoo.cfg。改变dataDir字段的值来指定一个存在的(空的)文件夹。这里是每一个字段的含义。
- tickTime:ZooKeeper使用的以毫秒为单位的基础时间单元,它用于心跳,最小会话超时将是两个这样的时间单元;
- dataDir:存储内存数据库快照的位置,除非另有说明,否则事务日志将被存储到数据库;
- clientPort:监听客户端连接的端口。
当你创建了这个配置文件之后,你可以运行ZooKeeper了。
bin/zkServer.sh start
ZooKeeper使用log4j处理日志消息,更多详细可用的信息请查看开发者指南中的Logging部分。你可以看到日志消息打印到控制台上(默认)或者打印到log4j配置的指定文件中。
这里概述的步骤是以独立模式运行的ZooKeeper,没有复制,因此如果ZooKeeper进程失效了,服务也就关闭了。这比较适合较多的开发情况,但是,运行ZooKeeper仲裁模式,请参考运行仲裁ZooKeeper。
管理ZooKeeper存储
对于长期运行的生产环境,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]
在这个窗口中,输入 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发出list命令,如下:
[zkshell: 8] ls /
[zookeeper]
然后,可以通过运行 create /zk_test my_data 来创建一个新节点,这将创建一个关联字符串 ‘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,zk_test关联的数据确实改变了。
最后,我们发出 delete 来删除这个节点:
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
就这些,想要了解更多,可以继续看下面的文档或者查看开发者指导。
ZooKeeper编程
ZooKeeper拥有Java绑定和C绑定。它们在功能上是等价的。C绑定有两种类型:单线程和多线程,这些仅在消息循环是如何被完成的方面有区别。想要了解更多信息,可以查看ZooKeeper开发者指南中的编程案例获取使用不同API案例代码。
运行仲裁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用来限制ZooKeeper中的仲裁者必须连接到主服务器的时长。条目syncLimit用于限制从服务器和主服务器的超时时长。
在这两个超时条目中,你可以使用tickTime来指定时间单元。在这个案例中,条目initLimit的超时时长是5个每个时长是2000毫秒的时间单元,或者说是10秒。
条目server.X列表是组成ZooKeeper服务的服务器。当服务器启动后,服务器通过在数据目录下寻找myid文件来知道它是哪台服务器,这个文件包含服务器号(以ASCII编码)(换句话说就是需要在ZooKeeperdata目录下新建一个myid文件来保存服务器的id,server.1就保存1,server.2就保存2,依次类推)。
最后,需要注意每个服务器名称后的两个端口号:“2888”和“3888”。每个服务器都使用前一个端口来和其他服务器进行连接。这样的连接对于它们之间的通信是必要的,例如,就更新顺序达成一致。更具体而言,一个ZooKeeper使用这个端口来连接从服务器和主服务器。当一个新的主服务器产生后,从服务器使用此端口和主服务器建立一个TCP连接。因为默认的主服务器选举也是使用的TCP连接,我们现在需要另一个端口来进行主服务器选举,这个端口就是第二个端口。
注:
如果你想在一台服务器上测试多服务器模式,指定服务器名称为localhost,并且在每个服务器X的配置文件中指定唯一的仲裁和主服务器选举端口(在上面的配置案例中就可改为这样配置:2888:3888, 2889:3889, 2890:3890),并且它们的数据目录和客户端端口号也应该是不同的(在上面的复制案例中,运行在一台localhost机器上,你依然需要使用三个配置文件)。
请注意,在一台机器上上运行多个服务器是不会有任何冗余的。如果某些原因导致机器死亡了,所有的zookeeper服务都将离线。完全冗余要求每台服务器都有自己的机器,而且必须是完全隔离的物理主机。同一物理主机上的多个虚拟机仍然受到主机失效后完全失效的影响。
其他优化
还有两个配置参数可以极大的影响性能:
- 为了使得更新延迟尽可能低,拥有一个专用的事务日志目录是很重要的。默认事务日志文件是和数据快照及myid文件在同一目录下的,dataLogDir的参数表示事务日志文件的另一个目录。
- [tbd:其他的配置参数是什么?]
来源:https://blog.csdn.net/LONG_Yi_1994/article/details/100848850