Tips

做一个终身学习的人!

日拱一卒,功不唐捐。

在本节中,我们将讲解如何下载并安装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=2000
dataDir=/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.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

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

$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using 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 default
Using config: /Users/i32

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

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

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

$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using 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] help
ZooKeeper -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=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:这个参数是最初连接到领导者的跟随者的超时时间,以毫秒数表示
  • 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 status
JMX enabled by default
Using config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[zoo2] # ${ZK_HOME}/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[zoo3] # ${ZK_HOME}/bin/zkServer.sh status
JMX enabled by default
Using 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:2181
Connecting 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=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.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=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/zoo1
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

第二个实例的配置文件:

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

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

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/zoo3
clientPort=2183
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.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集群!

2.动手实操Apache ZooKeeper的更多相关文章

  1. 动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?

    当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人 ...

  2. 动手实操(一):如何用七牛云 API 实现相片地图?

    实操玩家: 在苹果手机上,我们只要打开定位服务,拍照后便能在相簿中找到地图,地图上显示着在各地拍摄的相片.网站上这种显示方式也并不少见,例如 Flickr.即将关闭的 Panoramio 等. 作为地 ...

  3. 二:动手实操SpringBoot-使用Spring Initializr创建项目

    使用 Spring Initializr 初始化 Spring Boot 项目 Spring Initializr 从本质上说就是一个Web应用程序,它能为你构建Spring Boot项目结构. 虽然 ...

  4. 动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路

    摘要:一文手把手教你利用RC522射频卡模块与IC卡完成充值消费查询的技术实现思路. 本文分享自华为云社区<​​​​​​​​​​​​​​RC522射频卡模块与IC卡完成充值消费查询的技术实现思路 ...

  5. zookeeper之二:zookeeper3.7.0安装过程实操

    前面分享了zookeeper的基本知识,下面分享有关zookeeper安装的知识. 1.下载 zookeeper的官网是:https://zookeeper.apache.org/ 在官网上找到下载链 ...

  6. 3.Apache ZooKeeper数据模型

    1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务. 它旨在解决分布式应用程序中与组件协调相关的棘手问题. 它通过暴露一个简单而强大的接口来实现这一 ...

  7. SBT实操指南

    参考资料:1.英文官方文档2.中文官方文档,内容翻译的不全 SBT是类似maven和gradle的自动构建和包依赖管理工具,SBT是Scala技术体系下的包管理工具,都是Lightbend公司开发的, ...

  8. ASP.NET Core托管和部署Linux实操演练手册

    一.课程介绍 ASP.NET Core 是一种全新的跨平台开源 .NET 框架,能够在 IIS.Nginx.Apache.Docker 上进行托管或在自己的进程中进行自托管. 作为一个.NET Web ...

  9. HDFS集群PB级数据迁移方案-DistCp生产环境实操篇

    HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...

随机推荐

  1. 03标准对象-01-Date和JSON

    0.写在前面的话 在JS世界中,一切都是对象,区别对象类型使用tyepof,返回一个字符串,如: typeof 123; // 'number' typeof NaN; // 'number' typ ...

  2. SDP开发

    1.1 前言 在企业间的商业竞争越来越激烈的今天,如何快速实现客户需求,如果快速方开发.修改.更新系统功能,如何降低软件研发的成本等等,在此目标基础上研发了软件快速开发(SDP)工具.通过平台设计器快 ...

  3. day14<常见对象+>

    常见对象(正则表达式的概述和简单使用) 常见对象(字符类演示) 常见对象(预定义字符类演示) 常见对象(数量词) 常见对象(正则表达式的分割功能) 常见对象(把给定字符串中的数字排序) 常见对象(正则 ...

  4. PHP数组运算符

    PHP数组预算符有==(等于),===(恒等于),!=(不等于),<>(不等于),+(联合): 注意:没有-(减号)运算符: $a=array("a"=>&quo ...

  5. CSS3 animation-timing-function steps()

    animation-timging-function 主要是控制css动画从开始到结束的速度. linear:线性过渡.等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease:平滑过渡.等 ...

  6. 【京东账户】——Mysql/PHP/Ajax爬坑之页头页尾加载

    一.引言 实现京东的账户项目,有一个小功能,页头页尾加载.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.实现 原理: 用php文件分别写一个的页头和一个页尾,放在前后两个div里. ...

  7. oracle 表查询(二)

    1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...

  8. PyTorch教程之Tensors

    Tensors类似于numpy的ndarrays,但是可以在GPU上使用来加速计算. 一.Tensors的构建 from __future__ import print_function import ...

  9. python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!

    首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...

  10. Android开发更新UI的几种方式

    1.runOnUiThread 2.handler post 3.handler sendmessage 4.view post xml布局文件: <RelativeLayout xmlns:a ...