如何在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
切换到所需用户,在访问系统和运行进程的凭据之间创建了一定程度的分离。 在此步骤中,您将为 zk 和 root 用户禁用 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 文档 以获取更多信息和项目。