继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

动手实操Apache ZooKeeper

四季花海
关注TA
已关注
手记 150
粉丝 40
获赞 160

Tips
做一个终身学习的人!
日拱一卒,功不唐捐。

ZooKeeper

在本节中,我们将讲解如何下载并安装Apache ZooKeeper,以便我们可以直接开始使用ZooKeeper。 本部分旨在通过提供详细的安装和使用说明,使用ZooKeeper了解其分布式应用程序的需求。 我们将从单节点ZooKeeper安装开始,熟悉基本配置,然后学习ZooKeeper shell。 最后,学习如何设置一个多节点ZooKeeper集群。

1. 下载和安装

ZooKeeper由各种平台支持。 支持GNU / Linux和Oracle Solaris作为服务器和客户端的开发和生产平台。 Windows和Mac OS X系统仅推荐用作服务器和客户端的开发平台。

ZooKeeper由Java中实现,需要运行Java 6或更高版本。 虽然推荐使用Oracle的Java版本,但OpenJDK也可以正常运行ZooKeeper。

ZooKeeper作为一个称为ZooKeeper系列的服务器集合运行。 在生产集群中,三个ZooKeeper服务器是集合的最小建议大小,建议在不同的机器上运行它们。 但是,可以通过在独立模式下将其安装在单台计算机上来学习和练习ZooKeeper。

打开Apache ZooKeeper的官方网站,找到下载页面的链接,根据自己的操作系统,选择不同格式的文件,我用的macOS系统,所以下载了zookeeper-3.4.10.tar.gz,下载后,直接双击解压即可。也可以使用命令:

tar -C /Users/i324779 -zxf zookeeper-3.4.10.tar.gz

我放在了当前用户目录下,你也根据自己的喜好放在指定的目录下。

下载以后,我们需要配置一下环境变量:
以macOS为例,编辑用户目录下的.bash_profile文件,添加如下:
export ZK_HOME=/Users/i324779/zookeeper-3.4.10 export PATH=$PATH:$ZK_HOME/bin

退出编辑后,在终端执行. .bash_profile,立即生效。

接下来是配置, ZooKeeper在提取的ZooKeeper目录下的conf目录中需要一个名为zoo.cfg的配置文件。 在conf目录下,有一个示例配置文件,其中包含一些配置参数供参考。

让我们创建配置文件,并使用以下最小参数,并将其保存在conf目录中:

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

配置参数的含义如下:

  • tickTime:以毫秒为单位;用于会话注册,并通过ZooKeeper服务为客户定期进行心跳。 最小会话超时是tickTime参数的两倍。

  • dataDir:存储ZooKeeper内存状态的位置;它包括数据库快照和数据库更新的事务日志。 提取ZooKeeper目录不会默认创建此目录,因此如果系统中不存在此目录,则需要创建该目录并设置可写权限。

  • clientPort: 监听客户端连接的端口,因此它是ZooKeeper客户端启动连接的位置。 客户端口可以设置为任意数字,不同的服务器可以配置为在不同端口上进行监听。 默认值为2181。

如前所述,ZooKeeper需要一个Java运行时环境才能正常工作。所以,在运行ZooKeeper之前,需要安装1.6版本以上的JDK。

2. 启动ZooKeeper服务

所有ZooKeeper管理脚本启动/停止服务器并调用ZooKeeper命令shell,并存放在bin目录下:

$ pwd
/Users/i324779/zookeeper-3.4.10/bin
$ ls
README.txt  zkCli.cmd   zkEnv.cmd   zkServer.cmd
zkCleanup.sh    zkCli.sh    zkEnv.sh    zkServer.sh

扩展名为.sh的脚本适用于Unix平台(GNU / Linux,macOS等),扩展名为.cmd的脚本适用于Microsoft Windows操作系统。

要在GNU / Linux系统中启动ZooKeeper服务器,需要执行如下的zkServer.sh脚本。 此脚本提供启动,停止,重新启动并查看ZooKeeper服务器状态的选项:

$ ./zkServer.sh
ZooKeeper JMX enabled by default
Using config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfgUsage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

执行zkServer.sh并加上start参数将启动ZooKeeper服务器。 服务器的成功启动显示以下输出:

$ ./zkServer.sh start
ZooKeeper JMX enabled by defaultUsing config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

要验证ZooKeeper服务器是否已启动,可以使用以下ps命令:

$ ps –ef | grep zookeeper | grep –v grep | awk '{print $2}'
56050

如果你的系统上安装了jps命令,则可以如下验证ZooKeeper服务器的状态:

ps
56050 QuorumPeerMain
29942 
53078 
56072 Jps

ZooKeeper进程列为QuorumPeerMain。 在这种情况下,执行jps命令显示ZooKeeper服务器正在运行56050进程标识符,与ps命令报告的进程标识相匹配。

可以使用zkServer.sh脚本检查ZooKeeper服务器的状态,如下所示:

$ zkServer.sh status
ZooKeeper JMX enabled by defaultUsing config: /Users/i32

要停止服务器进程,可以使用stop参数的脚本:

$ zkServer.sh stop
ZooKeeper JMX enabled by defaultUsing config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

当ZooKeeper停止或不在运行时检查状态将显示以下结果:

$ zkServer.sh stop
ZooKeeper JMX enabled by defaultUsing config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

一旦我们的ZooKeeper实例运行,接下来要做的就是连接到它。 ZooKeeper附带默认的基于Java的命令行shell连接到ZooKeeper实例。 还有一个C语言版客户端。

3. 使用基于Java的shell连接到ZooKeeper

要启动基于Java的ZooKeeper命令行shell,我们只需要使用服务器IP和端口号运行ZK_HOME/bin目录下的zkCli.sh,如下所示:

${ZK_HOME}/bin/zkCli.sh –server zk_server:port

在我们的例子中,我们在同一台机器上运行ZooKeeper服务器,所以ZooKeeper服务器是localhost,或者IP地址127.0.0.1。 配置的默认端口是2181:

$ zkCli.sh -server localhost:2181

当我们连接到运行的ZooKeeper实例时,将看到与终端中的以下输出类似的输出(部分有省略):

Connecting to localhost:2181...............
...............Welcome to ZooKeeper!JLine support is enabled...............WATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: localhost:2181(CONNECTED) 0]

要查看ZooKeeper Java shell支持的命令列表,可以在shell提示符下运行help命令:

[zk: localhost:2181(CONNECTED) 0] helpZooKeeper -server host:port cmd args
  connect host:port
  get path [watch]
  ls path [watch]  set path data [version]
  rmr path
  delquota [-n|-b] path
  quit 
  printwatches on|off
  create [-s] [-e] path data acl  stat path [watch]
  close 
  ls2 path [watch]  history 
  listquota path
  setAcl path acl
  getAcl path
  sync path
  redo cmdno
  addauth scheme auth
  delete path [version]
  setquota -n|-b val path

我们可以在命令行中执行一些简单的命令,运行ls命令,与Unix效果一样:

[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]

现在,ls命令返回一个名为zookeeper的字符串,它是ZooKeeper术语中的称之为znode。  我们可以通过ZooKeeper shell创建一个znode,如下所示:

首先,创建一个空数据的HelloWorld的znode:

[zk: localhost:2181(CONNECTED) 2] create /HelloWorld ""Created /HelloWorld
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper, HelloWorld]

可以使用delete命令删除创建的znode,如下所示:

[zk: localhost:2181(CONNECTED) 4] delete /HelloWorld
[zk: localhost:2181(CONNECTED) 5] ls /
[zookeeper]

4. 建立一个多节点ZooKeeper集群

到目前为止,我们已经在单机(standalone)模式下设置了一个ZooKeeper服务器实例。 单机实例存在潜在的单点故障。 如果ZooKeeper服务器出现故障,则使用该实例进行分布式协调的整个应用程序将失败并停止运行。 因此,在实际生产环境中不推荐使用以单机模式运行ZooKeeper,尽管为了开发和测试的目的,是可以满足需求的。

在生产环境中,ZooKeeper应该以复制模式运行在多台服务器上,也称为ZooKeeper集合。 最低推荐的服务器数量是三个,五个是生产环境中最常见的。 同一应用程序域中的复制服务器组称为quorum。 在此模式下,ZooKeeper服务器实例在多个不同的计算机上运行,quorum中的所有服务器都具有相同配置文件的副本。 在quorum中,ZooKeeper实例以领导者/跟随者模式运行。 其中一个实例被选为领导者,其他成员则成为追随者。 如果领导者失败,就会出现新的领导者选举,另一个正在执行的实例成为领导者。 然而,这些复杂性完全隐藏在使用ZooKeeper和开发人员的应用程序中。

用于多节点模式的ZooKeeper配置文件类似于我们用于单个实例模式的配置文件, 示例配置文件如下所示:

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

这两个配置参数也在这里说明一下:

  • initLimit:这个参数是最初连接到领导者的跟随者的超时时间,以毫秒数表示

  • syncLimit:指定追随者与领导者同步的超时时间

这两个超时是以心跳时间为单位指定的。 因此,在我们的示例中,initLimit的超时时间为2000毫秒为一个心跳一共五次心跳,或10秒钟。

server.id=host:port:port格式的上述示例中的其他三个条目是构成quorum的服务器列表。.id标识符是一个数字,用于具有quorum主机名的服务器。 在我们的示例配置中,为zoo1仲裁成员主机分配了一个标识符1

需要在该服务器的数据目录中myid的文件中指定标识符。 重要的是,myid文件应该包含仅包含该服务器ID的文本(ASCII)的单行。 该集合中的id必须是唯一的,并且应该具有介于1到255之间的值。

还有,我们在每个服务器主机名后面有两个端口号:2888和3888,这里解释说明:

  • 端口号2888,主要用于quorum中的对等通信,例如将追随者与领导者联系起来。一个追随者使用这个端口打开一个到领导者的TCP连接。

  • 端口号3888,用于领导者选举,以防新领导者出现在仲裁中。由于所有的通信都发生在TCP上,因此需要第二个端口来响应仲裁内部的领导选举。

5. 启动服务实例

在为quorum中的每个服务器设置配置文件后,我们需要启动ZooKeeper服务器实例。 该过程与单机模式相同。 我们必须连接到每个机器并执行以下命令:

${ZK_HOME}/bin/zkServer.sh start

一旦实例成功启动,我们在每个机器上执行以下命令来检查实例状态:

${ZK_HOME}/bin/zkServer.sh status

例如,检查下一个quorum:

[zoo1] # ${ZK_HOME}/bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[zoo2] # ${ZK_HOME}/bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[zoo3] # ${ZK_HOME}/bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

如前面的例子所示,zoo2是quorum的领导者,而zoo1和zoo3是追随者。 通过命令行shell连接到ZooKeeper的quorum与单机模式相同,除了在${ZK_HOME}/bin/zkCli.sh命令中指定host1:port2, host2:port2 …格式的连接字符串作为服务器的参数:

$ zkCli.sh -server zoo1:2181,zoo2:2181,zoo3:2181Connecting to zoo1:2181, zoo2:2181, zoo3:2181… … … …
Welcome to ZooKeeper!
… … … …
[zk: zoo1:2181,zoo2:2181,zoo3:2181 (CONNECTED) 0]

一旦ZooKeeper集群启动并运行,就可以使用Java管理扩展(JMX)和通过客户端口发送一些命令来监控它。

6. ZooKeeper的运行多个节点模式

也可以在单台机器上以多节点模式运行ZooKeeper。 这对于测试目的很有用。 要在同一台机器上运行多节点模式,我们需要调整一下配置;例如,我们可以将服务器名称设置为localhost,并指定唯一的quorum和领导者选举端口。

我们使用以下配置文件,使用单台机器设置多节点ZooKeeper集群:

tickTime=2000initLimit=5syncLimit=2dataDir=/var/lib/zookeeper
clientPort=2181server.1=localhost:2666:3666server.2=localhost:2667:3667server.3=localhost:2668:3668

如上一节所述,服务器『X』的每个条目都指定『X』 ZooKeeper服务器使用的地址和端口号。 第一个字段是服务器『X』的主机名或IP地址。第二个和第三个字段分别是用于quorum通信和领导选举的TCP端口号。 当我们在同一台机器上启动三个ZooKeeper服务器实例时,我们需要为每个服务器条目使用不同的端口号。

其次,当我们在同一台机器上运行多个ZooKeeper服务器进程时,需要为每个实例提供不同的客户端口。

还有,还要为每个正在运行的实例自定义dataDir参数。

将所有这些参数放在一起,对于三个实例ZooKeeper集群,创建三个不同的配置文件。 将这些zoo1.cfg,zoo2.cfg和zoo3.cfg调用并保存在${ZK_HOME}的conf目录中。 为/var/lib/zookeeper中的实例(例如zoo1,zoo2和zoo3)创建三个不同的数据目录。 下面显示三个配置文件。

以下是第一个实例的配置文件:

tickTime=2000initLimit=5syncLimit=2dataDir=/var/lib/zookeeper/zoo1
clientPort=2181server.1=localhost:2666:3666server.2=localhost:2667:3667server.3=localhost:2668:3668

第二个实例的配置文件:

tickTime=2000initLimit=5syncLimit=2dataDir=/var/lib/zookeeper/zoo2
clientPort=2182server.1=localhost:2666:3666server.2=localhost:2667:3667server.3=localhost:2668:3668

第三个也是最后一个配置文件:

tickTime=2000initLimit=5syncLimit=2dataDir=/var/lib/zookeeper/zoo3
clientPort=2183server.1=localhost:2666:3666server.2=localhost:2667:3667server.3=localhost:2668:3668

还需要在每个实例的myid文件中修复正确的服务ID参数。 可以使用以下三个命令完成:

$ echo 1 > /var/lib/zookeeper/zoo1/myid
$ echo 2 > /var/lib/zookeeper/zoo2/myid
$ echo 3 > /var/lib/zookeeper/zoo3/myid

现在,都设置为启动ZooKeeper实例。 并开始运行以下实例:

$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo1.cfg
$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo2.cfg
$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo3.cfg

一旦所有的实例启动完成,我们可以使用zkCli.sh脚本连接到多节点ZooKeeper集群,就像我们之前所做的那样:

$ ${ZK_HOME}/bin/zkCli.sh –server \     localhost:2181, localhost:2182, localhost:2183

现在,我们有了运行在同一台机器上的三个节点ZooKeeper集群!



作者:M104
链接:https://www.jianshu.com/p/ff353d2050c4


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP