作者选择了Wikimedia Foundation Inc.作为Write for DOnations计划的一部分进行捐赠。
介绍
Apache ZooKeeper是一种开源软件,可实现弹性和高度可靠的分布式协调。 它通常用于分布式系统,以管理配置信息,命名服务,分布式同步,仲裁和状态。 此外,分布式系统依靠ZooKeeper来实现共识,领导者选举和组管理。
在本指南中,您将在Ubuntu 18.04上安装和配置Apache ZooKeeper 3.4.13。 为了实现弹性和高可用性,ZooKeeper旨在通过一组称为集合的主机进行复制。 首先,您将创建单节点ZooKeeper服务器的独立安装,然后添加有关设置多节点集群的详细信息。 独立安装在开发和测试环境中很有用,但集群是生产环境中最实用的解决方案。
先决条件
在开始本安装和配置指南之前,您需要具备以下条件:
- 独立安装需要一个Ubuntu 18.04服务器,其中至少有4GB的RAM设置,遵循Ubuntu 18.04初始服务器设置指南 ,包括具有sudo权限和防火墙的非root用户。 对于多节点群集,您需要通过遵循相同步骤设置两个附加服务器。
- OpenJDK 8安装在您的服务器上,因为ZooKeeper需要运行Java。 为此,请遵循Ubuntu 18.04指南中的如何使用`apt`安装Java的“安装OpenJDK的特定版本”步骤。
由于ZooKeeper将数据保存在内存中以实现高吞吐量和低延迟,因此生产系统最适合使用8GB RAM。 较少的RAM可能导致JVM交换,这可能导致ZooKeeper服务器延迟。 高ZooKeeper服务器延迟可能导致客户端会话超时等问题,从而对系统功能产生负面影响。
第1步 - 为ZooKeeper创建用户
专用用户应运行通过网络处理请求并消耗资源的服务。 这种做法创建了隔离和控制,可以改善您的环境的安全性和可管理性。 在此步骤中,您将在本教程中创建一个名为zk的非root sudo用户来运行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访问:
PermitRootLogin no
在PermitRootLogin
值下,添加DenyUsers
行并将值设置为应禁用SSH访问的任何用户:
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
代表extract, v
详细模式显示提取进度, f
允许指定输入,在我们的例子中是zookeeper- 3.4.13 .tar.gz
,而不是STDIN。
接下来,为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
:设置刻度的长度(以毫秒为单位)。 tick是ZooKeeper用来测量心跳之间长度的时间单位。 最小会话超时是tickTime的两倍。dataDir
:指定用于存储内存数据库快照和更新事务日志的目录。 您可以选择为事务日志指定单独的目录。clientPort
:用于监听客户端连接的端口。maxClientCnxns
:限制最大客户端连接数。
在/opt/zookeeper/conf
创建名为zoo.cfg
的配置文件。 您可以使用nano
或您喜欢的编辑器创建和打开文件:
nano /opt/zookeeper/conf/zoo.cfg
将以下属性和值集添加到该文件:
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
tickTime
为2000毫秒是心跳之间建议的间隔。 较短的间隔可能导致系统开销,但收益有限。 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
,system和service manager是一个init系统,用于引导用户空间并在引导后管理系统进程。 您可以使用systemd
创建一个守护进程来启动和检查ZooKeeper的状态。
Systemd Essentials是一个很好的入门资源,可以更多地了解systemd
及其组成部分。
使用编辑器在/etc/systemd/system/
创建名为zk.service
的.service
文件。
sudo nano /etc/systemd/system/zk.service
将以下行添加到文件中以定义ZooKeeper服务:
[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服务的可执行命令。 有关所有单元文件配置选项的其他信息,请阅读“ 了解系统单元和单元文件”一文。
保存文件并退出编辑器。
现在您的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发行版的首选init系统。 现在您已经配置了systemd
来管理ZooKeeper,您可以利用这个快速而灵活的init模型来启动,停止和重新启动ZooKeeper服务。
第7步 - 配置多节点ZooKeeper集群
虽然独立的ZooKeeper服务器对开发和测试很有用,但每个生产环境都应该有一个复制的多节点集群。
ZooKeeper集群中的节点作为应用程序一起工作,形成仲裁 。 仲裁是指在事务提交之前需要就事务达成一致的最小节点数。 仲裁需要奇数个节点,以便它可以建立多数。 偶数个节点可能会导致并列,这意味着节点不会达到多数或达成共识。
在生产环境中,您应该在单独的主机上运行每个ZooKeeper节点。 这可以防止因主机硬件故障或重新启动而导致的服务中断。 这是构建弹性且高度可用的分布式系统的重要且必要的架构考虑因素。
在本教程中,您将在仲裁中安装和配置三个节点以演示多节点设置。 在配置三节点群集之前,您将使用与独立ZooKeeper安装相同的配置启动另外两台服务器。 确保两个附加节点满足先决条件,然后按照第1步到6设置正在运行的ZooKeeper实例。
对新节点执行第1步到第6步后,在每个节点的编辑器中打开zoo.cfg
。
sudo nano /opt/zookeeper/conf/zoo.cfg
仲裁中的所有节点都需要相同的配置文件。 在三个节点中每个节点上的zoo.cfg
文件中,为文件末尾的仲裁中的initLimit
, syncLimit
和服务器添加其他配置参数和值。
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/myid2
your_zookeeper_node_3 /data/zookeeper/myid3
您现在已配置了三节点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
当节点启动时,您将间歇性地看到一些连接错误,然后是一个加入仲裁并在其中选出一个领导者的阶段。 初始化几秒钟后,您就可以开始测试安装了。
通过SSH以您在先决条件中配置的非root用户身份登录your_zookeeper_node_3 :
ssh sammy@your_zookeeper_node_3
登录后,切换到zk用户:
your_zookeeper_node_3 /data/zookeeper/myidsu -l zk
输入zk用户的密码。 登录后,将目录更改为/opt/zookeeper
:
your_zookeeper_node_3 /data/zookeeper/myidcd /opt/zookeeper
您现在将启动ZooKeeper命令行客户端并连接到your_zookeeper_node_1上的ZooKeeper:
your_zookeeper_node_3 /data/zookeeper/myidbin/zkCli.sh -server your_zookeeper_node_1:2181
在独立安装中,客户端和服务器都在同一主机上运行。 这允许您使用localhost
与ZooKeeper服务器建立客户端连接。 由于客户端和服务器在多节点群集中的不同节点上运行,因此在上一步中您需要指定your_zookeeper_node_1的IP地址以连接到该节点 。
您将看到熟悉的CONNECTED
标签提示,类似于您在第5步中看到的提示。
接下来,您将创建,列出,然后删除znode 。 znodes是ZooKeeper中的基本抽象,类似于文件系统上的文件和目录。 ZooKeeper将其数据保存在分层命名空间中,znodes是此命名空间的数据寄存器。
您可以成功创建,列出然后删除znode的测试对于确定正确安装和配置ZooKeeper集群至关重要。
创建名为zk_znode_1
,并将字符串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文档以获取更多信息和项目。