ZooKeeper 入门指南

ZooKeeper 入门指南


开始:通过zookeeper协调分布式程序

这份文档包含了让你快速开始使用zookeeper的帮助信息。文章主要是针对初级想尝试使用zookeeper的开发者,其中包含了一些简单的例子,仅用一台zookeeper服务器,一些命令确认服务器正在运行,一个简单的程序样例。文章最后,为了方便,也有一些内容考虑到一些相对复杂些的例子。列如,以复制模式部署,优化事务日志。但是如果想运用到商业项目中。请参阅ZooKeeper管理员指南

先决条件

参考管理手册中的系统需求

下载

从Apache的镜像站点下载Zookeeper的稳定发行版。

单机操作

以单机模式启动zookeeper服务器是简单的。zookeeper服务包含在单个jar文件中,所以安装过程包含了建立配置。

一旦你已经下载Zookeeper的稳定版本,即可解压并进入其根目录。

要启动zookeeper你首先需要一份配置文件。这里是例子,可以创建它在conf/zoo.cfg

tickTime=2000 
dataDir=/var/lib/zookeeper
clientPort=2181

你可以随意命名这个文件,但是为了描述的清楚我们就叫它 conf/zoo.cfg. 设定dataDir的值到存在(初始为空)的目录。下面是对每一个字段意义的介绍:

tickTime
zookeeper用到的时间单位是毫秒。这个时间好比是zookeeper的心跳时间,是最小会话单元的超时时间范围是这个时间的2倍。

dataDir
这个目录是存储内存中数据库快照的位置,除非你特别说明,更新该数据库事物的日志也在这个位置。

clientPort
客户端连接监听端口。

现在你创建了这个配置文件,就可以启动Zookeeper:

bin/zkServer.sh start

ZooKeeper 的日志记录是通过log4j — 更多关于日志的讲解请看开发者手册。你会看到日志信息根据log4j配置被发送到控制台并且/或者日志文件。

这里介绍的启动zookeeper是以单例模式。这里没有做复制,因此假如zookeeper进程运行失败,服务就会挂掉。单例模式启动对于开发环境来说是良好的,如果想启动Zookeeper在复制模式,请看Running Replicated ZooKeeper.

管理ZooKeeper存储

对于长时间运行在生产环境的zookeeper服务,存储必须被额外的管理(dataDir and logs),关于这些的更多细节请看maintenance

连接到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]

如果zookeeper已经运行,你就可以通过下面几种选择进行连接

从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。这个会创建一个新的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

我们也可以改变和zk_test关联的数据通过set命令,如下:

[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

(注意我们在设置zk_test的数据后又运行了get 命令,数据的确改变了)。
最后通过delete 删除zk_test这个节点:

[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]

获取更多其它内容,请看Programmer’s Guide.

对ZooKeeper编程

ZooKeeper具有Java和C的绑定。它们最终是等效的。C的绑定具有两个变体:单线程和多线程。它们仅仅区别在于消息循环如何被实现。更多信息请查阅 Zookeeper编程手册中的编程示例 获得使用不同API的示例代码.

复制模式运行zookeeper

运行zookeeper以单例模式对于评估测试开发是很方便。但是在生产环境你应该以复制模式运行。相同的应用程序中的复制的服务器组被叫做quorum,在复制模式中所有的服务器在quorum中具有相同的配置文件。

注意: 在复制模式,最少需要三台服务器,并且强烈推荐使用奇数个数的服务器。如果您只具备两台服务器,就会陷入当一台服务器失败时,没有足够的机器来产生能够获得多数投票的法定数量。两服务器继承了单服务器固有的弱稳定性,因为会导致两个单点的失败。

每个zookeeper服务器都有一份同样的配置文件。这个文件和上面介绍单例模式使用的配置文件和类似,只是有一点小小的不同,如下:

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连接到leader的超时时间。属性syncLimit 限制一个leader过时时间。
对于这两种超时时间,你也可以指定用tickTime的时间单位计量。例如,initLimit是5 ticks,每个tick是2000毫秒,也就是10秒。
属性server.X 列出了zookeeper服务的组成。当服务器启动的时候,通过寻找在数据目录的myid文件知道是哪台服务器。这个文件含有以ASCII编码的服务器编号。
最后,注意在每个服务器名后的两个端口号: ” 2888” 和”3888”。通过这样形式的端口彼此建立连接。这样的连接是必须的因而才能进行通讯,例如,当按顺序更新数据时。尤其在zookeeper服务器使用该端口连接followers到leader时。当一个新的leader诞生时,followers会通过这个端口号打开TCP协议连接到leader。因为默认leader选举也用tcp协议,我们必须要求另外一个端口用于选举leader。就是属性server的第二个端口号。

注意: 假如你想在一台机器上进行多个zookeeper服务测试,需要指出唯一的集群名localhost和那些leader选举端口(例如2888:3888, 2889:3889, 2890:3890 在下面的例子)。隔离各个dataDir目录和不同的端口号也是必须的。(在这个复制模式运行的例子里,每个运行在单一的机器都有一个配置文件)
请注意,在单个计算机上设置多个服务器不会创建任何冗余。 如果发生了导致机器宕机的事情,所有zookeeper服务器都将脱机。 完全冗余要求每个服务器都有自己的机器。 它必须是一个完全独立的物理服务器。 同一物理主机上的多个虚拟机仍然容易受到该主机的完全故障的影响。

其它优化

其它的配置参数可以提高性能:
- 为了减少延迟和快速更新,具有专一的事务日志目录是很重要的。默认事务日志文件是和数据快照和myid文件放在一起。参数dataLogDir可以指定别的地方来存放事务日志。


猜你喜欢

转载自blog.csdn.net/killingbow/article/details/53113966
今日推荐