如何在Ubuntu18.04上安装和配置ApacheZooKeeper集群

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Wikimedia Foundation Inc. 来接受捐赠。

介绍

Apache ZooKeeper 是开源软件,可实现弹性且高度可靠的分布式协调。 它通常在分布式系统中用于管理配置信息、命名服务、分布式同步、仲裁和状态。 此外,分布式系统依赖 ZooKeeper 来实现共识、leader 选举和 group 管理。

在本指南中,您将在 Ubuntu 18.04 上安装和配置 Apache ZooKeeper 3.4.13。 为了实现弹性和高可用性,ZooKeeper 旨在通过一组主机进行复制,称为 ensemble。 首先,您将创建单节点 ZooKeeper 服务器的独立安装,然后添加设置多节点集群的详细信息。 独立安装在开发和测试环境中很有用,但集群是生产环境中最实用的解决方案。

先决条件

在开始本安装和配置指南之前,您需要以下内容:

  • 独立安装需要按照 Ubuntu 18.04 初始服务器设置指南 设置至少 4GB RAM 的 Ubuntu 18.04 服务器,包括具有 sudo 权限的非 root 用户和防火墙。 您需要两个额外的服务器,按照相同的步骤设置,用于多节点集群。
  • OpenJDK 8 安装在您的服务器上,因为 ZooKeeper 需要 Java 才能运行。 为此,请按照 How To Install Java with `apt` on Ubuntu 18.04 指南中的“安装 OpenJDK 的特定版本”步骤进行操作。

由于 ZooKeeper 将数据保存在内存中以实现高吞吐量和低延迟,因此生产系统使用 8GB RAM 时效果最佳。 较低的 RAM 量可能会导致 JVM 交换,这可能会导致 ZooKeeper 服务器延迟。 ZooKeeper 服务器的高延迟可能会导致客户端会话超时等问题,从而对系统功能产生不利影响。

第 1 步 — 为 ZooKeeper 创建用户

专用用户应该运行通过网络处理请求并消耗资源的服务。 这种做法会创建隔离和控制,从而提高环境的安全性和可管理性。 在这一步中,您将创建一个非 root sudo 用户,在本教程中命名为 zk,以运行 ZooKeeper 服务。

首先,以您在先决条件中创建的非 root sudo 用户身份登录。

ssh sammy@your_server_ip

创建将运行 ZooKeeper 服务的用户:

sudo useradd zk -m

-m 标志传递给 useradd 命令将为该用户创建一个主目录。 zk 的主目录默认为 /home/zk

bash 设置为 zk 用户的默认 shell:

sudo usermod --shell /bin/bash zk

为该用户设置密码:

sudo passwd zk

接下来,将 zk 用户添加到 sudo 组,以便它可以在特权模式下运行命令:

usermod -aG sudo zk

在安全性方面,建议您允许尽可能少的用户进行 SSH 访问。 以 sammy 身份远程登录,然后使用 su 切换到所需用户,在访问系统和运行进程的凭据之间创建了一定程度的分离。 在此步骤中,您将为 zkroot 用户禁用 SSH 访问。

打开您的 sshd_config 文件:

sudo nano /etc/ssh/sshd_config

找到 PermitRootLogin 行并将值设置为 no 以禁用 root 用户的 SSH 访问:

/etc/ssh/sshd_config

PermitRootLogin no

PermitRootLogin 值下,添加 DenyUsers 行并将值设置为应禁用 SSH 访问的任何用户:

/etc/ssh/sshd_config

DenyUsers zk

保存并退出文件,然后重新启动 SSH 守护程序以激活更改。

sudo systemctl restart sshd

切换到 zk 用户:

su -l zk

-l 标志在切换用户后调用登录 shell。 登录 shell 重置环境变量并为用户提供一个干净的开始。

在提示符处输入密码以对用户进行身份验证。

现在您已经创建、配置并以 zk 用户身份登录,您将创建一个目录来存储 ZooKeeper 数据。

第 2 步 — 为 ZooKeeper 创建数据目录

ZooKeeper 将所有配置和状态数据保存到磁盘,以便在重新启动后仍能存活。 在这一步中,您将创建一个数据目录,ZooKeeper 将使用它来读取和写入数据。 您可以在本地文件系统或远程存储驱动器上创建数据目录。 本教程将重点介绍在本地文件系统上创建数据目录。

创建一个目录供 ZooKeeper 使用:

sudo mkdir -p /data/zookeeper

授予您的 zk 用户对目录的所有权:

sudo chown zk:zk /data/zookeeper

chown更改/data/zookeeper目录的所有权和组,使属于组zk的用户zk拥有数据目录。

您已成功创建和配置数据目录。 当您继续配置 ZooKeeper 时,您将指定此路径作为 ZooKeeper 将用来存储其文件的数据目录。

第 3 步 — 下载和提取 ZooKeeper 二进制文件

在此步骤中,您将手动下载 ZooKeeper 二进制文件并将其解压缩到 /opt 目录。 您可以使用高级打包工具 apt 来下载 ZooKeeper,但它可能会安装具有不同功能的旧版本。 手动安装 ZooKeeper 将使您可以完全控制选择要使用的版本。

由于您是手动下载这些文件,因此首先切换到 /opt 目录:

cd /opt

在您的本地机器上,导航到 Apache 下载页面 。 此页面会自动为您提供离您最近的镜像,以便您以最快的速度下载。 单击建议镜像站点的链接,然后向下滚动并单击 zookeeper/ 以查看可用版本。 选择您要安装的 ZooKeeper 版本。 本教程将重点介绍使用 3.4.13。 选择版本后,右键单击以.tar.gz结尾的二进制文件并复制链接地址。

在您的服务器上,使用 wget 命令和复制的链接下载 ZooKeeper 二进制文件:

sudo wget http://apache.osuosl.org/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

从压缩存档中提取二进制文件:

sudo tar -xvf zookeeper-3.4.13.tar.gz

.tar.gz 扩展名表示 TAR 打包和 GNU zip (gzip) 压缩的组合。 您会注意到您将标志 -xvf 传递给命令以提取存档。 标志 x 代表提取,v 启用详细模式以显示提取进度,f 允许指定输入,在我们的例子中是 zookeeper-3.4.13.tar.gz,如反对标准输入法。

接下来,将提取的二进制文件的所有权授予 zk 用户,以便它可以运行可执行文件。 您可以像这样更改所有权:

sudo chown zk:zk -R  zookeeper-3.4.13

接下来,您将配置一个符号链接以确保您的 ZooKeeper 目录在更新时保持相关性。 您还可以使用符号链接来缩短目录名称,这可以减少设置配置文件所需的时间。

使用 ln 命令创建符号链接。

sudo ln -s zookeeper-3.4.13 zookeeper

将该链接的所有权更改为 zk:zk。 请注意,您已经传递了一个 -h 标志来更改链接本身的所有权。 不指定 -h 会更改链接目标的所有权,这是您在上一步中明确执行的。

sudo chown -h zk:zk zookeeper

创建符号链接后,配置中的目录路径将保持相关性,并且在未来的升级中保持不变。 您现在可以配置 ZooKeeper。

第 4 步 — 配置 ZooKeeper

现在您已经设置了环境,可以准备配置 ZooKeeper。

配置文件将位于 /opt/zookeeper/conf 目录中。 该目录包含 ZooKeeper 发行版附带的示例配置文件。 此示例文件名为 zoo_sample.cfg,包含最常见的配置参数定义和这些参数的示例值。 一些常见的参数如下:

  • tickTime:以毫秒为单位设置刻度的长度。 滴答是 ZooKeeper 用来测量心跳之间长度的时间单位。 最小会话超时是 tickTime 的两倍。
  • dataDir:指定用于存储内存数据库快照和更新事务日志的目录。 您可以选择为事务日志指定一个单独的目录。
  • clientPort:用于监听客户端连接的端口。
  • maxClientCnxns:限制客户端连接的最大数量。

/opt/zookeeper/conf 处创建一个名为 zoo.cfg 的配置文件。 您可以使用 nano 或您喜欢的编辑器创建和打开文件:

nano /opt/zookeeper/conf/zoo.cfg

将以下一组属性和值添加到该文件:

/opt/zookeeper/conf/zoo.cfg

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60

2000 毫秒的 tickTime 是建议的心跳间隔。 较短的时间间隔可能会导致系统开销有限,但收益有限。 dataDir 参数指向您在上一节中创建的符号链接定义的路径。 按照惯例,ZooKeeper 使用端口 2181 来监听客户端连接。 在大多数情况下,60 个允许的客户端连接对于开发和测试来说已经足够了。

保存文件并退出编辑器。

您已配置 ZooKeeper 并准备启动服务器。

第 5 步 — 启动 ZooKeeper 并测试独立安装

您已经配置了运行 ZooKeeper 所需的所有组件。 在此步骤中,您将启动 ZooKeeper 服务并通过在本地连接到该服务来测试您的配置。

导航回 /opt/zookeeper 目录。

cd /opt/zookeeper

使用 zkServer.sh 命令启动 ZooKeeper。

bin/zkServer.sh start

您将在标准输出中看到以下内容:

OutputZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

使用以下命令连接到本地 ZooKeeper 服务器:

bin/zkCli.sh -server 127.0.0.1:2181

您将收到带有标签 CONNECTED 的提示。 这确认您已经成功地安装了本地、独立的 ZooKeeper。 如果遇到错误,您将需要验证配置是否正确。

OutputConnecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]

在此提示符下键入 help 以获取可以从客户端执行的命令列表。 输出如下:

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

完成一些测试后,您将通过在提示符下键入 quit 来关闭客户端会话。 ZooKeeper 服务将在您关闭客户端会话后继续运行。 关闭 ZooKeeper 服务,因为您将在下一步将其配置为 systemd 服务:

bin/zkServer.sh stop

您现在已经安装、配置和测试了一个独立的 ZooKeeper 服务。 此设置有助于您熟悉 ZooKeeper,但也有助于开发和测试环境。 现在您知道配置有效,您将配置 systemd 以简化 ZooKeeper 服务的管理。

第 6 步 - 创建和使用 Systemd 单元文件

systemd,系统和服务管理器,是一个初始化系统,用于引导用户空间并在引导后管理系统进程。 您可以使用 systemd 创建一个守护进程来启动和检查 ZooKeeper 的状态。

Systemd Essentials 是一个很好的介绍性资源,用于了解更多关于 systemd 及其组成部分的信息。

使用您的编辑器在 /etc/systemd/system/ 处创建一个名为 zk.service.service 文件。

sudo nano /etc/systemd/system/zk.service

将以下行添加到文件中以定义 ZooKeeper 服务:

/etc/systemd/system/zk.service

[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target

[Service]    
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=default.target

单元文件配置中的 Service 部分指定了工作目录、运行服务的用户以及启动、停止和重新启动 ZooKeeper 服务的可执行命令。 有关所有单元文件配置选项的更多信息,您可以阅读 Understanding Systemd Units and Unit Files 文章。

保存文件并退出编辑器。

现在您的 systemd 配置已经到位,您可以启动服务:

sudo systemctl start zk

一旦您确认您的 systemd 文件可以成功启动该服务,您将启用该服务在启动时启动。

sudo systemctl enable zk

此输出确认符号链接的创建:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zk.service → /etc/systemd/system/zk.service.

使用以下命令检查 ZooKeeper 服务的状态:

sudo systemctl status zk

使用 systemctl 停止 ZooKeeper 服务。

sudo systemctl stop zk

最后,要重新启动守护程序,请使用以下命令:

sudo systemctl restart zk

systemd 机制正在成为许多 Linux 发行版的首选初始化系统。 现在您已经配置 systemd 来管理 ZooKeeper,您可以利用这种快速灵活的初始化模型来启动、停止和重新启动 ZooKeeper 服务。

第 7 步 — 配置多节点 ZooKeeper 集群

虽然独立的 ZooKeeper 服务器对开发和测试很有用,但每个生产环境都应该有一个复制的多节点集群。

ZooKeeper 集群中作为应用程序一起工作的节点形成 quorum。 法定人数是指在提交事务之前需要就事务达成一致的最小节点数。 仲裁需要奇数个节点才能建立多数。 偶数个节点可能会导致平局,这意味着节点不会达到多数或共识。

在生产环境中,您应该在单独的主机上运行每个 ZooKeeper 节点。 这可以防止由于主机硬件故障或重新启动而导致服务中断。 这是构建弹性和高可用性分布式系统的重要且必要的架构考虑因素。

在本教程中,您将在仲裁中安装和配置三个节点,以演示多节点设置。 在配置三节点集群之前,您将启动两个额外的服务器,其配置与您的独立 ZooKeeper 安装相同。 确保另外两个节点满足先决条件,然后按照步骤 1 到 6 设置正在运行的 ZooKeeper 实例。

为新节点执行步骤 1 到 6 后,在每个节点的编辑器中打开 zoo.cfg

sudo nano /opt/zookeeper/conf/zoo.cfg

仲裁中的所有节点都需要相同的配置文件。 在三个节点中每个节点上的 zoo.cfg 文件中,在文件。

/opt/zookeeper/conf/zoo.cfg

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888

initLimit 指定初始同步阶段可以花费的时间。 这是仲裁中的每个节点都需要连接到领导者的时间。 syncLimit 指定发送请求和接收确认之间可以经过的时间。 这是节点与领导者不同步的最长时间。 ZooKeeper 节点使用一对端口,:2888:3888,分别用于跟随者节点连接到领导者节点和领导者选举。

在每个节点上更新文件后,您将保存并退出编辑器。

要完成多节点配置,您将在每台服务器上指定一个节点 ID。 为此,您将在每个节点上创建一个 myid 文件。 每个文件将包含一个与配置文件中分配的服务器编号相关的编号。

your_zookeeper_node_1 上,创建将指定节点 ID 的 myid 文件:

sudo nano /data/zookeeper/myid

由于 your_zookeeper_node_1 被识别为 server.1,您将输入 1 来定义节点 ID。 添加值后,您的文件将如下所示:

your_zookeeper_node_1 /data/zookeeper/myid1

对其余节点执行相同的步骤。 每个节点上的myid文件应该如下:

your_zookeeper_node_1 /data/zookeeper/myid1
your_zookeeper_node_2 /data/zookeeper/myid][environment second2
your_zookeeper_node_3 /data/zookeeper/myid][environment third3

您现在已经配置了一个三节点 ZooKeeper 集群。 接下来,您将运行集群并测试您的安装。

第 8 步 — 运行和测试多节点安装

将每个节点配置为集群工作后,您就可以开始仲裁了。 在此步骤中,您将在每个节点上启动仲裁,然后通过在 ZooKeeper 中创建示例数据来测试您的集群。

要启动仲裁节点,首先切换到每个节点上的 /opt/zookeeper 目录:

cd /opt/zookeeper

使用以下命令启动每个节点:

java -cp zookeeper-3.4.13.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg

当节点启动时,您会间歇性地看到一些连接错误,然后是它们加入仲裁并在它们之间选举领导者的阶段。 几秒钟的初始化后,您可以开始测试您的安装。

以您在先决条件中配置的非 root 用户身份通过 SSH 登录到 your_zookeeper_node_3

ssh sammy@your_zookeeper_node_3

登录后,切换到您的 zk 用户:

your_zookeeper_node_3 /data/zookeeper/myid][environment thirdsu -l zk

输入 zk 用户的密码。 登录后,将目录更改为 /opt/zookeeper

your_zookeeper_node_3 /data/zookeeper/myid][environment thirdcd /opt/zookeeper

您现在将启动 ZooKeeper 命令行客户端并连接到 your_zookeeper_node_1 上的 ZooKeeper:

your_zookeeper_node_3 /data/zookeeper/myid][environment thirdbin/zkCli.sh -server your_zookeeper_node_1:2181

在独立安装中,客户端和服务器都在同一主机上运行。 这允许您使用 localhost 与 ZooKeeper 服务器建立客户端连接。 由于客户端和服务器运行在多节点集群的不同节点上,因此在上一步中,您需要指定 your_zookeeper_node_1 的 IP 地址来连接它。

您将看到带有 CONNECTED 标签的熟悉提示,类似于您在步骤 5 中看到的。

接下来,您将创建、列出并删除一个 znode。 znode 是 ZooKeeper 中的基本抽象,类似于文件系统上的文件和目录。 ZooKeeper 在分层命名空间中维护其数据,znodes 是该命名空间的数据寄存器。

测试您是否可以成功创建、列出并删除 znode 对于确定您的 ZooKeeper 集群是否已正确安装和配置至关重要。

创建一个名为 zk_znode_1 的 znode 并将字符串 sample_data 与其关联。

create /zk_znode_1 sample_data

创建后,您将看到以下输出:

OutputCreated /zk_znode_1

列出新创建的 znode:

ls /

获取与之关联的数据:

get /zk_znode_1

ZooKeeper 会这样响应:

Output[zk: your_zookeeper_node_1:2181(CONNECTED)] ls /
[zk_znode_1, zookeeper]
[zk: your_zookeeper_node_1:2181(CONNECTED)] get /zk_znode_1
sample_data
cZxid = 0x100000002
ctime = Tue Nov 06 19:47:41 UTC 2018
mZxid = 0x100000002
mtime = Tue Nov 06 19:47:41 UTC 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

输出确认您与 zk_node_1 关联的值 sample_data。 ZooKeeper 还提供有关创建时间 ctime 和修改时间 mtime 的附加信息。 ZooKeeper 是一个版本化的数据存储,因此它还为您提供有关数据版本的元数据。

删除 zk_znode_1 znode:

delete /zk_znode_1

在这一步中,您成功地测试了两个 ZooKeeper 节点之间的连接性。 您还通过创建、列出和删除 znode 学习了基本的 znode 管理。 您的多节点配置已完成,您可以开始使用 ZooKeeper。

结论

在本教程中,您配置并测试了独立和多节点 ZooKeeper 环境。 现在您的多节点 ZooKeeper 部署已准备好使用,您可以查看 官方 ZooKeeper 文档 以获取更多信息和项目。