2019独角兽企业重金招聘Python工程师标准>>>

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

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

Pre-requisites

参考管理手册中的 System Requirements。

下载

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

单机操作

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

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

1

2

3

tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

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

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

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

clientPort监听客户端连接的端口

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

1

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: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]

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

[zkshell: 0] help
ZooKeeper host:port cmd argsget path [watch]ls path [watch]set path data [version]delquota [-n|-b] pathquitprintwatches on|offcreate path data aclstat path [watch]listquota pathhistorysetAcl path aclgetAcl pathsync pathredo cmdnoaddauth scheme authdelete path [version]deleteall pathsetquota -n|-b val path

从这开始,你可以试一些简单的命令来获取这些简单命令行接口的感觉。首先,从提交一个列表命令开始,例如ls,生成如下结果:

[zkshell: 8] ls /
[zookeeper]

下一步,创建一个节点通过运行create /zk_test my_data。这创建一个新的znode并且给这个节点关联一个string "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命令,例如:

[zkshell: 14] set /zk_test chenkangyao
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
chenkangyao
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操作在set操作之后,并且它确实改变了。

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

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

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

ZooKeeper编程

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

运行可复制的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服务器连接领导者的超时时间。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参数为事务日志指明了一个不同的目录。
  • [其它配置参数呢]

转载于:https://my.oschina.net/u/164027/blog/1921253

ZooKeeper入门(二)相关推荐

  1. Zookeeper 入门学习

    往期博客目录 1. 详解Linux(基础篇) 2. 详解Linux(进阶篇) 3. Git&GitHub(基础) 4. Git&GitHub(进阶) 5. java多线程 6. Jav ...

  2. 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

    视频地址:[尚硅谷]大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01[Zookeeper(入门.本地安装.集群操作)] ...

  3. 【Zookeeper实战】Zookeeper入门到实战看这篇就够了

    1. 前言 在上一篇[Zookeeper入门]相关概念总结 中已经完美的讲解了 Zookeeper入门 相关概念总结,接下来讲讲ZooKeeper 实战使用. 这篇文章简单给演示一下 ZooKeepe ...

  4. SQL基础使用入门(二): DML语句和DCL语句

    SQL语句第二个类别--DML 语句 DML是数据操作语言的缩写,主要用来对数据表中数据记录实例对象进行操作,包括插入.删除.查找以及修改四大操作,这也是开发人员使用中最为频繁的操作. 1.插入记录 ...

  5. 文本分类入门(二)文本分类的方法

    文本分类入门(二)文本分类的方法 文本分类问题与其它分类问题没有本质上的区别,其方法可以归结为根据待分类数据的某些特征来进行匹配,当然完全的匹配是不太可能的,因此必须(根据某种评价标准)选择最优的匹配 ...

  6. 转 Python爬虫入门二之爬虫基础了解

    静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...

  7. Zookeeper入门总结

    什么是Zookeeper 官方定义: zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态 ...

  8. java类作用域标识符_java入门 (二) 标识符、数据类型、类型转换、变量、常量、作用域...

    java入门(二) 标识符 数据类型 类型转换 变量.常量.作用域 本次笔记引用B站:狂神说,虽然早就会了,现在回头来敲下基础,加深印象 1.标识符: java所有的组成部分都需要名字.类名丶变量名丶 ...

  9. MySQL入门 (二) : SELECT 基础查询

    1 查询资料前的基本概念 1.1 表格.纪录与栏位 表格是资料库储存资料的基本元件,它是由一些栏位组合而成的,储存在表格中的每一笔纪录就拥有这些栏位的资料. 以储存城市资料的表格「city」来说,设计 ...

  10. ZooKeeper入门指南

    ZooKeeper入门指南 目录: 入门:使用ZooKeeper协调分布式应用程序 先决条件 下载 独立操作 管理ZooKeeper存储 连接到ZooKeeper 编程到ZooKeeper 运行复制的 ...

最新文章

  1. [case39]聊聊jdk httpclient的executor
  2. Solidity字符串类型
  3. 超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大
  4. C++ morris inorder二叉树中序遍历(附完整源码)
  5. 腾讯一面有感(移动开发岗位)
  6. 将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
  7. 菜鸟赛季之------第221天...
  8. 【SolidWorks、URDF】在SolidWorks里面插入URDF方法步骤以及无法启动的解决问题
  9. matlab中norm函数的用法
  10. 2021版Java同步器教程03:如何使用同步器 CyclicBarrier?
  11. 采用sFlow工具实现流量监控--实验
  12. 学生计算机教室怎么连接网络,计算机(网络)教室学生使用守则
  13. Jenkins基础:Jenkinsfile使用实例:12:使用docker.build构建镜像
  14. Microsoft Azure第一步——试用帐户申请
  15. 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名
  16. 三维激光扫描仪点云数据处理与建模
  17. 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
  18. 机器学习预测股票收益(一)之随机森林模型
  19. 怎么把mp4转换成gif格式?在线转换方法
  20. [更新中]【超强搞笑语录】给大家开心一下,不看你一定后悔

热门文章

  1. Java使用FTP上传文件被损坏的问题
  2. Java语法总结 - 方法
  3. 蓝色清爽可用做排行的侧边列表滑动门代码
  4. 深入解析ORACLE字符集
  5. supesite 更换目录或者域名操作方法
  6. Midletinfo-探索手机javaME系统信息的实用工具
  7. 被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足
  8. HTML5方式使用freeswitch——VERTO模块
  9. Linux内核剖析之回收页框
  10. SylixOS armv8 任务切换