作者选择了 Wikimedia Foundation Inc.作为 Write for Donations计划的一部分接受捐款。
介绍
Apache ZooKeeper是一款开源软件,可实现灵活且高度可靠的分布式协调,通常用于分布式系统管理配置信息、命名服务、分布式同步、定数和状态。
在本指南中,你将安装和配置Apache ZooKeeper 3.4.13 在Ubuntu 18.04上,为了实现弹性和高可用性,ZooKeeper旨在被复制在一组主机上,称为组合。首先,你将创建单节点的ZooKeeper服务器的独立安装,然后为设置多节点集群添加细节。
前提条件
在启动此安装和配置指南之前,您需要以下内容:
- 獨立安裝需要一個 Ubuntu 18.04 伺服器,至少需要 4 GB 的 RAM 安裝,請遵循 Ubuntu 18.04 初始伺服器安裝指南,包括具有 sudo 權限的非根用戶和防火牆。 您需要兩個額外的伺服器,以遵循相同步驟安裝,為多個節點集群。
- OpenJDK 8 安裝在您的伺服器上,因為 ZooKeeper 需要 Java 執行。
由于 ZooKeeper 将数据存储在内存中以实现高输出量和低延迟,因此生产系统最好使用 8 GB 的 RAM。 较少的 RAM 可能会导致 JVM 交换,这可能会导致 ZooKeeper 服务器延迟。
步骤 1 — 为 ZooKeeper 创建用户
专用用户应该运行在网络上处理请求并消耗资源的服务. 这种做法会创建分离和控制,从而提高环境的安全性和可管理性. 在此步骤中,您将创建一个名为 zk的非 root sudo 用户,在本教程中运行 ZooKeeper 服务。
首先,作为您在前提条件中创建的非 root sudo 用户登录。
1[environment local]
2ssh sammy@your_server_ip
创建将运行 ZooKeeper 服务的用户:
1sudo useradd zk -m
将-m
标志转移到useradd
命令,将为该用户创建一个主目录. zk的主目录将默认为/home/zk
。
将bash
设置为 zk 用户的默认壳:
1sudo usermod --shell /bin/bash zk
為此用戶設定密碼:
1sudo passwd zk
接下来,您将将 zk 用户添加到 sudo 组中,以便在特权模式下运行命令:
1usermod -aG sudo zk
在安全方面,建议您允许 SSH 访问尽可能少的用户。 远程登录为 sammy,然后使用su
切换到所需的用户创建了访问系统和运行流程的凭证之间的分离级别。
打开sshd_config
文件:
1sudo nano /etc/ssh/sshd_config
查找允许RootLogin
行,并将值设置为不
,以禁用SSH访问 root用户:
1[label /etc/ssh/sshd_config]
2PermitRootLogin no
在允许RootLogin
值下,添加一个拒绝用户
行,并将该值设置为任何应该禁用SSH访问的用户:
1[label /etc/ssh/sshd_config]
2DenyUsers zk
保存和退出文件,然后重新启动 SSH 示范器以激活更改。
1sudo systemctl restart sshd
切换到 zk用户:
1su -l zk
-l
旗号在切换用户后召唤登录壳,登录壳重置环境变量,为用户提供清洁的开始。
在提示中输入密码来验证用户。
现在你已经创建,配置和登录为 zk用户,你将创建一个目录来存储你的 ZooKeeper 数据。
步骤 2:为 ZooKeeper 创建数据目录
ZooKeeper坚持所有的配置和状态数据到磁盘,以便它可以幸存于重新启动. 在这个步骤中,你将创建一个数据目录,ZooKeeper将使用读取和写入数据. 你可以创建数据目录在本地文件系统或远程存储驱动器上。
创建一个 ZooKeeper 目录来使用:
1sudo mkdir -p /data/zookeeper
向目录授予您的 zk用户所有权:
1sudo chown zk:zk /data/zookeeper
「chown」會改變「/data/zookeeper」目錄的所有權和群組,使屬於「zk」群組的使用者 zk擁有資料目錄。
您已成功创建和配置数据目录. 当您继续配置 ZooKeeper 时,您将指定此路径作为 ZooKeeper 将用于存储文件的数据目录。
步骤 3 – 下载和提取 ZooKeeper 二进制
在此步骤中,您将手动下载并提取ZooKeeper二进制到/opt
目录中。您可以使用高级包装工具apt
下载ZooKeeper,但它可能会安装具有不同功能的较旧版本。
由于您正在手动下载这些文件,请通过更改到 /opt
目录开始:
1cd /opt
从您的本地机器,导航到 Apache下载页面。 此页面将自动为您提供最接近的镜子,以获得最快的下载。 点击向建议的镜子网站的链接,然后向下滚动,点击 zookeeper/ 查看可用的版本。 选择您想要安装的 ZooKeeper 版本。 本教程将专注于使用 3.4.13。 一旦您选择了版本,右键单击以 `.tar.gz’结束的二进制文件,并复制链接。
从您的服务器,使用wget
命令和复制的链接下载ZooKeeper二进制:
1sudo wget http://apache.osuosl.org/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
从压缩档案中提取二进制:
1sudo tar -xvf zookeeper-3.4.13.tar.gz
「.tar.gz」扩展代表了 TAR 包装的组合,然后是 GNU zip (gzip) 压缩。您会注意到您将旗帜 -xvf' 传递给提取档案的命令。 旗帜
x' 代表提取, v' 允许 verbose 模式显示提取进度,而
f' 允许指定输入,在我们的情况下 `zookeeper-3.4.13.targz',而不是 STDIN。
接下来,给 zk用户提取的二进制的所有权,这样它就可以运行可执行的。
1sudo chown zk:zk -R zookeeper-3.4.13
接下来,您将配置一个符号链接,以确保您的 ZooKeeper 目录在更新中保持相关性. 您还可以使用符号链接来缩短目录名称,从而减少设置配置文件所需的时间。
使用ln
命令创建一个符号链接。
1sudo ln -s zookeeper-3.4.13 zookeeper
将该链接的所有权更改为zk:zk
。请注意,您已经通过了-h
标志,以更改链接本身的所有权。
1sudo chown -h zk:zk zookeeper
通过创建符号链接,您的目录路径在配置中将保持相关和未变,通过未来的升级。
步骤 4 – 配置 ZooKeeper
现在你已经设置了环境,你已经准备好配置 ZooKeeper。
配置文件将生活在 /opt/zookeeper/conf
目录中. 此目录包含与 ZooKeeper 分布一起的样本配置文件。 这个样本文件,名为 `zoo_sample.cfg',包含这些参数最常见的配置参数定义和样本值。 一些常见参数如下:
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
创建一个名为 zoo.cfg
的配置文件在 /opt/zookeeper/conf
. 您可以使用 nano
或您最喜欢的编辑器创建和打开一个文件:
1nano /opt/zookeeper/conf/zoo.cfg
向该文件添加以下属性和值集:
1[label /opt/zookeeper/conf/zoo.cfg]
2tickTime=2000
3dataDir=/data/zookeeper
4clientPort=2181
5maxClientCnxns=60
2000毫秒的tickTime
是心跳之间建议的间隔。较短的间隔可能会导致系统的过度使用,并且受益有限。dataDir
参数指向您在上一节所创建的符号链接所定义的路径。通常,ZooKeeper 使用端口2181
来收听客户端连接。在大多数情况下,60个允许的客户端连接充足用于开发和测试。
保存文件并离开编辑器。
您已经配置了 ZooKeeper 并准备启动服务器。
步骤 5 – 启动 ZooKeeper 并测试独立安装
您已经配置了运行 ZooKeeper 所需的所有组件. 在此步骤中,您将启动 ZooKeeper 服务并通过本地连接到服务来测试您的配置。
返回/opt/zookeeper
目录。
1cd /opt/zookeeper
使用zkServer.sh
命令启动 ZooKeeper。
1bin/zkServer.sh start
您将在您的标准输出中看到以下内容:
1[secondary_label Output]
2ZooKeeper JMX enabled by default
3Using config: /opt/zookeeper/bin/../conf/zoo.cfg
4Starting zookeeper ... STARTED
使用以下命令连接到本地 ZooKeeper 服务器:
1bin/zkCli.sh -server 127.0.0.1:2181
您将收到标签为CONNECTED
的提示,这表明您已成功安装了本地独立的 ZooKeeper。 如果您遇到错误,您将想要验证配置是否正确。
1[secondary_label Output]
2Connecting to 127.0.0.1:2181
3...
4...
5[zk: 127.0.0.1:2181(CONNECTED) 0]
在这个提示中键入帮助
,以获取您可以从客户端执行的命令列表。
1[secondary_label Output]
2[zk: 127.0.0.1:2181(CONNECTED) 0] help
3ZooKeeper -server host:port cmd args
4 stat path [watch]
5 set path data [version]
6 ls path [watch]
7 delquota [-n|-b] path
8 ls2 path [watch]
9 setAcl path acl
10 setquota -n|-b val path
11 history
12 redo cmdno
13 printwatches on|off
14 delete path [version]
15 sync path
16 listquota path
17 rmr path
18 get path [watch]
19 create [-s] [-e] path data acl
20 addauth scheme auth
21 quit
22 getAcl path
23 close
24 connect host:port
在您完成了一些测试后,您将通过在提示中键入quit
来关闭客户端会话. 在您关闭客户端会话后,ZooKeeper 服务将继续运行.关闭 ZooKeeper 服务,因为您将在下一步将其配置为systemd
服务:
1bin/zkServer.sh stop
您现在已经安装、配置并测试了独立的 ZooKeeper 服务. 此设置有助于您熟悉 ZooKeeper,但也对开发和测试环境有用。
步骤 6 — 创建和使用 Systemd 单元文件
`systemd,系统和服务管理器,是一个 init 系统,用于启动用户空间,并在启动后管理系统流程。
Systemd Essentials是一个很好的介绍资源来了解更多关于systemd
及其组成部分。
使用您的编辑器创建一个名为zk.service
的.service
文件在/etc/systemd/system/
。
1sudo nano /etc/systemd/system/zk.service
将下列行添加到文件中以定义 ZooKeeper 服务:
1[label /etc/systemd/system/zk.service]
2[Unit]
3Description=Zookeeper Daemon
4Documentation=http://zookeeper.apache.org
5Requires=network.target
6After=network.target
7
8[Service]
9Type=forking
10WorkingDirectory=/opt/zookeeper
11User=zk
12Group=zk
13ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
14ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
15ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
16TimeoutSec=30
17Restart=on-failure
18
19[Install]
20WantedBy=default.target
单元文件配置中的服务
部分指定了工作目录、该服务将运行的用户以及启动、停止和重新启动 ZooKeeper 服务的可执行命令。
保存文件并离开编辑器。
现在,你的systemd
配置已经到位,你可以开始服务:
1sudo systemctl start zk
一旦您确认您的systemd
文件可以成功启动服务,您将允许该服务启动。
1sudo systemctl enable zk
此输出证实了象征链接的创建:
1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/zk.service → /etc/systemd/system/zk.service.
查看使用 ZooKeeper 服务的状态:
1sudo systemctl status zk
停止使用systemctl
的 ZooKeeper 服务。
1sudo systemctl stop zk
最后,要重新启动 DAEMON,请使用以下命令:
1sudo systemctl restart zk
现在你已经配置了systemd
来管理ZooKeeper,你可以利用这个快速而灵活的 init模型来启动,停止和重新启动ZooKeeper服务。
步骤 7 — 配置多节点 ZooKeeper 集群
虽然独立的 ZooKeeper 服务器对于开发和测试是有用的,但每个生产环境都应该有一个复制的多节点集群。
在 ZooKeeper 集群中,作为一个应用程序一起工作的节点构成一个 quorum. Quorum 是指在进行交易之前需要达成协议的节点的最小数目。
在生产环境中,您应该在单独的主机上运行每一个 ZooKeeper 节点,从而防止服务中断,因为主机硬件故障或重新启动,这是构建具有弹性且高度可用的分布式系统的重要和必要的架构考虑。
在本教程中,您将安装和配置三节点,以演示多节点设置。在配置三节点集群之前,您将创建两个与独立的 ZooKeeper 安装相同配置的额外服务器。
一旦您遵循新的节点的步骤一到六,请在每个节点的编辑器中打开zoo.cfg
。
1sudo nano /opt/zookeeper/conf/zoo.cfg
在您在三个节点中的每个zoo.cfg
文件中,在文件的末尾添加initLimit
,syncLimit
和该组中的服务器的额外配置参数和值。
1[label /opt/zookeeper/conf/zoo.cfg]
2tickTime=2000
3dataDir=/data/zookeeper
4clientPort=2181
5maxClientCnxns=60
6initLimit=10
7syncLimit=5
8server.1=your_zookeeper_node_1:2888:3888
9server.2=your_zookeeper_node_2:2888:3888
10server.3=your_zookeeper_node_3:2888:3888
initLimit
指示初始同步阶段所需的时间。 这个时间是定数中的每个节点需要连接到领导者之间的时间。 syncLimit
指示发送请求和接收确认之间可以过的时间。 这是节点可以从领导者中失灵的最大时间。 ZooKeeper 节点使用一对端口,分别是 :2888
和 :3888
,用于跟随节点连接到领导者节点和进行领导者选举。
一旦您在每个节点上更新了文件,您将保存并退出编辑器。
要完成多节点配置,您将在每个服务器上指定一个节点ID。 要做到这一点,您将在每个节点上创建一个myid
文件。 每个文件将包含与配置文件中分配的服务器号码相关的号码。
在 your_zookeeper_node_1上,创建将指定节点ID的myid
文件:
1sudo nano /data/zookeeper/myid
由于 your_zookeeper_node_1被识别为server.1
,您将输入1
来定义节点ID。
1[secondary_label your_zookeeper_node_1 /data/zookeeper/myid]
21
对于剩余节点,请遵循相同的步骤,每个节点上的myid
文件应如下:
1[secondary_label your_zookeeper_node_1 /data/zookeeper/myid]
21
1[secondary_label your_zookeeper_node_2 /data/zookeeper/myid][environment second]
22
1[secondary_label your_zookeeper_node_3 /data/zookeeper/myid][environment third]
23
您现在已经配置了三个节点的 ZooKeeper 集群,接下来,您将运行集群并测试您的安装。
步骤 8 – 运行和测试多节点安装
随着每个节点配置为作为一个群集工作,你已经准备好开始一个定数。 在此步骤中,你将开始每个节点的定数,然后通过在 ZooKeeper 中创建样本数据来测试你的群集。
要启动一个定数节点,首先切换到每个节点上的/opt/zookeeper
目录:
1cd /opt/zookeeper
用以下命令启动每个节点:
1java -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 登录到 your_zookeeper_node_3作为您在前提条件中配置的非根用户:
1[environment local]
2ssh sammy@your_zookeeper_node_3
一旦登录,切换到您的 zk用户:
1[secondary_label your_zookeeper_node_3 /data/zookeeper/myid][environment third]
2su -l zk
输入 zk用户的密码. 登录后,更改目录为 /opt/zookeeper
:
1[secondary_label your_zookeeper_node_3 /data/zookeeper/myid][environment third]
2cd /opt/zookeeper
您现在将启动 ZooKeeper 命令行客户端,并在 your_zookeeper_node_1上连接到 ZooKeeper:
1[secondary_label your_zookeeper_node_3 /data/zookeeper/myid][environment third]
2bin/zkCli.sh -server your_zookeeper_node_1:2181
在独立安装中,客户端和服务器都在同一个主机上运行,这使您可以使用localhost
建立与ZooKeeper服务器的客户端连接,因为客户端和服务器在多节点集群中运行在不同的节点上,在之前的步骤中,您需要指定 your_zookeeper_node_1的IP地址才能连接到它。
您将看到熟悉的提示标签连接
,类似于您在步骤 5 中看到的。
接下来,您将创建、列出,然后删除一个 znode。Znodes 是 ZooKeeper 中的基本抽象,与文件系统上的文件和目录类似。
测试您是否能够成功创建、列出并删除一个znode是确认您的ZooKeeper集群是否正确安装和配置的关键。
创建一个名为 zk_znode_1
的 znode,并将字符串 sample_data
与之关联。
1create /zk_znode_1 sample_data
您将看到下面的输出,一旦创建:
1[secondary_label Output]
2Created /zk_znode_1
列出新创建的node:
1ls /
获取与之相关的数据:
1get /zk_znode_1
ZooKeeper会这样回答:
1[secondary_label Output]
2[zk: your_zookeeper_node_1:2181(CONNECTED)] ls /
3[zk_znode_1, zookeeper]
4[zk: your_zookeeper_node_1:2181(CONNECTED)] get /zk_znode_1
5sample_data
6cZxid = 0x100000002
7ctime = Tue Nov 06 19:47:41 UTC 2018
8mZxid = 0x100000002
9mtime = Tue Nov 06 19:47:41 UTC 2018
10pZxid = 0x100000002
11cversion = 0
12dataVersion = 0
13aclVersion = 0
14ephemeralOwner = 0x0
15dataLength = 11
16numChildren = 0
输出确认了与 zk_node_1 关联的值,即 样本_数据. ZooKeeper 还提供有关创建时间、ctime 和修改时间的额外信息,即 mtime。
请删除 zk_znode_1
znode:
1delete /zk_znode_1
在此步骤中,您成功测试了两个 ZooKeeper 节点之间的连接性,您还通过创建、列出和删除节点来学习了基本的 znode 管理。
结论
在本教程中,您已配置并测试了独立和多节点的 ZooKeeper 环境. 现在,您的多节点 ZooKeeper 部署已准备好使用,您可以查看 官方 ZooKeeper 文档 获取更多信息和项目。