部署方式

本节包含有关部署Zookeeper的信息,并涵盖以下主题:

  1. 系统要求

  2. 群集(多服务器)设置

  3. 单服务器和开发人员设置

前两个部分假设您对在生产环境(例如数据中心)中安装ZooKeeper感兴趣。

最后一部分介绍了在有限的基础上设置ZooKeeper的情况-用于评估,测试或开发-但不在生产环境中。

系统要求

客户端是Java客户端库,应用程序使用它来连接到ZooKeeper集合。

服务器是在ZooKeeper集成节点上运行的Java服务器。

Native Client是类似于Java客户端的用C语言实现的客户端,应用程序使用它来连接ZooKeeper集成体。

Contrib是指多个可选的附加组件。

必备软件

ZooKeeper以Java版本1.8或更高版本运行(JDK 8 LTS,JDK 11 LTS,JDK 12-不支持Java 9和10)。

它作为ZooKeeper服务器的整体运行。

建议三个最小的ZooKeeper服务器是一个整体的最小大小,我们也建议它们在单独的计算机上运行。

在Yahoo!上,ZooKeeper通常部署在专用的RHEL盒上,该盒具有双核处理器,2GB RAM和80GB IDE硬盘。

群集(多服务器)设置

为了获得可靠的ZooKeeper服务,您应该在称为集合的集群中部署ZooKeeper。只要大多数合奏正常,该服务便可用。因为Zookeeper占多数,所以最好使用奇数台计算机。

例如,对于四台计算机,ZooKeeper只能处理单台计算机的故障;如果两台计算机发生故障,则其余两台计算机不占多数。但是,使用五台计算机,ZooKeeper可以处理两台计算机的故障。

  • 笔记

如《ZooKeeper入门指南》中所述,容错群集设置至少需要三台服务器,并且强烈建议您使用奇数个服务器。

通常,对于生产安装而言,三台服务器绰绰有余,但是要在维护期间获得最大的可靠性,您可能希望安装五台服务器。

对于三台服务器,如果对其中一台服务器执行维护,则在该维护过程中容易遭受其他两台服务器之一故障的影响。

如果其中有五台正在运行,则可以将其中一台停机进行维护,并知道如果其他四台之一突然发生故障,您仍然可以。

您的冗余注意事项应包括环境的所有方面。如果您有三台ZooKeeper服务器,但它们的网络电缆均插入同一网络交换机,则该交换机的故障将导致整个系统瘫痪。

以下是设置将成为整体的服务器的步骤。

执行步骤

这些步骤应在集合中的每个主机上执行:

1、安装Java JDK。您可以为系统使用本机打包系统,也可以从以下网址下载JDK:http://java.sun.com/javase/downloads/index.jsp

2、设置Java堆大小。这对于避免交换非常重要,因为交换会严重降低ZooKeeper的性能。要确定正确的值,请使用负载测试,并确保您已远远低于会导致交换的使用限制。保守一点-对于4GB的计算机,最大堆大小为3GB。

3、安装ZooKeeper服务器软件包。可以从以下网址下载:http://zookeeper.apache.org/releases.html

4、创建一个配置文件。这个文件可以叫任何东西。

使用以下设置作为起点:

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

您可以在“配置参数”部分中找到这些以及其他配置设置的含义。

这里只说几句:作为ZooKeeper合奏一部分的每台机器都应该知道该合奏中的其他所有机器。

您可以使用 server.id=host:port:port 形式的一系列行来完成此操作。

(参数host和port很简单,对于每个服务器,您需要首先指定Quorum端口,然后指定用于ZooKeeper领导者选举的专用端口)。

从ZooKeeper 3.6.0开始,您还可以为每个ZooKeeper服务器实例指定多个地址(当可以在集群中并行使用多个物理网络接口时,这可以提高可用性)。

通过创建一个名为myid的文件(每台服务器一个),将服务器ID分配给每台计算机,该文件位于配置文件参数dataDir指定的该服务器的数据目录中。

5、myid文件由仅包含该机器ID文本的一行组成。 因此,服务器1的myid将包含文本“ 1”,除此之外没有其他内容。 ID在集合中必须唯一,并且值必须在1到255之间。重要说明:如果启用了TTL节点等扩展功能(请参见下文),由于内部限制,ID必须在1到254之间。

6、在与myid相同的目录中创建一个初始化标记文件进行初始化。

该文件表明应该有一个空的数据目录。

如果存在,将创建一个空数据库并删除标记文件。 如果不存在,则空的数据目录将意味着该对等方将没有投票权,并且在与活动的领导者通信之前不会填充该数据目录。 预期用途是仅在调出新合奏时创建此文件。

7、如果设置了配置文件,则可以启动ZooKeeper服务器:

$ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf

QuorumPeerMain启动了ZooKeeper服务器,还注册了JMX管理bean,该bean允许通过JMX管理控制台进行管理。

ZooKeeper JMX文档包含有关使用JMX管理ZooKeeper的详细信息。

有关启动服务器实例的示例,请参阅发行版中包含的脚本 bin/zkServer.sh。

8、通过连接到主机来测试部署:在Java中,您可以运行以下命令来执行简单的操作:

$ bin/zkCli.sh -server 127.0.0.1:2181

管理员

本节包含有关运行和维护ZooKeeper的信息,并涵盖以下主题:

  • 设计ZooKeeper部署

  • 供应

  • 注意事项:ZooKeeper的优势和局限性

  • 管理

  • 维护

  • 监理

  • 监控方式

  • 记录中

  • 故障排除

  • 配置参数

  • ZooKeeper命令

  • 资料档案管理

  • 避免的事情

  • 最佳实践

设计ZooKeeper部署

ZooKeeper的可靠性基于两个基本假设。

(1)部署中只有少数服务器将发生故障。在这种情况下,故障意味着机器崩溃,或者是网络中的某些错误,这些错误将服务器与大多数服务器分开。

(2)部署的计算机正常运行。正确操作意味着正确执行代码,使时钟正常工作以及使存储和网络组件一致运行。

以下各节包含ZooKeeper管理员要考虑的因素,以最大程度地使这些假设成立。其中一些是跨计算机的考虑因素,而其他则是部署中每台计算机都应考虑的事项。

跨机要求

为了使ZooKeeper服务处于活动状态,必须有大多数可以相互通信的非故障机器。要创建可以容忍F机故障的部署,您应该依靠部署2xF + 1机。

因此,由三台计算机组成的部署可以处理一个故障,而由五台计算机组成的部署可以处理两个故障。

请注意,部署六台计算机只能处理两个故障,因为三台计算机不是多数。因此,ZooKeeper部署通常由奇数台计算机组成。

为了最大程度地容忍故障,您应该尝试使机器故障独立。

例如,如果大多数计算机共享同一交换机,则该交换机的故障可能导致相关的故障并导致服务中断。共享电源电路,冷却系统等也是如此。

单机要求

如果ZooKeeper必须与其他应用程序竞争以访问诸如存储介质,CPU,网络或内存之类的资源,则其性能将显着下降。

ZooKeeper具有强大的耐用性保证,这意味着在允许负责更改的操作完成之前,它使用存储介质记录更改。

然后,您应该意识到这种依赖性,如果要确保媒体不阻止ZooKeeper的操作,请格外小心。

您可以采取以下措施来最大程度地减少这种退化:

ZooKeeper的事务日志必须位于专用设备上。 (专用分区是不够的。)ZooKeeper按顺序写入日志,而不进行查找。与其他进程共享日志设备可能导致查找和争用,进而导致数秒的延迟。

不要将ZooKeeper置于可能引起交换的情况下。为了使ZooKeeper能够以任何及时性运行,它根本不能被交换。因此,请确保分配给ZooKeeper的最大堆大小不大于ZooKeeper可用的实际内存量。

有关更多信息,请参阅下面的避免注意事项。

维护

ZooKeeper集群几乎不需要长期维护,但是您必须注意以下几点:

正在进行的数据目录清除

ZooKeeper数据目录包含的文件是特定服务集合存储的znode的永久副本。这些是快照和事务日志文件。对znode进行更改时,这些更改将附加到事务日志中。有时,当日志变大时,会将所有znodes当前状态的快照写入文件系统,并为将来的事务创建新的事务日志文件。在快照过程中,ZooKeeper可能会继续将传入的事务追加到旧的日志文件中。

因此,一些比快照新的事务可能会在快照之前的最后一个事务日志中找到。

使用默认配置(请参阅下面的自动清除)时,ZooKeeper服务器不会删除旧的快照和日志文件,这是操作员的责任

每个服务环境都不同,因此安装之间(例如备份)的管理这些文件的要求可能会有所不同。

PurgeTxnLog实用程序实现了管理员可以使用的简单保留策略。

API文档包含有关调用约定(参数等)的详细信息。

在以下示例中,将保留最后一个计数快照及其对应的日志,并删除其他快照。的值通常应大于3(尽管不是必需的,但在最近的日志损坏的情况下,这可以提供3次备份)。这可以作为ZooKeeper服务器计算机上的cron作业运行,以每天清理日志。

java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>

自动清除快照和相应的事务日志是在3.4.0版中引入的,可以通过以下配置参数autopurge.snapRetainCount和autopurge.purgeInterval启用。

调试日志清除(log4j)

请参阅本文档中有关登录的部分。

期望您将使用内置的log4j功能来设置滚动文件追加程序。

发行版tar的conf/log4j.properties中的样本配置文件提供了一个示例。

监理

您将需要一个管理流程来管理您的每个ZooKeeper服务器流程(JVM)。

ZK服务器被设计为“快速失败”,这意味着如果发生无法恢复的错误,它将关闭(进程退出)。

由于ZooKeeper服务群集高度可靠,因此这意味着尽管服务器可能宕机,但群集仍处于活动状态并正在处理请求。

另外,由于集群是“自我修复”的,因此一旦失败的服务器重新启动,将自动重新加入该集合,而无需任何手动交互。

有一个监控程序,如daemontools或SMF(也可以使用其他监控程序选项,这取决于您要使用的哪个,这只是两个示例),对ZooKeeper服务器进行管理可确保该进程确实异常退出时进行管理。将自动重启并迅速重新加入集群。

如果发生 OutOfMemoryError**,还建议将ZooKeeper服务器进程配置为终止并转储其堆。

这是通过分别在Linux和Windows上使用以下参数启动JVM来实现的。

ZooKeeper附带的zkServer.sh和zkServer.cmd脚本设置了这些选项。

-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'

"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"

Monitoring

可以通过以下三种主要方式之一来监视ZooKeeper服务:

  1. 通过使用4个字母词的命令端口

  2. 与JMX

  3. 使用zkServer.sh status命令

Logging

ZooKeeper使用SLF4J版本1.7.5作为其日志记录基础结构。为了向后兼容,它绑定到LOG4J,但是您可以使用LOGBack或您选择的任何其他受支持的日志记录框架。

ZooKeeper的默认log4j.properties文件位于conf目录中。

Log4j要求log4j.properties位于工作目录(运行ZooKeeper的目录)中,或者可以从类路径访问。

故障排除

服务器由于文件损坏而无法启动:由于ZooKeeper服务器的事务日志中的某些文件损坏,服务器可能无法读取其数据库并无法启动。

在加载ZooKeeper数据库时,您将看到一些IOException。

在这种情况下,请确保您集合中的所有其他服务器都已启动并正常工作。

在命令端口上使用“stat”命令查看它们是否状况良好。在确认集成的所有其他服务器都已启动之后,可以继续进行操作,并清理损坏的服务器的数据库。

删除datadir / version-2和datalogdir / version-2 /中的所有文件。重新启动服务器。

配置参数

参数配置很多,…

资料档案管理

ZooKeeper将其数据存储在数据目录中,并将其事务日志存储在事务日志目录中。

默认情况下,这两个目录相同。

可以(并且应该)将服务器配置为将事务日志文件存储在与数据文件不同的目录中。

当事务日志驻留在专用日志设备上时,吞吐量增加而延迟减少。

数据目录

此目录中包含两个或三个文件:

  1. myid-在人类可读的ASCII文本中包含一个表示服务器ID的整数。

  2. 初始化-存在指示缺少数据树。创建数据树后清除。

  3. 快照。 保存数据树的模糊快照。

每个ZooKeeper服务器都有一个唯一的ID。此id在两个地方使用:myid文件和​​配置文件。 myid文件标识与给定数据目录相对应的服务器。配置文件列出了由服务器ID标识的每个服务器的联系信息。当ZooKeeper服务器实例启动时,它会从myid文件中读取其ID,然后使用该ID从配置文件中读取,并查找其应侦听的端口。

从某种意义上说,存储在数据目录中的快照文件是模糊快照,即在ZooKeeper服务器获取快照的过程中,正在对数据树进行更新。快照文件名的后缀是快照开始时最后提交的事务的zxid(ZooKeeper事务ID)。

因此,快照包括在快照进行过程中发生的对数据树的更新的子集。

因此,快照可能与实际存在的任何数据树都不对应,因此,我们将其称为模糊快照。

尽管如此,ZooKeeper仍可以使用此快照进行恢复,因为它利用了其更新的幂等性质。通过针对模糊快照重播事务日志,ZooKeeper可以在日志末尾获取系统状态。

日志目录

日志目录包含ZooKeeper事务日志。在进行任何更新之前,ZooKeeper确保将代表该更新的事务写入非易失性存储。当写入当前日志文件的事务数达到(可变)阈值时,将启动一个新的日志文件。使用影响快照频率的相同参数计算阈值(请参见上面的snapCount和snapSizeLimitInKb)。日志文件的后缀是写入该日志的第一个zxid​​。

文件管理

在独立的ZooKeeper服务器和复制的ZooKeeper服务器的不同配置之间,快照和日志文件的格式不会更改。

因此,您可以将这些文件从运行中的复制的ZooKeeper服务器拉到带有独立ZooKeeper服务器的开发计算机上,以进行故障排除。

使用较旧的日志和快照文件,您可以查看ZooKeeper服务器的先前状态,甚至可以恢复该状态。

LogFormatter类允许管理员查看日志中的事务。

ZooKeeper服务器创建快照和日志文件,但从不删除它们。

数据和日志文件的保留策略是在ZooKeeper服务器外部实现的。服务器本身仅需要最新的完整模糊快照,其后的所有日志文件以及其前的最后一个日志文件。后一项要求是必需的,以包括在启动此快照之后发生的更新,但该更新当时已存在于现有的日志文件中。

之所以可能这样做,是因为在ZooKeeper中,快照的快照和日志的翻转有些独立地进行。

  • 笔记

这些文件中存储的数据未加密。在ZooKeeper中存储敏感数据的情况下,需要采取必要的措施来防止未经授权的访问。这些措施是ZooKeeper的外部措施(例如,控制对文件的访问),并且取决于部署该文件的各个设置。

参考资料

https://zookeeper.apache.org/doc/r3.6.2/zookeeperTutorial.html