入门:使用ZooKeeper的协调分布式应用

这个文档使你对ZooKeeper快速入门,它主要针对想尝试它的开发者。并且包含简单的单机的ZooKeeper服务的安装说明,一些验证是否运行的命令,和一个简单的编程例子。最后,为了方便起见,有几部分关于更复杂的安装,例如运行复制的部署,优化事务日志,然而为了商业部署的完整手册,请参考ZooKeeper Administrator's Guide

Pre-requisites

参考管理手册中的System Requirements。

下载

想要获得ZooKeeper的分发。从Apache的下载镜像中下载一个最近的稳定版本。

单机操作

以单机的模型安装ZooKeeper服务是相当直接的。服务器包含一个单独的JAR包,所以安装过程包含创建一个配置文件。一旦你下载了一个ZooKeeper的稳定发行版本。解压它然后进入到它的根目录。

为了启动ZooKeeper你需要一个配置文件,这里有一个例子,在conf/zoo.cfg中创建它。

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

这个文件可以被叫作任何名字。但是为了这个讨论叫它conf/zoo.cfg。改变dataDir的值使它指向一个存在(一开始为空)的目录,下面是每一个字段的含义。

tickTimeZooKeeper使用的最基本的毫秒时间单位,它被用来做心跳并且会话失效的最小时间是两倍的tickTime。

dataDir存储内存数据库快照的地址,并且除非另外指定,也是数据库的更新的事务日志的地址。

clientPort监听客户端连接的端口

现在你已经创建了一个配置文件,你可以用下面的命令启动ZooKeeper。

bin/zkServer.sh start

ZooKeeper使用log4j来记录日志消息,更详细的内容可以在开发者的指导手册中的Logging部分获得。你可以看到日志打印到控制台(默认的)和/或根据log4j的配置的日志文件中。

这里列出的是以单机模式运行ZooKeeper的大纲。这里没有复制,所以如果ZooKeeper进程失败,服务将会停止。这对大部分的开发情况是ok的。但是想要以复制模式运行ZooKeeper,请参考Running Replicated ZooKeeper

管理ZooKeeper存储

对于一个长时间运行的生产环境系统,ZooKeeper存储必须在外部被管理(dataDir and logs)。参考maintenance部分来获取更多信息。

链接ZooKeeper

一旦ZooKeeper正在运行。你有几个选项来链接它:

  • Java 使用
bin/zkCli.sh -server 127.0.0.1:

这使你执行简单的像文件一样的操作。

一旦你已经连接上,你将会看到像下面这些内容。

Connecting to localhost:
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: ]

从shell里,你可以输入help你可以获取一个在客户端可执行的命令的列表。例如:

[zkshell: ] 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: ] ls /
[zookeeper]

下一步,创建一个节点通过运行create /zk_test my_data。这创建一个新的znode并且给这个节点关联一个string "my_data"。你可以看到:

[zkshell: ] create /zk_test my_data
Created /zk_test

发起另一个ls / 命令来查看目录看起来像什么:

[zkshell: ] ls /
[zookeeper, zk_test]

注意zk_test目录已经被创建。

下一步,通过运行get命令检查跟这个节点关联的数据,例如:

[zkshell: ] get /zk_test
my_data
cZxid =
ctime = Fri Jun :: PDT
mZxid =
mtime = Fri Jun :: PDT
pZxid =
cversion =
dataVersion =
aclVersion =
ephemeralOwner =
dataLength =
numChildren =

我们可以改变跟这个节点关联的数据通过运行set命令,例如:

[zkshell: ] set /zk_test junk
cZxid =
ctime = Fri Jun :: PDT
mZxid =
mtime = Fri Jun :: PDT
pZxid =
cversion =
dataVersion =
aclVersion =
ephemeralOwner =
dataLength =
numChildren =
[zkshell: ] get /zk_test
junk
cZxid =
ctime = Fri Jun :: PDT
mZxid =
mtime = Fri Jun :: PDT
pZxid =
cversion =
dataVersion =
aclVersion =
ephemeralOwner =
dataLength =
numChildren =

注意我们做了一个get操作在set操作之后,并且它确实改变了。

最后,让我们删除这个节点通过:

[zkshell: ] delete /zk_test
[zkshell: ] ls /
[zookeeper]
[zkshell: ]

先就这些吧,要想获取更多。继续这个文档的剩余部分和Programmer's Guide部分。

ZooKeeper编程

ZooKeeper有一个Java绑定和C绑定。他们在功能上是等价的。C绑定以两种不同的形式存在:单线程和多线程。他们只在消息循环是如何完成时不同。更多信息请参考Programming Examples in the ZooKeeper Programmer's Guide。

运行可复制的ZooKeeper

以单机模式运行ZooKeeper对评估,一些开发,和测试来说是很方便的,但是在生产环境,你应该以复制模式运行ZooKeeper。在同一个应用程序中运行的服务的复制组被称为法定人数,在复制模式,法定人数中的所有的服务器有相同的配置文件。

注意:

对于复制模式,最少需要三台服务器,并且强烈建议你用奇数个服务器。如果你只有两个服务器,那么如果其中的一个失败的话,就没有足够的机器来组成大多数的法定人数。两个服务器本质上比一个服务器更不稳定,因为有两个单点故障。

对于复制模式的conf/zoo.cfg和单机模式下是相似的,但是有一些不太一样。下面是一个例子:

tickTime=
dataDir=/var/lib/zookeeper
clientPort=
initLimit=
syncLimit=
server.=zoo1::
server.=zoo2::
server.=zoo3::

新条目,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节点将会掉线。为了冗余需要每一个节点拥有它自己的机器。它必需是完成独立的物理机器。同一个物理主机的多个

虚拟机器对这个主机的失败也是脆弱的。

其它的优化

有其它几个配置参数可能大大地提高性能:

  • 为了更新里有低的延迟,有一个特定的事务日志目录是重要的。默认情况下事务日志被放在和数据快照和myid文件相同的目录。dataLogDir参数为事务日志指明了一个不同的目录。
  • [tbd:其它配置参数呢]

插播个广告


老丈人家的粉皮儿,农产品,没有乱七八糟的添加剂,欢迎惠顾
 

ZooKeeper入门(四)的更多相关文章

  1. Zookeeper入门(四)之Leader选举

    让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...

  2. [转帖]Zookeeper入门看这篇就够了

    Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...

  3. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  4. 分布式助手Zookeeper(四)

    分布式助手Zookeeper(四)博客分类: Zookeeper zookeeper配置同步zookeeper编程 Zookeeper是分布式环境下一个重要的组件,因为它能在分布式环境下,给我带来很多 ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...

  7. Thinkphp入门 四 —布局、缓存、系统变量 (48)

    原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调 ...

  8. DevExpress XtraReports 入门四 创建 Web 报表

    原文:DevExpress XtraReports 入门四 创建 Web 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这 ...

  9. 分布式进阶(十六)Zookeeper入门基础

    Zookeeper入门基础 前言 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据.如果在创建znode时Flag设置为EPHEMERAL,那么当 ...

随机推荐

  1. oraclize预言机资料

    oraclize预言机资料 智能合约如何可信的与外部世界交互: https://blog.csdn.net/sportshark/article/details/77477842 国外一篇讲得很详细的 ...

  2. Python3 Tkinter-Label

    1.创建 from tkinter import * root=Tk() root.title('Hello tkinter!') root.mainloop() 2.使用内置位图 from tkin ...

  3. StreamSets小白踩过的一些坑

    由于公司业务上的需求,需要实时监控mysql数据库的数据的增长,并将数据同步到另一个平台,所以就问老大使用什么工具比较好,老大推荐使用StreamSets,还说在测试环境都已经部署好了StreamSe ...

  4. Java学习个人备忘录之线程间的通信

    线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...

  5. Java学习个人备忘录之文档注释

    文档注释 单行注释用 // 多行注释有两种,第一种是 /* 内容 */,第二种是/** 内容 */. 这两种多行注释的区别是/** 内容 */这种注释可以生成一个该文件的注释文档,下面是演示代码. A ...

  6. 美美哒rand()函数

     2016.3.7     天气:大雪都已经三月份竟然还下了这么大的雪,真是少见呀.今天为了提交软件工程的作业我们需要注册git的账号,真是前途艰难呀,后台服务器都要爆炸了,其实我觉得这个平台的服务器 ...

  7. Pipeline组测试说明

    PIPELINE组测试报告 前言:我们组与学霸系统的其他两个小组共同合作开发,组成学霸系统的团体工作.作为学霸系统的一环,我们组起到承上启下的作用,因此,面向群体以及功能实现都是为给下一个组的工作做好 ...

  8. c++SDK c#调用_疑难杂症

    在编写过程中,会不时遇到各种问题: 1.dll明显在和exe同一目录下但调用不成功, 2.运行正常,没有报错,参数数值运行过程中也一致,但结果就是达不到预想, 都是dll没有引用完全造成的影响. 推荐 ...

  9. unity像素贪吃蛇

    [ 星 辰 · 别 礼 ] 设计过程: 首先,在之前玩坏控制台做的那个c#贪吃蛇之后,我以为做unity会很简单,但事实比较不如人意...拖了好几天.因为过程中遇到一些问题 蛇身的移动,还是用列表,将 ...

  10. TCP系列08—连接管理—7、TCP 常见选项(option)

    一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...