菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

ZooKeeper Getting Started Guide

ZooKeeper快速开始手册

Getting Started: Coordinating Distributed Applications with ZooKeeper

这个文档包含你快速开始Zookeeper所需要的信息. 这个文档是开发者应该首先阅读的文档, 包含安装简单单结点Zookeeper服务器的方法, 运行几个简单的命令确定Zookeeper服务器已经运行,还有对Zookeeper进行简单编程. 最后, 为了方便, 还有几个干预安装复杂的Zookeeper服务器, 比如Zookeeper运行在集群模式, 日志文件优化. 如果你想知道详细的安装, 看 ZooKeeper Administrator's Guide.

预备知识

See 在管理手册里面查看系统需求章节 .

下载

下载最近发布,稳定版的Zookeeper.

单节点模式

安装单节点Zookeeper服务器是非常简单的. 服务器仅包含一个jar文件, 安装文件里还包含一个已经创建好的配置文件.

在你下载好稳定版的Zookeeper安装包后,解压,进入它的根目录

为了运行Zookeeper你需要修改配置文件. 下面是一个样例, 文件在conf目录内,conf/zoo.cfg:

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

这个文件名可以是任意的, 但为了我们能够快速开始,我们设定文件名叫做 conf/zoo.cfg. 改变 dataDir 的值,指向一个已经存在目录. 下面是各个字段的含义:

tickTime

Zookeeper使用的最小时间单位(单位是毫秒). 在心跳测试时使用,最小会话超时是tickTime的俩倍.

dataDir

存放内存数据库快照的地方,除非另外设置了更新数据库的事务日志.

clientPort

客户端连接的端口号

现在你创建了配置文件,可以开始启动服务器了:

bin/zkServer.sh start

Zookeeper使用log4J日志系统 -- 详细信息在编程文档 Logging 章节. 你将看到日志打印到终端或者文件,这个取决于你的日志配置.

以上就介绍了运行单节点Zookeeper的方法. 这个不是集群模式, 所以如果Zookeeper进程发生错误, 服务就宕机了. 想要更好服务,查看在集群下运行Zookeeper文档Running Replicated ZooKeeper.

管理Zookeeper存储

对于长时间运行的生产系统管理员必须管理外部存储 (dataDir and logs). 查看这里 maintenance for more details.

连接到Zookeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

执行上面的命令就可以连上了(注意端口和IP).

如果你已经连上了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
        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命令, 输入 ls /:

[zkshell: 8] ls /
[zookeeper]
        

运行 create /zk_test my_data创建一个znode(Zookeeper的数据结构). 这条命令会创建一个新的znode和"my_data"数据关联到一起. 你可以看到如下信息:

[zkshell: 9] create /zk_test my_data
Created /zk_test
      

再次输入 ls / 你将会得到如下信息:

[zkshell: 11] ls /
[zookeeper, zk_test]

        

注意,此时zk_test目录已经创建好了.

下一步,验证数据已经和这个znode关联在一起,运行 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
      

(注意,我们在set命令后执行get 来验证相关联的数据已经改变了.

最后, 让我们删除这个结点通过 delete 命令:

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

其他更多操作请查看Programmer's Guide.

ZooKeeper编程

ZooKeeper has a Java bindings and C bindings. 它们的实现基础是一样的. The C bindings 存在俩种模式: 单线程模式 和多线程模式. 差别在于消息循环是怎么完成的. 更多信息请查看 Programming Examples in the ZooKeeper Programmer's Guide

集群模式下运行Zookeeper

在单节点模式下运行Zookeeper是非常简单的,在开发环境,测试环境,但是在生产环境,你应该在集群模式下运行Zookeeper, 在同一应用程序中复制的服务器组称为法定人数 quorum, 法定人数中的所有服务器都有一样的配置文件.

Note

构建集群模式最少需要三个服务器, 强烈建议你有奇数个服务器. 如果你只有俩个服务器, 如果你只有俩个服务器,如果其中有一个宕机了, 那就没有足够的服务器来组成多数的法定人数(多数派). 俩个服务器 没有 单个服务器稳定,因为两个中任意一个都可能出现故障.

集群模式下的 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 :zk在时间限制内连接到leader的数目达到法定人数, 管理员手册翻译:允许跟随者连接和同步到leader,如果集群太大,有必要增大这个值, syncLimit:一个服务器被踢出集群的超时时间, 管理员手册内的解释:允许跟随着同步到leader的时间限制,如果追随者落后leader太远(如果在时间限制内没有做到,个人理解),追随者会被踢出集群

官方手册也没说详细,等着去源码里找答案.

这些超时限制的时间单位是tickTime, 根据你指定的tickTime数值. 在这个例子中,超时时间是5*2000毫秒,也就是10秒钟.

server.X 列出了参与Zookeeper服务的服务器列表. 当服务器启动时, it knows which server it is by looking for the file myid in the data directory. That file has the contains the server number, in ASCII.

最后, 请注意每个服务器地址后面的俩个端口号: " 2888" 和 "3888". 第一个用于和其他服务器连接然后通讯., 比如, 商议更新的顺序. 更详细一点, Zookeeper跟随着服务器使用这个端口连接到leader. 当新的leader被选出, 一个跟随着使用这个端口打开一个TCP通道到新的leader. 因为默认的leader选举也是使用TCP, 我们当前需要一个新的端口来实现新的leader选举. 这就是第二个端口的作用.

注意

如果你想在单机上测试集群模式, server.X 中,servername= localhost,每个端口号都应该不同 . 不同的 dataDir和不同 clientPort也是必须的, (在以上的集群列子中, 运行在 localhost中, 你需要三个配置文件).

请意识到在单机上部署多台Zookeeper服务器不会产生任何的冗余. 如果机器宕机, 所有的Zookeeper服务器都将离线. 如果想要冗余,应该在多台机器上部署服务器. 必须是单个硬件机器上.在一台机器上部署多个虚拟环境也会造成同样的问题.

优化其他地方

There are a couple of other configuration parameters that can greatly increase performance:

  • To get low latencies on updates it is important to have a dedicated transaction log directory. By default transaction logs are put in the same directory as the data snapshots and myid file. The dataLogDir parameters indicates a different directory to use for the transaction logs.

  • [tbd: what is the other config param?]

 

 
posted on 2017-05-12 16:00  好吧,就是菜菜  阅读(293)  评论(0)    收藏  举报