【原汁原味】ZooKeeper QuickStart(二)

内容翻译自官方文档

Because Coordinating Distributed Systems is a Zoo

入门指南

本文介绍了如何快速入门 ZooKeeper,主要面向开发人员,提供单个 ZooKeeper 服务器的简单安装说明,一些验证运行的命令,以及一个简单的编程实例。最后,介绍了一些相对复杂的知识点,例如多副本部署,优化事务日志等。有关商业部署的内容,请参阅 ZooKeeper 管理员指南

系统要求

平台支持

  • GNU/Linux 开发/生产,服务端/客户端都支持
  • Sun Solaris 开发/生产,服务端/客户端都支持
  • FreeBSD 仅支持客户端的开发/生产,因为 FreeBSD JVM 中的 Java NIO 选择器不支持。
  • Win32 仅支持作为开发平台的服务端/客户端
  • MacOSX 仅支持作为开发平台的服务端/客户端

软件要求

ZooKeeper 是运行在 Java 上的,版本要求 1.6+。推荐的 ZooKeeper 最小集群需要包含 3 台服务器,并且建议运行在不同的机器上。在 Yahoo,ZooKeeper 通常部署在专用的 RHEL 盒子上,配备双核处理器,2GB 内存和 80GB IDE 硬盘。

下载

Apache 镜像下载,请选择最新稳定版。

单副本部署

以单点模式部署 ZooKeeper 服务器是最直接的,服务端被包含在单个 JAR 文件中,所以安装过程中,需要创建一个配置文件。

ZooKeeper 稳定版 下载完成后,需要进行解压缩,然后 cd 到根目录。

我们需要一个配置文件才能启动 ZooKeeper,简单示例如下(conf/zoo.cfg)

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

(Tips:生产环境启动时可能会遇到没有权限访问 /var/zookeeper,此时可替换为 /tmp/zookeeper 或者 /home/admin/zookeeper 等其他目录)

文件名可以是任意的,在本文中我们指定为 conf/zoo.cfg,目录前缀可以通过 dataDir 来指定。

  • tickTime,是 ZooKeeper 中的基本时间单元(单位是微秒),常被用于心跳检测,并且最短会话超时时间就是两倍的 tickTime。
  • dataDir,存储内存数据库镜像的位置,也是数据库更新的事务日志的默认存储位置。
  • clientPort,监听客户端连接的端口号。

当你完成配置文件的创建后,就可以启动 ZooKeeper 啦!

bin/zkServer.sh start

ZooKeeper 采用 Log4j 记录日志消息,详情见开发者指南中的日志章节。你可以在控制台(默认)查看日志消息,也可以通过 Log4j 的配置文件将其输出到指定日志文件中。

上面讲述的是在单副本模式下 ZooKeeper 的部署与运行。由于没有备份,一旦 ZooKeeper 进程失败,就会导致服务关闭。在大多数简单的开发环境中,单副本模式已经足够使用,如果想了解多副本部署模式,请参阅 ZooKeeper 多部署运行

存储管理

对于长期运行的生产环境系统,一定会涉及到 ZooKeeper 的外部存储管理,详情见维护章节

连接 ZooKeeper

当 ZooKeeper 正常运行时,你可以通过如下方式进行连接:

  • Java
bin/zkCli.sh -server 127.0.0.1:2181
  • C:进入 ZooKeeper 源码的 src/c 子目录,运行 make cli_mt 或 make cli_st 命令,完成编译 cli_mt(多线程)或 cli_st(单线程),详细信息可以参考 src/c 目录下的 README。
LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181

or

LD_LIBRARY_PATH=. cli_st 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 命令验证数据是否与 znode 相关联

[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

最后,让我们来删除这个节点

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

OK,我们已经完成了简单的增删改查,是不是很简单?更多信息可以参阅编程指南

编程说明

ZooKeeper 提供了 Java 和 C 的 SDK,两者的功能是相同的。C 版本有两种变型:单线程和多线程,两者的区别仅在于消息传递循环如何完成。更多信息可以参阅编程示例

运行多副本 ZooKeeper

单副本模式适用于评估、开发与测试,但是,在生产环境中,我们应该以多副本模式运行 ZooKeeper。同一个应用的服务器副本组称之为 quorum,在多副本模式下, quorum 中的所有服务器都具有相同的配置文件。该文件与单点模式中的配置稍有不同,如下所示。

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

参数 initLimit 用于指定初始化连接时,追随者和领导者之间的最长心跳时间;参数 syncLimit 指定领导者和 追随者之间消息同步的最大时间长度。

这两个参数的值的单位都是 tickTime,比如 initLimit=5 表示 5 个 tickTime 间隔,也就是10秒。

表单 server.x 的条目列出了构成 ZooKeeper 服务的服务器。当服务器启动时,它通过查找数据目录中的文件 myid 来确定自己是哪个服务器。该文件以 ASCII 编码格式记录了服务器的编号信息。

最后,请注意每个服务器名称后面的两个端口号:“2888”和“3888”。每个服务器通过前一个端口连接其他服务器。这样的连接是有必要的,使得服务器间可以进行通信,例如,协商更新的顺序。更具体地说,ZooKeeper 服务器通过该端口实现 追随者到领导者的连接。当一个新的领导者出现时,追随者使用该端口创建一个与领导者的 TCP 连接。由于默认的 领导者选举也使用了 TCP ,所以我们需要另一个端口来选举领导者,也就是服务器条目中的第二个端口。

其他优化

此外,通过调节下述参数,可以提供 ZooKeeper 运行的性能。

  • 要想降低更新操作的时延,可以指定一个专用的事务日志目录。默认情况下,事务日志将放在与数据快照和 myid 文件相同的目录中。可以通过 dataLogDir 参数来指定事务日志目录。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容