设为首页 收藏本站
查看: 842|回复: 0

[经验分享] ZooKeeper 入门指南

[复制链接]

尚未签到

发表于 2019-1-8 06:10:16 | 显示全部楼层 |阅读模式
ZooKeeper 入门指南


  • 入门:使用ZooKeeper协调分布式应用程序

    • 先决条件
    • 下载
    • 独立操作
    • 管理ZooKeeper存储
    • 连接到ZooKeeper
    • 编程到ZooKeeper
    • 运行复制的ZooKeeper
    • 其他优化

  入门:使用ZooKeeper协调分布式应用程序
  本文档包含了使您快速入门ZooKeeper的信息。 主要针对希望尝试的开发人员,包含单个ZooKeeper服务器的简单安装说明,一些命令来验证它正在运行,以及一个简单的编程示例。 最后,为了方便起见,有一些关于更复杂安装的部分,例如运行复制部署,以及优化事务日志。 但是,有关商业部署的完整说明,请参阅ZooKeeper管理员指南。
  先决条件

系统要求
  支持的平台
  ZooKeeper由多个组件组成。 一些组件得到广泛支持,其他组件仅在一组较小的平台上受支持。


  • Client:是Java客户端库,由应用程序用来连接ZooKeeper集成。
  • Server:是在ZooKeeper集合节点上运行的Java服务器。
  • Native Client:是一个用C实现的客户端,类似于Java客户端,由应用程序用来连接到一个ZooKeeper集合。
  • Contrib:指的是多个可选的附加组件。
  以下矩阵描述了在不同的操作系统平台上运行每个组件的承诺级别。


操作系统
客户端(Client)
服务器(Server)
本机客户端(Native Client)
普通发布版(Contrib)




GNU/Linux
开发和生产
开发和生产
开发和生产
开发和生产


Solaris
开发和生产
开发和生产
不支持
不支持


FreeBSD
开发和生产
开发和生产
不支持
不支持


Windows
开发和生产
开发和生产

不支持


Mac OS X
开发仅开发
只支持
不支持
不支持
  对于矩阵中没有明确提到的任何操作系统,组件可能会或可能不会工作。 ZooKeeper社区将修复为其他平台报告的明显错误,但没有完全支持。

所需的软件
  ZooKeeper以Java运行,版本为1.7或更高版本(JDK 7或更高版本,FreeBSD支持需要openjdk7)。 它作为一个ZooKeeper服务器的集合运行。三台ZooKeeper服务器是建议的最小尺寸,我们也建议他们在不同的机器上运行。 在Yahoo!上,ZooKeeper通常部署在专用的RHEL盒子上,包括双核处理器,2GB内存和80GB IDE硬盘。
  下载
  要获得ZooKeeper发行版,请从Apache下载镜像中的一个下载最新的稳定版本
  独立操作
  在独立模式下设置ZooKeeper服务器非常简单。 服务器包含在单个JAR文件中,因此安装包括创建配置。
  一旦你下载了一个稳定的ZooKeeper版本解压缩并cd到根目录。
  要启动ZooKeeper,你需要一个配置文件。 这里是一个示例,在conf / zoo.cfg中创建它:

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
  这个文件可以被称为任何东西,但是为了这个讨论,把它叫做conf / zoo.cfg。 更改dataDir的值以指定一个现有的(空开始)目录(没有就需要创建)。 以下是每个字段的含义:


  • tickTime:ZooKeeper使用的基本时间单位(以毫秒为单位)。 它用于做心跳,ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如:最小会话超时将是tickTime的两倍。
  • dataDir:存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
  • clientPort:监听客户端连接的端口
  现在您已经创建了配置文件,您可以启动ZooKeeper:

in/zkServer.sh start
  ZooKeeper使用log4j记录消息 - “程序员指南”的“日志记录”部分提供了更多详细信息。 您将看到日志消息来到控制台(默认)和/或一个日志文件取决于log4j配置。
  这里概述的步骤以独立模式运行ZooKeeper。 没有复制,所以如果ZooKeeper进程失败,服务将会关闭。 这在大多数开发情况下都可以,但是要以复制模式运行ZooKeeper,请参阅运行复制ZooKeeper。
  管理ZooKeeper存储
  对于长时间运行的生产系统,ZooKeeper存储必须由外部进行管理(dataDir和日志)。 有关更多详细信息,请参阅维护部分。
  连接到ZooKeeper

$ 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 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命令来验证数据是否与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]
  现在就是这样。 要了解更多信息,请继续阅读本文档的其余部分,并参阅“程序员指南”。
  编程到ZooKeeper
  ZooKeeper有一个Java绑定和C绑定。 它们在功能上是等同的。 C绑定存在两种变体:单线程和多线程。 这些仅在消息传递循环完成方面有所不同。 有关更多信息,请参阅ZooKeeper程序员指南中的编程示例,了解使用不同API的示例代码。
  运行复制的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集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
  • server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 由于配置的是伪集群模式, 所以各个server的B, C参数必须不同.
  新条目initLimit是超时值ZooKeeper用来限制仲裁中的ZooKeeper服务器必须连接到领导者的时间长度。 条目syncLimit限制了服务器可以从领导者处过期多久。
  有了这两个超时,您可以使用tickTime指定时间单位。 在这个例子中,initLimit的超时时间为5倍tickTime, 即5*2000=10000ms=10s。
  表单server.X的条目列出了组成ZooKeeper服务的服务器。 当服务器启动时,它通过在数据目录中查找文件myid来知道它是哪个服务器。 该文件包含ASCII码的服务器号码。
  最后,记下每个服务器名称后的两个端口号:“2888”和“3888”。 同行使用以前的端口连接到其他同行。 这样的连接是必要的,以便同行可以沟通,例如,就更新顺序达成一致。 更具体地说,一个ZooKeeper服务器使用这个端口将追随者连接到领导。 当一个新的领导者出现时,一个追随者使用这个端口打开一个到领导者的TCP连接。 因为默认领导选举也使用TCP,所以我们目前需要另一个领导选举。 这是服务器条目中的第二个端口。

  注意:如果要在单台计算机上测试多台服务器,请将服务器名称指定为具有唯一仲裁和领导者选举端口的本地主机(即上述示例中的2888:3888,2889:3889,2890:3890) 配置文件。 当然,单独的dataDirs和不同的clientPort也是必要的(在上面复制的例子中,在一个本地主机上运行,你仍然有三个配置文件)。
  请注意,在一台机器上设置多个服务器不会产生任何冗余。 如果发生了导致机器死机的事情,所有的动物园管理员服务器都将处于脱机状态。 完全冗余要求每台服务器都有自己的机器。 它必须是一个完全独立的物理服务器。 同一物理主机上的多个虚拟机仍然容易出现该主机的完全故障。

  其他优化
  有几个其他配置参数可以大大提高性能:


  • 为了在更新时获得较低的延迟,有一个专用的事务日志目录是非常重要的。 默认情况下,事务日志与数据快照和myid文件放在同一个目录中。 dataLogDir参数指示用于事务日志的不同目录。
  • [待定:什么是其他配置参数?] ([tbd: what is the other config param?])




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660469-1-1.html 上篇帖子: 基于docker搭建zookeeper集群 下篇帖子: Zookeeper理解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表