ZooKeeper 管理员指南
部署和管理指南
- 部署
- 管理
部署
本部分包含有关部署 Zookeeper 的信息,并涵盖以下主题
前两部分假设您有兴趣在生产环境(如数据中心)中安装 ZooKeeper。最后一部分涵盖您在有限的基础上设置 ZooKeeper 的情况 - 用于评估、测试或开发 - 但不在生产环境中。
系统要求
支持的平台
ZooKeeper 由多个组件组成。一些组件得到广泛支持,而另一些组件仅在较小的一组平台上得到支持。
- 客户端是 Java 客户端库,由应用程序用于连接到 ZooKeeper 集群。
- 服务器是在 ZooKeeper 集群节点上运行的 Java 服务器。
- 本机客户端是用 C 实现的客户端,类似于 Java 客户端,由应用程序用于连接到 ZooKeeper 集群。
- Contrib 指多个可选的附加组件。
下表描述了在不同操作系统平台上运行每个组件的承诺支持级别。
支持矩阵
操作系统 | 客户端 | 服务器 | 本机客户端 | Contrib |
---|---|---|---|---|
GNU/Linux | 开发和生产 | 开发和生产 | 开发和生产 | 开发和生产 |
Solaris | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
FreeBSD | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
Windows | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
Mac OS X | 仅限开发 | 仅限开发 | 不支持 | 不支持 |
对于矩阵中未明确提及为受支持的任何操作系统,组件可能可以工作,也可能无法工作。ZooKeeper 社区将修复针对其他平台报告的明显错误,但不会提供全面支持。
必需的软件
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 服务器,但它们的网线都插入到同一个网络交换机中,那么该交换机的故障将导致您的整个集成中断。
以下是设置将成为集成一部分的服务器的步骤。这些步骤应在集成中的每个主机上执行
-
安装 Java JDK。您可以使用系统的本机打包系统,或从以下位置下载 JDK:http://java.sun.com/javase/downloads/index.jsp
-
设置 Java 堆大小。这非常重要,以避免交换,这会严重降低 ZooKeeper 性能。要确定正确的值,请使用负载测试,并确保您远低于会导致您交换的使用限制。保守一些 - 对于 4GB 机器,使用 3GB 的最大堆大小。
-
安装 ZooKeeper 服务器包。可以从以下位置下载:http://zookeeper.net.cn/releases.html
-
创建一个配置文件。此文件可以称为任何名称。使用以下设置作为起点
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 很直接,对于每台服务器,您需要首先指定一个仲裁端口,然后指定一个用于 ZooKeeper leader 选举的专用端口)。从 ZooKeeper 3.6.0 开始,您还可以为每个 ZooKeeper 服务器实例指定多个地址(当集群中可以并行使用多个物理网络接口时,这可以提高可用性)。您可以通过创建名为 myid 的文件将服务器 ID 分配给每台机器,每个服务器一个,该文件驻留在该服务器的数据目录中,如配置文件参数 dataDir 所指定。
-
myid 文件由单行组成,仅包含该机器 ID 的文本。因此,服务器 1 的 myid 将包含文本“1”且没有其他内容。ID 在集成中必须是唯一的,并且应该在 1 到 255 之间。重要提示:如果您启用了 TTL 节点等扩展功能(见下文),则由于内部限制,ID 必须在 1 到 254 之间。
-
在与 myid 相同的目录中创建一个初始化标记文件 initialize。此文件表示预计一个空数据目录。当存在时,将创建一个空数据库并删除标记文件。当不存在时,一个空数据目录将表示此对等方没有投票权,并且它不会填充数据目录,直到它与一个活动领导者通信。预期用途是仅在启动一个新集成时创建此文件。
-
如果您的配置文件已设置,您可以启动一个 ZooKeeper 服务器
$ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
QuorumPeerMain 启动一个 ZooKeeper 服务器,JMX 管理 bean 也已注册,它允许通过 JMX 管理控制台进行管理。ZooKeeper JMX 文档 包含有关使用 JMX 管理 ZooKeeper 的详细信息。请参阅发行版中包含的脚本 bin/zkServer.sh,以了解启动服务器实例的示例。8. 通过连接到主机来测试您的部署:在 Java 中,您可以运行以下命令来执行简单操作
$ bin/zkCli.sh -server 127.0.0.1:2181
单服务器和开发者设置
如果您想出于开发目的设置 ZooKeeper,您可能希望设置一个 ZooKeeper 的单服务器实例,然后在您的开发机器上安装 Java 或 C 客户端库和绑定。
设置单服务器实例的步骤与上述类似,除了配置文件更简单。您可以在 在单服务器模式下安装和运行 ZooKeeper 部分的 ZooKeeper 入门指南 中找到完整说明。
有关安装客户端库的信息,请参阅 绑定 部分的 ZooKeeper 程序员指南。
管理
本节包含有关运行和维护 ZooKeeper 的信息,并涵盖以下主题
- 设计 ZooKeeper 部署
- 配置
- 需要考虑的事项:ZooKeeper 的优势和局限性
- 管理
- 维护
- 监督
- 监控
- 日志记录
- 故障排除
- 配置参数
- ZooKeeper 命令
- 数据文件管理
- 需要避免的事项
- 最佳实践
设计 ZooKeeper 部署
ZooKeeper 的可靠性基于两个基本假设。
- 部署中只有少数服务器会发生故障。在此上下文中,故障表示机器崩溃,或网络中导致服务器与大多数服务器分区的某些错误。
- 已部署的机器正常运行。正常运行意味着正确执行代码,具有正常工作的时钟,以及具有持续执行的存储和网络组件。
以下部分包含 ZooKeeper 管理员为最大程度地提高这些假设成立的可能性而考虑的事项。其中一些是跨机器考虑的事项,而另一些是您应该为部署中的每台机器考虑的事项。
跨机器要求
对于 ZooKeeper 服务处于活动状态,必须有大多数可以相互通信的非故障机器。对于具有 N 个服务器的 ZooKeeper 集成,如果 N 为奇数,则该集成能够容忍最多 N/2 个服务器故障而不丢失任何 znode 数据;如果 N 为偶数,则该集成能够容忍最多 N/2-1 个服务器故障。
例如,如果我们有一个包含 3 台服务器的 ZooKeeper 集群,则该集群能够容忍最多 1(3/2)台服务器故障。如果我们有一个包含 5 台服务器的 ZooKeeper 集群,则该集群能够容忍最多 2(5/2)台服务器故障。如果包含 6 台服务器的 ZooKeeper 集群,则该集群还能够容忍最多 2(6/2-1)台服务器故障,而不会丢失数据并防止“脑裂”问题。
ZooKeeper 集群通常具有奇数个服务器。这是因为对于偶数个服务器,故障容忍能力与少一台服务器的集群相同(5 节点集群和 6 节点集群均为 2 次故障),但集群必须为一台额外的服务器维护额外的连接和数据传输。
为了实现容忍故障的最高概率,您应该尝试使机器故障独立。例如,如果大多数机器共享同一交换机,则该交换机的故障可能会导致相关故障并导致服务中断。共享电源电路、冷却系统等也适用相同情况。
单机要求
如果 ZooKeeper 必须与其他应用程序争用对存储介质、CPU、网络或内存等资源的访问,则其性能将明显下降。ZooKeeper 具有强大的耐用性保证,这意味着它使用存储介质来记录更改,然后才允许负责更改的操作完成。因此,您应该意识到这种依赖关系,并且如果您希望确保 ZooKeeper 操作不会被您的介质拖延,则需要非常小心。以下是一些可以采取的措施来最大程度地减少这种类型的性能下降
- ZooKeeper 的事务日志必须位于专用设备上。(专用分区还不够。)ZooKeeper 顺序写入日志,而不进行寻址。与其他进程共享日志设备可能会导致寻址和争用,进而可能导致数秒的延迟。
- 不要将 ZooKeeper 置于可能导致交换的情况中。为了让 ZooKeeper 以任何及时性运行,根本不允许它进行交换。因此,请确保提供给 ZooKeeper 的最大堆大小不超过 ZooKeeper 可用的实际内存量。有关此内容的更多信息,请参见下面的应避免的事项。
配置
需要考虑的事项:ZooKeeper 的优势和局限性
管理
维护
ZooKeeper 集群需要很少的长期维护,但您必须了解以下内容
持续数据目录清理
ZooKeeper 数据目录 包含一个持久副本文件,该文件存储了由特定服务集成存储的 znode。这些是快照和事务日志文件。当对 znode 进行更改时,这些更改将附加到事务日志中。有时,当日志增长过大时,所有 znode 的当前状态快照将写入文件系统,并为将来的事务创建一个新的事务日志文件。在快照期间,ZooKeeper 可能会继续将传入的事务附加到旧日志文件中。因此,某些比快照更新的事务可能会出现在快照之前的最后一个事务日志中。
使用默认配置时,ZooKeeper 服务器不会删除旧快照和日志文件(请参阅下面的 autopurge),这是操作员的责任。每个服务环境都不同,因此管理这些文件的需求可能因安装而异(例如备份)。
PurgeTxnLog 实用程序实施了管理员可以使用的一个简单保留策略。API 文档 包含有关调用约定的详细信息(参数等)。
在以下示例中,保留了最后计数的快照及其对应的日志,并删除了其他快照。
java -cp zookeeper.jar:lib/slf4j-api-1.7.30.jar:lib/logback-classic-1.2.10.jar:lib/logback-core-1.2.10.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>
在版本 3.4.0 中引入了快照和相应事务日志的自动清除,可以通过以下配置参数启用:autopurge.snapRetainCount 和 autopurge.purgeInterval。有关更多信息,请参阅下面的 高级配置。
调试日志清理(logback)
请参阅本文档中有关 日志记录 的部分。预计您将使用内置的 logback 功能设置滚动文件追加程序。发行版 tar 中的示例配置文件 conf/logback.xml
提供了一个示例。
监督
您将需要一个监督进程来管理您的每个 ZooKeeper 服务器进程 (JVM)。ZK 服务器被设计为“快速失败”,这意味着如果发生无法恢复的错误,它将关闭(进程退出)。由于 ZooKeeper 服务集群非常可靠,这意味着虽然服务器可能关闭,但整个集群仍然处于活动状态并提供请求服务。此外,由于集群是“自愈”的,因此一旦重新启动,失败的服务器将自动重新加入集成,而无需任何手动交互。
拥有诸如 daemontools 或 SMF 的监督进程(还可使用其他监督进程选项,您可以根据需要选择使用,这里仅举两个示例),管理您的 ZooKeeper 服务器可确保如果进程异常退出,它将自动重新启动并快速重新加入集群。
还建议配置 ZooKeeper 服务器进程,以便在发生 OutOfMemoryError** 时终止并转储其堆。这可以通过分别使用以下参数在 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"
监控
ZooKeeper 服务可以通过三种主要方式之一进行监视
- 命令端口通过使用 4 个字母的单词
- 使用 JMX
- 使用
zkServer.sh status
命令
日志记录
ZooKeeper 使用 SLF4J 版本 1.7 作为其记录基础设施。默认情况下,ZooKeeper 随 LOGBack 一起提供,作为记录后端,但您可以使用您选择的任何其他受支持的记录框架。
ZooKeeper 默认 logback.xml 文件位于 conf 目录中。Logback 要求 logback.xml 位于工作目录(运行 ZooKeeper 的目录)中或可从类路径访问。
有关 SLF4J 的更多信息,请参阅 其手册。
有关 Logback 的更多信息,请参阅 Logback 网站。
故障排除
- 由于文件损坏导致服务器无法启动:由于 ZooKeeper 服务器的事务日志中出现一些文件损坏,服务器可能无法读取其数据库并启动失败。您将在加载 ZooKeeper 数据库时看到一些 IOException。在这种情况下,请确保您的集群中的所有其他服务器都已启动并运行。在命令端口上使用“stat”命令查看它们是否处于良好状态。在验证集群中的所有其他服务器都已启动后,您可以继续清理损坏服务器的数据库。删除 datadir/version-2 和 datalogdir/version-2/ 中的所有文件。重新启动服务器。
配置参数
ZooKeeper 的行为由 ZooKeeper 配置文件控制。此文件的设计目的是,所有组成 ZooKeeper 服务器的服务器都可以使用完全相同的文件,假设磁盘布局相同。如果服务器使用不同的配置文件,则必须小心确保所有不同配置文件中的服务器列表匹配。
注意
在 3.5.0 及更高版本中,其中一些参数应放在动态配置文件中。如果将它们放在静态配置文件中,ZooKeeper 会自动将它们移动到动态配置文件中。有关详细信息,请参阅 动态重新配置。
最小配置
以下是必须在配置文件中定义的最小配置关键字
-
clientPort:侦听客户端连接的端口;即客户端尝试连接的端口。
-
secureClientPort:使用 SSL 侦听安全客户端连接的端口。clientPort 指定纯文本连接的端口,而 secureClientPort 指定 SSL 连接的端口。同时指定两者可启用混合模式,而省略任何一个都将禁用该模式。请注意,当用户将 zookeeper.serverCnxnFactory、zookeeper.clientCnxnSocket 作为 Netty 插件时,SSL 功能将启用。
-
observerMasterPort:侦听观察者连接的端口;即观察者尝试连接的端口。如果设置该属性,则服务器在跟随者模式下除了在领导者模式下之外,还将承载观察者连接,并在观察者模式下相应地尝试连接到任何投票对等方。
-
dataDir:ZooKeeper 将存储内存中数据库快照的位置,除非另有说明,还将存储数据库更新的事务日志。
注意
小心放置事务日志的位置。专用的事务日志设备是持续良好性能的关键。将日志放在繁忙的设备上会对性能产生不利影响。
- tickTime:单个刻度的长度,这是 ZooKeeper 使用的基本时间单位,以毫秒为单位。它用于调节心跳和超时。例如,最小会话超时将为两个刻度。
高级配置
本节中的配置设置是可选的。你可以使用它们来进一步微调 ZooKeeper 服务器的行为。有些还可以使用 Java 系统属性设置,通常采用 zookeeper.keyword 形式。当可用时,确切的系统属性将在下面注明。
- dataLogDir:(无 Java 系统属性) 此选项将指示机器将事务日志写入 dataLogDir 而不是 dataDir。这允许使用专用的日志设备,并有助于避免日志记录和快照之间的竞争。
注意
拥有一个专用日志设备会对吞吐量和稳定延迟产生很大影响。强烈建议专门使用一个日志设备并将 dataLogDir 设置为指向该设备上的一个目录,然后确保将 dataDir 指向不在该设备上的一个目录。
- globalOutstandingLimit :(Java 系统属性:zookeeper.globalOutstandingLimit.)客户端可以比 ZooKeeper 处理它们的速度更快地提交请求,尤其是在有很多客户端时。为了防止 ZooKeeper 因排队的请求而耗尽内存,ZooKeeper 将限制客户端,以便整个集群中最多有 globalOutstandingLimit 个未完成的请求,平均分配。默认限制为 1,000,例如,对于 3 个成员,每个成员将有 1000 / 2 = 500 个单独的限制。
-
preAllocSize :(Java 系统属性:zookeeper.preAllocSize)为了避免寻道,ZooKeeper 以 preAllocSize 千字节的块在事务日志文件中分配空间。默认块大小为 64M。更改块大小的一个原因是,如果更频繁地进行快照,则减小块大小。(另请参阅 snapCount 和 snapSizeLimitInKb)。
-
snapCount :(Java 系统属性:zookeeper.snapCount)ZooKeeper 使用快照和事务日志(认为是预写日志)来记录其事务。在进行快照(并滚动事务日志)之前在事务日志中记录的事务数由 snapCount 确定。为了防止仲裁组中的所有机器同时进行快照,每个 ZooKeeper 服务器将在事务日志中的事务数达到 [snapCount/2+1, snapCount] 范围内的运行时生成的随机值时进行快照。默认的 snapCount 为 100,000。
-
commitLogCount * :(Java 系统属性:zookeeper.commitLogCount)Zookeeper 维护一个最近提交的请求的内存列表,以便在跟随者不太落后时与跟随者快速同步。当您的快照较大(>100,000)时,这会提高同步性能。默认值为 500,这是建议的最小值。
-
snapSizeLimitInKb:(Java 系统属性:zookeeper.snapSizeLimitInKb) ZooKeeper 使用快照和事务日志(认为预写日志)记录其事务。在可以进行快照(并滚动事务日志)之前,事务日志中记录的事务集允许的总大小(以字节为单位)由 snapSize 确定。为了防止仲裁组中的所有机器同时进行快照,每个 ZooKeeper 服务器将在事务日志中的事务集大小(以字节为单位)达到 [snapSize/2+1, snapSize] 范围内的运行时生成的随机值时进行快照。每个文件系统都有一个最小标准文件大小,为了使此功能有效运行,所选数字必须大于该值。默认的 snapSizeLimitInKb 为 4,194,304(4GB)。非正值将禁用此功能。
-
txnLogSizeLimitInKb:(Java 系统属性:zookeeper.txnLogSizeLimitInKb) 还可以使用 txnLogSizeLimitInKb 更直接地控制 Zookeeper 事务日志文件。当使用事务日志进行同步时,较大的 txn 日志会导致跟随者同步速度变慢。这是因为领导者必须扫描磁盘上的相应日志文件以查找要从中开始同步的事务。此功能默认情况下已关闭,snapCount 和 snapSizeLimitInKb 是限制事务日志大小的唯一值。启用后,Zookeeper 将在达到任何限制时滚动日志。请注意,实际日志大小可能会超出此值,具体取决于序列化的事务的大小。另一方面,如果将此值设置得太接近(或小于)preAllocSize,则可能导致 Zookeeper 为每个事务滚动日志。虽然这不是一个正确性问题,但这可能会导致性能严重下降。为了避免这种情况并充分利用此功能,建议将值设置为 N * preAllocSize,其中 N >= 2。
-
maxCnxns: (Java 系统属性:zookeeper.maxCnxns) 限制可与 Zookeeper 服务器建立的并发连接总数(每个服务器的每个客户端端口)。这用于防止某些类型的 DoS 攻击。默认值为 0,将其设置为 0 会完全取消对并发连接总数的限制。serverCnxnFactory 和 secureServerCnxnFactory 的连接数的计算是单独进行的,因此一个对等方允许最多托管 2*maxCnxns,前提是它们是适当的类型。
-
maxClientCnxns: (无 Java 系统属性) 限制单个客户端(由 IP 地址标识)可以与 ZooKeeper 集群的单个成员建立的并发连接数(在套接字级别)。这用于防止某些类型的 DoS 攻击,包括文件描述符耗尽。默认值为 60。将其设置为 0 会完全取消对并发连接的限制。
-
clientPortAddress: 3.3.0 中的新增功能:用于侦听客户端连接的地址(ipv4、ipv6 或主机名);即,客户端尝试连接到的地址。这是可选的,默认情况下,我们以这样的方式绑定,即服务器上任何地址/接口/网卡的任何连接到 clientPort 都将被接受。
-
minSessionTimeout: (无 Java 系统属性) 3.3.0 中的新增功能:服务器允许客户端协商的最小会话超时(以毫秒为单位)。默认为 tickTime 的 2 倍。
-
maxSessionTimeout: (无 Java 系统属性) 3.3.0 中的新增功能:服务器允许客户端协商的最大会话超时(以毫秒为单位)。默认为 tickTime 的 20 倍。
-
fsync.warningthresholdms: (Java 系统属性:zookeeper.fsync.warningthresholdms) 3.3.4 中的新增功能:每当事务日志 (WAL) 中的 fsync 耗时超过此值时,都会向日志输出一条警告消息。该值以毫秒为单位指定,默认为 1000。此值只能作为系统属性设置。
-
maxResponseCacheSize: (Java 系统属性:zookeeper.maxResponseCacheSize) 设置为正整数时,它将确定存储最近读取记录的序列化形式的缓存的大小。有助于节省热门 znode 的序列化成本。指标 response_packet_cache_hits 和 response_packet_cache_misses 可用于将此值调整到给定的工作负载。此功能默认开启,值为 400,设置为 0 或负整数以关闭此功能。
-
maxGetChildrenResponseCacheSize: (Java 系统属性:zookeeper.maxGetChildrenResponseCacheSize) 3.6.0 中的新增功能:类似于 maxResponseCacheSize,但适用于获取子项请求。指标 response_packet_get_children_cache_hits 和 response_packet_get_children_cache_misses 可用于将此值调整到给定的工作负载。此功能默认开启,值为 400,设置为 0 或负整数以关闭此功能。
-
autopurge.snapRetainCount: (无 Java 系统属性) 3.4.0 中的新增功能:启用后,ZooKeeper 自动清除功能将保留 autopurge.snapRetainCount 个最新的快照和相应的的事务日志,分别保留在 dataDir 和 dataLogDir 中,并删除其余部分。默认为 3。最小值为 3。
-
autopurge.purgeInterval:(无 Java 系统属性) 3.4.0 中的新增功能:触发清除任务的时间间隔(以小时为单位)。设置为正整数(1 及以上)以启用自动清除。默认为 0。
-
syncEnabled:(Java 系统属性:zookeeper.observer.syncEnabled) 3.4.6、3.5.0 中的新增功能:现在,观察者默认记录事务并将快照写入磁盘,就像参与者一样。这减少了观察者在重新启动时的恢复时间。设置为“false”以禁用此功能。默认值为“true”
-
extendedTypesEnabled:(仅限 Java 系统属性:zookeeper.extendedTypesEnabled) 3.5.4、3.6.0 中的新增功能:定义为
true
以启用扩展功能,例如创建 TTL 节点。它们默认禁用。重要提示:启用时,由于内部限制,服务器 ID 必须小于 255。 -
emulate353TTLNodes:(仅限 Java 系统属性:zookeeper.emulate353TTLNodes)。3.5.4、3.6.0 中的新增功能:由于 [ZOOKEEPER-2901] (https://issues.apache.org/jira/browse/ZOOKEEPER-2901),在版本 3.5.3 中创建的 TTL 节点在 3.5.4/3.6.0 中不受支持。但是,可以通过 zookeeper.emulate353TTLNodes 系统属性提供一种解决方法。如果您在 ZooKeeper 3.5.3 中使用了 TTL 节点,并且需要保持兼容性,请将 zookeeper.emulate353TTLNodes 设置为
true
,此外还要设置 zookeeper.extendedTypesEnabled。注意:由于该错误,服务器 ID 必须为 127 或更小。此外,最大支持的 TTL 值为1099511627775
,小于 3.5.3 中允许的值(1152921504606846975
) -
watchManagerName:(仅限 Java 系统属性:zookeeper.watchManagerName) 3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加了新的观察者管理器 WatchManagerOptimized,以优化大量使用观察者的用例中的内存开销。此配置用于定义要使用的观察者管理器。目前,我们仅支持 WatchManager 和 WatchManagerOptimized。
-
watcherCleanThreadsNum:(仅限 Java 系统属性:zookeeper.watcherCleanThreadsNum) 3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加了新的观察者管理器 WatchManagerOptimized 将延迟清理死观察者,此配置用于决定在 WatcherCleaner 中使用多少个线程。线程越多,通常意味着清理吞吐量越大。默认值为 2,即使对于大量和连续的会话关闭/重新创建的情况,这也足够好。
-
watcherCleanThreshold :(仅限 Java 系统属性:zookeeper.watcherCleanThreshold)3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加。新的观察程序管理器 WatchManagerOptimized 将延迟清理死观察程序,清理过程相对繁重,批量处理将降低成本并提高性能。此设置用于确定批量大小。默认值为 1000,如果不存在内存或清理速度问题,则无需更改它。
-
watcherCleanIntervalInSeconds :(仅限 Java 系统属性:zookeeper.watcherCleanIntervalInSeconds)3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加。新的观察程序管理器 WatchManagerOptimized 将延迟清理死观察程序,清理过程相对繁重,批量处理将降低成本并提高性能。除了 watcherCleanThreshold 之外,此设置用于在特定时间后清理死观察程序,即使死观察程序不超过 watcherCleanThreshold,这样我们便不会将死观察程序保留在那里太长时间。默认设置为 10 分钟,通常无需更改。
-
maxInProcessingDeadWatchers :(仅限 Java 系统属性:zookeeper.maxInProcessingDeadWatchers)3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加。这用于控制 WatcherCleaner 中可以有多少积压,当达到此数字时,它将减慢将死观察程序添加到 WatcherCleaner 的速度,这反过来又会减慢添加和关闭观察程序的速度,以便我们可以避免 OOM 问题。默认情况下没有限制,您可以将其设置为 watcherCleanThreshold * 1000 等值。
-
bitHashCacheSize :(仅限 Java 系统属性:zookeeper.bitHashCacheSize)3.6.0 中的新增功能:在 ZOOKEEPER-1179 中添加。这是用于确定 BitHashSet 实现中 HashSet 缓存大小的设置。如果没有 HashSet,我们需要使用 O(N) 时间来获取元素,N 是 elementBits 中的位数。但我们需要保持较小的尺寸以确保它不会在内存中花费太多,内存和时间复杂度之间存在权衡。默认值为 10,这似乎是一个相对合理的缓存大小。
-
fastleader.minNotificationInterval :(Java 系统属性:zookeeper.fastleader.minNotificationInterval)领导人选举中两次连续通知检查之间的时间长度的下限。此间隔决定了对等方等待检查选举投票集的时间,并影响选举可以解决的速度。对于长时间的选举,该间隔遵循从配置的最小值(此值)和配置的最大值(fastleader.maxNotificationInterval)开始的退避策略。
-
fastleader.maxNotificationInterval : (Java 系统属性:zookeeper.fastleader.maxNotificationInterval)领导者选举中两次连续通知检查之间的时间长度上限。此时间间隔决定了对等方等待检查选举投票集的时间,并影响选举解决的速度。对于长时间选举,此时间间隔遵循配置的最小值(fastleader.minNotificationInterval)和配置的最大值(此值)的后退策略。
-
connectionMaxTokens : (Java 系统属性:zookeeper.connection_throttle_tokens)3.6.0 中的新增功能:这是调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的速率限制机制,具有可选的概率丢弃功能。此参数定义令牌桶中的最大令牌数。如果设置为 0,则禁用限制。默认值为 0。
-
connectionTokenFillTime : (Java 系统属性:zookeeper.connection_throttle_fill_time)3.6.0 中的新增功能:这是调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的速率限制机制,具有可选的概率丢弃功能。此参数定义以毫秒为单位的时间间隔,在此时间间隔内,令牌桶将重新填充 connectionTokenFillCount 个令牌。默认值为 1。
-
connectionTokenFillCount : (Java 系统属性:zookeeper.connection_throttle_fill_count)3.6.0 中的新增功能:这是调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的速率限制机制,具有可选的概率丢弃功能。此参数定义每隔 connectionTokenFillTime 毫秒添加到令牌桶中的令牌数。默认值为 1。
-
connectionFreezeTime : (Java 系统属性:zookeeper.connection_throttle_freeze_time)3.6.0 中的新增功能:这是调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的速率限制机制,具有可选的概率丢弃功能。此参数定义以毫秒为单位的时间间隔,在此时间间隔内,丢弃概率将得到调整。如果设置为 -1,则禁用概率丢弃。默认值为 -1。
-
connectionDropIncrease :(Java 系统属性:zookeeper.connection_throttle_drop_increase)3.6.0 中的新增功能:这是用于调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的限速机制,具有可选的概率性丢弃。此参数定义要增加的丢弃概率。限制器每隔 connectionFreezeTime 毫秒检查一次,如果令牌存储桶为空,则丢弃概率将增加 connectionDropIncrease。默认值为 0.02。
-
connectionDropDecrease :(Java 系统属性:zookeeper.connection_throttle_drop_decrease)3.6.0 中的新增功能:这是用于调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的限速机制,具有可选的概率性丢弃。此参数定义要减少的丢弃概率。限制器每隔 connectionFreezeTime 毫秒检查一次,如果令牌存储桶中的令牌多于某个阈值,则丢弃概率将减少 connectionDropDecrease。该阈值为 connectionMaxTokens * connectionDecreaseRatio。默认值为 0.002。
-
connectionDecreaseRatio :(Java 系统属性:zookeeper.connection_throttle_decrease_ratio)3.6.0 中的新增功能:这是用于调整服务器端连接限制器的参数之一,该限制器是一种基于令牌的限速机制,具有可选的概率性丢弃。此参数定义减少丢弃概率的阈值。默认值为 0。
-
zookeeper.connection_throttle_weight_enabled :(仅限 Java 系统属性)3.6.0 中的新增功能:限制时是否考虑连接权重。仅在启用连接限制时有用,即 connectionMaxTokens 大于 0。默认值为 false。
-
zookeeper.connection_throttle_global_session_weight :(仅限 Java 系统属性)3.6.0 中的新增功能:全局会话的权重。它是全局会话请求通过连接限制器所需的令牌数。它必须是不小于本地会话权重的正整数。默认值为 3。
-
zookeeper.connection_throttle_local_session_weight :(仅限 Java 系统属性)3.6.0 中的新增功能:本地会话的权重。它是本地会话请求通过连接限制器所需的令牌数。它必须是一个正整数,且不大于全局会话或续订会话的权重。默认值为 1。
-
zookeeper.connection_throttle_renew_session_weight :(仅限 Java 系统属性)3.6.0 中的新增功能:续订会话的权重。它也是重新连接请求通过限制器所需的令牌数。它必须是一个正整数,且不小于本地会话的权重。默认值为 2。
-
clientPortListenBacklog :(无 Java 系统属性)3.4.14、3.5.5、3.6.0 中的新增功能:ZooKeeper 服务器套接字的套接字积压长度。这控制了服务器端排队的请求数,以便由 ZooKeeper 服务器处理。超过此长度的连接将收到网络超时(30 秒),这可能会导致 ZooKeeper 会话过期问题。默认情况下,此值未设置(
-1
),在 Linux 上,它使用50
的积压。此值必须为正数。 -
serverCnxnFactory :(Java 系统属性:zookeeper.serverCnxnFactory)指定 ServerCnxnFactory 实现。应将其设置为
NettyServerCnxnFactory
以便使用基于 TLS 的服务器通信。默认值为NIOServerCnxnFactory
。 -
flushDelay :(Java 系统属性:zookeeper.flushDelay)延迟提交日志刷新所需的时间(以毫秒为单位)。不影响由 maxBatchSize 定义的限制。默认情况下禁用(值为 0)。具有高写入速率的集成可能通过 10-20 毫秒的值看到吞吐量得到改善。
-
maxWriteQueuePollTime :(Java 系统属性:zookeeper.maxWriteQueuePollTime)如果启用了 flushDelay,则这将确定在没有新请求排队时等待刷新的时间量(以毫秒为单位)。默认设置为 flushDelay/3(默认情况下隐式禁用)。
-
maxBatchSize :(Java 系统属性:zookeeper.maxBatchSize)在触发提交日志刷新之前,服务器中允许的事务数。不影响由 flushDelay 定义的限制。默认值为 1000。
-
enforceQuota :(Java 系统属性:zookeeper.enforceQuota)3.7.0 中的新增内容:强制执行配额检查。启用后,如果客户端超过某个 znode 下的总字节数或子节点数配额,服务器将拒绝请求,并强制向客户端回复一个
QuotaExceededException
。默认值为:false。探索 配额功能 以了解更多详细信息。 -
requestThrottleLimit :(Java 系统属性:zookeeper.request_throttle_max_requests)3.6.0 中的新增内容:在 RequestThrottler 开始暂停之前允许的未完成请求的总数。如果设置为 0,则禁用节流。默认值为 0。
-
requestThrottleStallTime :(Java 系统属性:zookeeper.request_throttle_stall_time)3.6.0 中的新增内容:线程可以等待的通知其可以继续处理请求的最长时间(以毫秒为单位)。默认值为 100。
-
requestThrottleDropStale :(Java 系统属性:request_throttle_drop_stale)3.6.0 中的新增内容:启用后,节流器将丢弃过时的请求,而不是将它们发布到请求管道。过时的请求是由现在已关闭的连接发送的请求和/或请求延迟高于 sessionTimeout 的请求。默认值为 true。
-
requestStaleLatencyCheck :(Java 系统属性:zookeeper.request_stale_latency_check)3.6.0 中的新增内容:启用后,如果请求延迟高于其关联的会话超时,则请求被视为过时。默认禁用。
-
requestStaleConnectionCheck :(Java 系统属性:zookeeper.request_stale_connection_check)3.6.0 中的新增内容:启用后,如果请求的连接已关闭,则请求被视为过时。默认启用。
-
zookeeper.request_throttler.shutdownTimeout :(仅限 Java 系统属性)3.6.0 中的新增内容:在强制关闭之前,RequestThrottler 等待请求队列清空的时长(以毫秒为单位)。默认值为 10000。
-
advancedFlowControlEnabled :(Java 系统属性:zookeeper.netty.advancedFlowControl.enabled)根据 ZooKeeper 管道的状态在 netty 中使用精确的流控制以避免直接缓冲区 OOM。它将在 Netty 中禁用 AUTO_READ。
-
enableEagerACLCheck :(仅限 Java 系统属性:zookeeper.enableEagerACLCheck)设置为“true”时,在将请求发送到仲裁之前,启用对每个本地服务器上写请求的急切 ACL 检查。默认值为“false”。
-
maxConcurrentSnapSyncs :(Java 系统属性:zookeeper.leader.maxConcurrentSnapSyncs) 领导者或跟随者可以同时处理的最大快照同步数。默认值为 10。
-
maxConcurrentDiffSyncs :(Java 系统属性:zookeeper.leader.maxConcurrentDiffSyncs) 领导者或跟随者可以同时处理的最大差异同步数。默认值为 100。
-
digest.enabled :(仅限 Java 系统属性:zookeeper.digest.enabled) 3.6.0 中的新增功能:添加了摘要功能,用于在从磁盘加载数据库、追赶和跟随领导者时检测 ZooKeeper 内的数据不一致性,它会根据 adHash 论文中提到的 DataTree 逐步执行哈希检查,该论文在
https://cseweb.ucsd.edu/~daniele/papers/IncHash.pdf
这个想法很简单,DataTree 的哈希值将根据数据集合的变化逐步更新。当领导者准备事务时,它将根据使用公式发生的更改预先计算树的哈希值
current_hash = current_hash + hash(new node data) - hash(old node data)
如果它正在创建一个新节点,则 hash(旧节点数据) 将为 0,如果它是一个删除节点操作,则 hash(新节点数据) 将为 0。
此哈希值将与每个事务关联,以表示将事务应用于数据树后的预期哈希值,它将与原始提案一起发送给跟随者。学习者将在将事务应用于数据树后将实际哈希值与事务中的哈希值进行比较,如果不同,则报告不匹配。
这些摘要值还将与每个事务和磁盘上的快照一起持久化,因此当服务器重新启动并从磁盘加载数据时,它将进行比较并查看是否存在哈希不匹配,这将有助于检测磁盘上的数据丢失问题。
对于实际哈希函数,我们在内部使用 CRC,它不是无冲突哈希函数,但与无冲突哈希相比,它更有效,并且冲突可能性非常非常罕见,并且已经可以满足我们此处的需求。
此功能向后和向前兼容,因此可以安全地进行滚动升级、降级、启用和稍后禁用,而不会出现任何兼容性问题。以下场景已得到涵盖和测试
- 当领导者使用新代码运行而跟随者使用旧代码运行时,摘要将附加到每个事务的末尾,跟随者将仅读取标头和事务数据,事务中的摘要值将被忽略。它不会影响跟随者读取和处理下一个事务。
- 当 leader 运行旧代码而 follower 运行新代码时,摘要不会随事务发送,当 follower 尝试读取摘要时,它将抛出 EOF,该异常会被捕获并妥善处理,摘要值设为 null。
- 使用新代码加载旧快照时,在尝试读取不存在的摘要值时,它将抛出 IOException,该异常会被捕获,摘要将设为 null,这意味着在加载此快照时,我们不会比较摘要,这在滚动升级期间会发生
- 使用旧代码加载新快照时,在反序列化数据树后,它将成功完成,快照文件末尾的摘要值将被忽略
- 带有标志更改的滚动重启场景类似于上面讨论的第 1 和第 2 个场景,如果 leader 启用但 follower 未启用,摘要值将被忽略,follower 在运行期间不会比较摘要;如果 leader 禁用但 follower 启用,follower 将获得 EOF 异常,该异常将被妥善处理。
注意:当前摘要计算排除了 /zookeeper 下的节点,因为 /zookeeper/quota 状态节点中存在潜在的不一致,我们可以在该问题解决后包含该节点。
默认情况下,此功能已启用,设为“false”以禁用它。
-
snapshot.compression.method :(Java 系统属性:zookeeper.snapshot.compression.method)3.6.0 中的新增功能:此属性控制 ZooKeeper 是否在将快照存储在磁盘上之前对其进行压缩(请参阅 ZOOKEEPER-3179)。可能的值为
-
snapshot.trust.empty :(Java 系统属性:zookeeper.snapshot.trust.empty)3.5.6 中的新增功能:此属性控制 ZooKeeper 是否将丢失的快照文件视为无法恢复的致命状态。设为 true 以允许 ZooKeeper 服务器在没有快照文件的情况下恢复。这应该仅在从旧版本的 ZooKeeper(3.4.x,3.5.3 之前)升级期间设置,在该期间 ZooKeeper 可能只有事务日志文件,但没有快照文件。如果在升级期间设置该值,我们建议在升级并重新启动 ZooKeeper 进程后将该值重新设为 false,以便 ZooKeeper 可以在恢复过程中继续正常的 data 一致性检查。默认值为 false。
-
audit.enable :(Java 系统属性:zookeeper.audit.enable)3.6.0 中的新增内容:默认情况下,审核日志处于禁用状态。设置为“true”以启用它。默认值为“false”。有关详细信息,请参阅 ZooKeeper 审核日志。
-
audit.impl.class :(Java 系统属性:zookeeper.audit.impl.class)3.6.0 中的新增内容:用于实现审核记录器的类。默认情况下,使用基于 logback 的审核记录器 org.apache.zookeeper.audit .Slf4jAuditLogger。有关详细信息,请参阅 ZooKeeper 审核日志。
-
largeRequestMaxBytes :(Java 系统属性:zookeeper.largeRequestMaxBytes)3.6.0 中的新增内容:所有正在传输的大请求的最大字节数。如果即将到来的大请求导致超出限制,则将关闭连接。默认值为 100 * 1024 * 1024。
-
largeRequestThreshold :(Java 系统属性:zookeeper.largeRequestThreshold)3.6.0 中的新增内容:将请求视为大请求的尺寸阈值。如果它为 -1,则所有请求都被视为小请求,从而有效地关闭大请求限制。默认值为 -1。
-
outstandingHandshake.limit(仅限 Java 系统属性:zookeeper.netty.server.outstandingHandshake.limit)ZooKeeper 中可能拥有的最大正在传输的 TLS 握手连接,超出此限制的连接将在开始握手之前被拒绝。此设置不会限制最大 TLS 并发性,但有助于避免在存在过多正在传输的 TLS 握手时因 TLS 握手超时而产生的羊群效应。将其设置为大约 250 就足以避免羊群效应。
-
netty.server.earlyDropSecureConnectionHandshakes(Java 系统属性:zookeeper.netty.server.earlyDropSecureConnectionHandshakes)如果 ZooKeeper 服务器尚未完全启动,则在执行 TLS 握手之前丢弃 TCP 连接。这有助于防止在重启后用许多并发 TLS 握手淹没服务器。请注意,如果你启用此标志,则服务器在未完全启动时不会响应“ruok”命令。
丢弃连接的行为已在 ZooKeeper 3.7 中引入,并且无法禁用它。自 3.7.1 和 3.8.0 起,此功能默认禁用。
-
throttledOpWaitTime(Java 系统属性:zookeeper.throttled_op_wait_time)请求在 RequestThrottler 队列中等待的时间,超过此时间,该请求将被标记为已限制。除了馈送到其所属服务器的管道中以保留所有请求的顺序之外,不会处理受限制的请求。FinalProcessor 将针对这些未消化的请求发出错误响应(新错误代码:ZTHROTTLEDOP)。目的是让客户端不要立即重试它们。当设置为 0 时,不会限制任何请求。默认值为 0。
-
learner.closeSocketAsync(Java 系统属性:zookeeper.learner.closeSocketAsync)(Java 系统属性:learner.closeSocketAsync)(为向后兼容而添加)3.7.0 中的新增功能:启用时,学习器将异步关闭仲裁套接字。这对于 TLS 连接很有用,其中关闭套接字可能需要很长时间,从而阻塞关闭进程,可能延迟新的领导者选举,并使仲裁不可用。异步关闭套接字可避免阻塞关闭进程,尽管套接字关闭时间很长,并且可以在关闭套接字时启动新的领导者选举。默认值为 false。
-
leader.closeSocketAsync(Java 系统属性:zookeeper.leader.closeSocketAsync)(Java 系统属性:leader.closeSocketAsync)(为向后兼容而添加)3.7.0 中的新增功能:启用时,领导者将异步关闭仲裁套接字。这对于 TLS 连接很有用,其中关闭套接字可能需要很长时间。如果由于 SyncLimitCheck 失败而在 ping() 中启动断开关注者的连接,则长时间的套接字关闭将阻塞向其他关注者发送 ping。如果不接收 ping,其他关注者将不会向领导者发送会话信息,这会导致会话过期。将此标志设置为 true 可确保定期发送 ping。默认值为 false。
-
learner.asyncSending(Java 系统属性:zookeeper.learner.asyncSending)(Java 系统属性:learner.asyncSending)(为向后兼容而添加)3.7.0 中的新增功能:学习器中的发送和接收数据包在临界区中同步完成。不及时解决的网络问题可能导致关注者挂起(请参阅 ZOOKEEPER-3575 和 ZOOKEEPER-4074)。新设计将学习器中的数据包发送移动到单独的线程,并异步发送数据包。此参数(learner.asyncSending)启用了新设计。默认值为 false。
-
forward_learner_requests_to_commit_processor_disabled(Java 系统属性:zookeeper.forward_learner_requests_to_commit_processor_disabled)设置此属性后,来自学习器的请求不会排入 CommitProcessor 队列,这有助于节省领导者上的资源和 GC 时间。
默认值为 false。
-
serializeLastProcessedZxid.enabled(Java 系统属性:zookeeper.serializeLastProcessedZxid.enabled)3.9.0 中的新增功能:启用时,ZooKeeper 在快照时序列化 lastProcessedZxid,并在还原时对其反序列化。默认为 true。需要启用此功能才能通过管理服务器命令执行快照和还原,因为没有快照文件名来提取 lastProcessedZxid。
此功能向后和向前兼容。以下是不同的方案。
-
由服务器内部触发的快照 a. 在使用新代码加载旧快照时,它将在尝试读取不存在的 lastProcessedZxid 值时抛出 EOFException,并且将捕获该异常。lastProcessedZxid 将使用快照文件名设置。
b. 在使用旧代码加载新快照时,它将在反序列化摘要值后成功完成,快照文件末尾的 lastProcessedZxid 将被忽略。lastProcessedZxid 将使用快照文件名设置。
- 在 leader 和 follower 之间同步 lastProcessedZxid 将不会在新的和旧代码中由 leader 序列化,也不会由 follower 反序列化。它将被设置为通过 QuorumPacket 从 leader 发送的 lastProcessedZxid。
-
通过管理服务器 API 触发的快照 快照命令需要启用功能标志才能工作。
集群选项
本部分中的选项旨在与服务器集成一起使用——即在部署服务器群集时。
- electionAlg :(无 Java 系统属性)要使用的选举实现。“1”值对应于基于 UDP 的快速领导者选举的非认证版本,“2”对应于基于 UDP 的快速领导者选举的认证版本,“3”对应于基于 TCP 的快速领导者选举版本。算法 3 在 3.2.0 中设为默认值,而早期版本(3.0.0 和 3.1.0)也使用算法 1 和 2。
注意
领导者选举 1 和 2 的实现已在 3.4.0 中弃用。自 3.6.0 起,仅 FastLeaderElection 可用,在升级的情况下,您必须关闭所有服务器并使用 electionAlg=3(或从配置文件中删除该行)重新启动它们。>
- maxTimeToWaitForEpoch :(Java 系统属性:zookeeper.leader.maxTimeToWaitForEpoch)3.6.0 中的新增功能:在激活领导者时,从选民处等待 epoch 的最长时间。如果领导者从其一个选民处收到 LOOKING 通知,并且它在 maxTimeToWaitForEpoch 内未从大多数选民处收到 epoch 数据包,则它将转到 LOOKING 并再次选举领导者。可以对其进行调整以减少法定人数或服务器不可用时间,可以将其设置为远小于 initLimit * tickTime。在跨数据中心环境中,可以将其设置为 2 秒左右。
-
initLimit :(无 Java 系统属性)以刻度(请参阅 tickTime)为单位的时间量,允许跟随者连接到领导者并与其同步。如果 ZooKeeper 管理的数据量很大,则根据需要增加此值。
-
connectToLearnerMasterLimit :(Java 系统属性:zookeeper.connectToLearnerMasterLimit)以刻度(请参阅 tickTime)为单位的时间量,允许跟随者在领导者选举后连接到领导者。默认为 initLimit 的值。当 initLimit 较高时使用,这样连接到学习者主服务器不会导致较高的超时。
-
leaderServes :(Java 系统属性:zookeeper.leaderServes)领导者接受客户端连接。默认值为“yes”。领导者机器协调更新。为了以牺牲读取吞吐量为代价提高更新吞吐量,可以将领导者配置为不接受客户端并专注于协调。此选项的默认值为 yes,这意味着领导者将接受客户端连接。
注意
当集群中有多于三个 ZooKeeper 服务器时,强烈建议启用领导者选择。
- server.x=[hostname]:nnnnn[:nnnnn] 等 :(无 Java 系统属性)组成 ZooKeeper 集群的服务器。当服务器启动时,它通过在数据目录中查找文件 myid 来确定自己是哪个服务器。该文件包含 ASCII 格式的服务器编号,并且它应与此设置左侧的 server.x 中的 x 匹配。客户端使用的 ZooKeeper 服务器列表必须与每个 ZooKeeper 服务器拥有的 ZooKeeper 服务器列表相匹配。有两个端口号 nnnnn。第一个跟随者用于连接到领导者,第二个用于领导者选举。如果您想在单台机器上测试多个服务器,则可以使用不同的端口为每个服务器。
从 ZooKeeper 3.6.0 开始,可以为每个 ZooKeeper 服务器指定多个地址(请参阅 ZOOKEEPER-3188)。要启用此功能,您必须将 multiAddress.enabled 配置属性设置为 true。这有助于提高可用性,并为 ZooKeeper 增加网络级弹性。当为服务器使用多个物理网络接口时,ZooKeeper 能够绑定到所有接口,并在出现网络错误时运行时切换到工作接口。可以使用管道('|')字符在配置中指定不同的地址。使用多个地址的有效配置如下所示
server.1=zoo1-net1:2888:3888|zoo1-net2:2889:3889 server.2=zoo2-net1:2888:3888|zoo2-net2:2889:3889 server.3=zoo3-net1:2888:3888|zoo3-net2:2889:3889
注意
启用此功能后,Quorum 协议(ZooKeeper 服务器到服务器协议)将发生变化。用户不会注意到这一点,当有人使用新配置启动 ZooKeeper 集群时,一切都会正常工作。但是,如果旧的 ZooKeeper 集群不支持多地址功能(和新的 Quorum 协议),则无法在滚动升级期间启用此功能并指定多个地址。如果您需要此功能,但还需要从早于3.6.0的 ZooKeeper 集群执行滚动升级,那么您首先需要在不启用多地址功能的情况下执行滚动升级,然后使用multiAddress.enabled 设置为true 且提供了多个地址的新配置进行单独的滚动重启。
- syncLimit :(无 Java 系统属性)允许跟随者与 ZooKeeper 同步的时间量(以刻度为单位,请参见tickTime)。如果跟随者落后于领导者太多,它们将被丢弃。
-
group.x=nnnnn[:nnnnn] :(无 Java 系统属性)启用分层仲裁构造。“x”是一个组标识符,等号“=”后面的数字对应于服务器标识符。赋值的左侧是服务器标识符的冒号分隔列表。请注意,组必须不相交,所有组的并集必须是 ZooKeeper 集成。您可以在此处找到一个示例
-
weight.x=nnnnn :(无 Java 系统属性)与“group”一起使用,在形成仲裁时为服务器分配权重。此类值对应于服务器在投票时的权重。ZooKeeper 的某些部分需要投票,例如领导者选举和原子广播协议。默认情况下,服务器的权重为 1。如果配置定义了组但未定义权重,则将值 1 分配给所有服务器。您可以在此处找到一个示例
-
cnxTimeout :(Java 系统属性:zookeeper.cnxTimeout)设置用于打开领导者选举通知的连接的超时值。仅当您使用 electionAlg 3 时才适用。
注意
默认值为 5 秒。
- quorumCnxnTimeoutMs :(Java 系统属性:zookeeper.quorumCnxnTimeoutMs)设置用于领导者选举通知的连接的读取超时值。仅当您使用 electionAlg 3 时才适用。
注意
默认值为 -1,然后将 syncLimit * tickTime 用作超时。
- standaloneEnabled :(无 Java 系统属性)3.5.0 中的新增功能:当设置为 false 时,可以在复制模式下启动单个服务器,单个参与者可以与观察者一起运行,集群可以重新配置为一个节点,并从一个节点向上。为了向后兼容,默认值为 true。可以使用 QuorumPeerConfig 的 setStandaloneEnabled 方法设置,也可以通过将“standaloneEnabled=false”或“standaloneEnabled=true”添加到服务器的配置文件中来设置。
-
reconfigEnabled : (无 Java 系统属性)3.5.3 中的新增功能:此选项控制 动态重新配置 功能的启用或禁用。启用此功能后,用户可以通过 ZooKeeper 客户端 API 或 ZooKeeper 命令行工具执行重新配置操作,前提是用户有权执行此类操作。禁用此功能后,包括超级用户在内的任何用户都无法执行重新配置。任何重新配置尝试都将返回错误。“reconfigEnabled” 选项可设置为 “reconfigEnabled=false” 或 “reconfigEnabled=true” 以添加到服务器的配置文件,或使用 QuorumPeerConfig 的 setReconfigEnabled 方法。默认值为 false。如果存在,整个集群中每个服务器上的值应一致。如果在某些服务器上将值设置为 true 而在其他服务器上将值设置为 false,则具体行为将根据选为领导者的服务器而有所不同。如果领导者的设置是 “reconfigEnabled=true”,则集群将启用重新配置功能。如果领导者的设置是 “reconfigEnabled=false”,则集群将禁用重新配置功能。因此,建议在集群中的服务器上为 “reconfigEnabled” 设置一致的值。
-
4lw.commands.whitelist : (Java 系统属性:zookeeper.4lw.commands.whitelist)3.5.3 中的新增功能:用户希望使用的逗号分隔的 四字母单词 命令的列表。此列表中必须包含有效的四字母单词命令,否则 ZooKeeper 服务器将不会启用该命令。默认情况下,白名单仅包含 zkServer.sh 使用的“srvr”命令。其他四字母单词命令默认情况下处于禁用状态:尝试使用它们将获得响应“.... 未执行,因为它不在白名单中”。以下是一个配置示例,该示例启用了 stat、ruok、conf 和 isro 命令,同时禁用了其他四字母单词命令
4lw.commands.whitelist=stat, ruok, conf, isro
如果您确实需要默认启用所有四字母单词命令,则可以使用星号选项,这样您不必逐个将每个命令包含在列表中。例如,这将启用所有四字母单词命令
4lw.commands.whitelist=*
-
tcpKeepAlive : (Java 系统属性:zookeeper.tcpKeepAlive)3.5.4 中的新增功能:将此选项设置为 true 会在集群成员用于执行选举的套接字上设置 TCP keepAlive 标志。这将允许集群成员之间的连接在网络基础设施可能中断它们的情况下保持连接。某些 NAT 和防火墙可能会终止或丢失长时间运行或空闲连接的状态。启用此选项依赖于操作系统级别的设置才能正常工作,请查看您操作系统的有关 TCP keepalive 的选项以了解更多信息。默认为 false。
-
clientTcpKeepAlive : (Java 系统属性:zookeeper.clientTcpKeepAlive) 3.6.1 中的新增功能:将此项设置为 true 会在客户端套接字上设置 TCP keepAlive 标志。一些损坏的网络基础设施可能会丢失关闭客户端发送的 FIN 数据包。这些永远不会关闭的客户端套接字会导致操作系统资源泄漏。启用此选项可通过空闲检查终止这些僵尸套接字。启用此选项依赖于操作系统级别的设置才能正常工作,请查看操作系统关于 TCP keepalive 的选项以了解更多信息。默认为 false。请注意它与 tcpKeepAlive 之间的区别。它适用于客户端套接字,而 tcpKeepAlive 适用于集群成员使用的套接字。目前,此选项仅在使用默认
NIOServerCnxnFactory
时可用。 -
electionPortBindRetry : (仅限 Java 系统属性:zookeeper.electionPortBindRetry) 当 Zookeeper 服务器无法绑定领导者选举端口时,此属性设置最大重试次数。此类错误可能是临时的且可恢复的,例如 ZOOKEEPER-3320 中描述的 DNS 问题,或者不可重试的,例如端口已在使用中。对于瞬态错误,此属性可以提高 Zookeeper 服务器的可用性并帮助其自我恢复。默认值为 3。在容器环境中,尤其是在 Kubernetes 中,此值应增加或设置为 0(无限重试)以克服与 DNS 名称解析相关的问题。
-
observer.reconnectDelayMs : (Java 系统属性:zookeeper.observer.reconnectDelayMs) 当观察者失去与领导者的连接时,它将在尝试重新连接到领导者之前等待指定的值,以便整个观察者群不会尝试运行领导者选举并立即重新连接到领导者。默认为 0 毫秒。
-
observer.election.DelayMs : (Java 系统属性:zookeeper.observer.election.DelayMs) 在断开连接后延迟观察者参与领导者选举,以防止在此过程中对投票对等方造成意外的额外负载。默认为 200 毫秒。
-
localSessionsEnabled 和 localSessionsUpgradingEnabled : 3.5 中的新增功能:可选值为 true 或 false。它们的默认值均为 false。通过设置 localSessionsEnabled=true 开启本地会话功能。开启 localSessionsUpgradingEnabled 可以根据需要自动将本地会话升级为全局会话(例如创建临时节点),这仅在启用 localSessionsEnabled 时才重要。
加密、身份验证、授权选项
本节中的选项允许控制服务执行的加密/认证/授权。
除了此页面,您还可以在 程序员指南 中找到有关客户端配置的有用信息。ZooKeeper Wiki 还有关于 ZooKeeper SSL 支持 和 ZooKeeper 的 SASL 认证 的有用页面。
-
DigestAuthenticationProvider.enabled : (Java 系统属性:zookeeper.DigestAuthenticationProvider.enabled) 3.7 中的新增功能:确定是否启用
digest
认证提供程序。为了向后兼容,默认值为 true,但如果未使用,最好禁用此提供程序,因为它可能导致误导性条目出现在审计日志中(参见 ZOOKEEPER-3979) -
DigestAuthenticationProvider.superDigest :(Java 系统属性:zookeeper.DigestAuthenticationProvider.superDigest)默认情况下,此功能已禁用 3.2 中的新增功能:允许 ZooKeeper 集群管理员以“超级”用户身份访问 znode 层次结构。特别是,对于经过身份验证的超级用户,不会执行任何 ACL 检查。org.apache.zookeeper.server.auth.DigestAuthenticationProvider 可用于生成 superDigest,使用一个“super:
”参数调用它。在启动集群的每个服务器时,提供生成的“super:”作为系统属性值。在向 ZooKeeper 服务器(来自 ZooKeeper 客户端)进行身份验证时,传递“digest”方案和“super: ”身份验证数据。请注意,摘要身份验证以纯文本形式将身份验证数据传递到服务器,因此谨慎的做法是仅在本地主机(不在网络上)或通过加密连接使用此身份验证方法。 -
DigestAuthenticationProvider.digestAlg :(Java 系统属性:zookeeper.DigestAuthenticationProvider.digestAlg)3.7.0 中的新增功能:设置 ACL 摘要算法。默认值为:
SHA1
,将来会因安全问题而弃用。在所有服务器中将此属性设置为相同的值。-
如何支持其他更多算法?
-
通过指定以下内容修改
$JAVA_HOME/jre/lib/security/java.security
下的java.security
配置文件:security.provider.<n>=<provider class name>
。For example: set zookeeper.DigestAuthenticationProvider.digestAlg=RipeMD160 security.provider.3=org.bouncycastle.jce.provider.BouncyCastleProvider
-
将 jar 文件复制到
$JAVA_HOME/jre/lib/ext/
。For example: copy bcprov-jdk18on-1.60.jar to $JAVA_HOME/jre/lib/ext/
-
-
如何从一种摘要算法迁移到另一种摘要算法?
-
- 迁移到新算法时,重新生成
superDigest
。
- 迁移到新算法时,重新生成
-
- 为已具有旧算法摘要身份验证的 znode
SetAcl
。
- 为已具有旧算法摘要身份验证的 znode
-
-
-
X509AuthenticationProvider.superUser :(Java 系统属性:zookeeper.X509AuthenticationProvider.superUser)通过 SSL 支持的方式允许 ZooKeeper 集群管理员以“超级”用户身份访问 znode 层次结构。当此参数设置为 X500 主体名称时,只有具有该主体的经过身份验证的客户端才能绕过 ACL 检查,并对所有 znode 拥有完全权限。
-
zookeeper.superUser :(Java 系统属性:zookeeper.superUser)类似于 zookeeper.X509AuthenticationProvider.superUser,但适用于基于 SASL 的登录。它存储了可以以“超级”用户身份访问 znode 层次结构的用户的名称。你可以使用 zookeeper.superUser.[suffix] 表示法指定多个 SASL 超级用户,例如:
zookeeper.superUser.1=...
。 -
ssl.authProvider : (Java 系统属性:zookeeper.ssl.authProvider)指定 org.apache.zookeeper.auth.X509AuthenticationProvider 的子类,用于安全客户端认证。这在不使用 JKS 的证书密钥基础设施中很有用。可能需要扩展 javax.net.ssl.X509KeyManager 和 javax.net.ssl.X509TrustManager 以从 SSL 堆栈获取所需的行为。若要配置 ZooKeeper 服务器以使用自定义提供程序进行认证,请为自定义 AuthenticationProvider 选择一个方案名称,并将属性 zookeeper.authProvider.[scheme] 设置为自定义实现的完全限定类名。这会将提供程序加载到 ProviderRegistry 中。然后设置此属性 zookeeper.ssl.authProvider=[scheme],该提供程序将用于安全认证。
-
zookeeper.ensembleAuthName : (仅限 Java 系统属性:zookeeper.ensembleAuthName)3.6.0 中的新增功能:指定集合的逗号分隔有效名称/别名的列表。客户端可以提供其打算连接的集合名称作为方案“ensemble”的凭据。EnsembleAuthenticationProvider 会根据接收连接请求的集合的名称/别名列表检查凭据。如果凭据不在列表中,则会拒绝连接请求。这可以防止客户端意外连接到错误的集合。
-
sessionRequireClientSASLAuth : (Java 系统属性:zookeeper.sessionRequireClientSASLAuth)3.6.0 中的新增功能:设置为 true 时,ZooKeeper 服务器将只接受已通过 SASL 向服务器进行认证的客户端的连接和请求。未配置 SASL 认证或已配置 SASL 但认证失败(即凭据无效)的客户端将无法与服务器建立会话。在这种情况下,将传递一个类型化错误代码 (-124),Java 和 C 客户端之后会关闭与服务器的会话,而不会进一步尝试重新连接。
此配置是 enforce.auth.enabled=true 和 enforce.auth.scheme=sasl 的简写
默认情况下,此功能处于禁用状态。希望选择加入的用户可以通过将 sessionRequireClientSASLAuth 设置为 true 来启用此功能。
此功能会覆盖
zookeeper.allowSaslFailedClients 选项,因此即使服务器配置为允许 SASL 认证失败的客户端登录,如果启用此功能,客户端也无法与服务器建立会话。 -
enforce.auth.enabled : (Java 系统属性:zookeeper.enforce.auth.enabled)3.7.0 中的新增功能:设置为 true 时,ZooKeeper 服务器将只接受已通过配置的认证方案向服务器进行认证的客户端的连接和请求。可以使用属性 enforce.auth.schemes 配置认证方案。未配置服务器上配置的任何认证方案或已配置但认证失败(即凭据无效)的客户端将无法与服务器建立会话。在这种情况下,将传递一个类型化错误代码 (-124),Java 和 C 客户端之后会关闭与服务器的会话,而不会进一步尝试重新连接。
默认情况下,此功能处于禁用状态。希望加入的用户可以通过将enforce.auth.enabled设置为true来启用此功能。
当enforce.auth.enabled=true且enforce.auth.schemes=sasl时,
zookeeper.allowSaslFailedClients 配置将被覆盖。因此,即使服务器配置为允许未通过 SASL 身份验证的客户端登录,如果启用此功能且使用 sasl 作为身份验证方案,客户端将无法与服务器建立会话。 -
enforce.auth.schemes : (Java 系统属性:zookeeper.enforce.auth.schemes) 3.7.0 中的新增功能:身份验证方案的逗号分隔列表。在执行任何 Zookeeper 操作之前,客户端必须至少使用一种身份验证方案进行身份验证。仅当enforce.auth.enabled为true时才使用此属性。
-
sslQuorum : (Java 系统属性:zookeeper.sslQuorum) 3.5.5 中的新增功能:启用加密仲裁通信。默认值为
false
。启用此功能时,请同时考虑启用leader.closeSocketAsync和learner.closeSocketAsync,以避免在关闭 SSL 连接时与潜在的较长套接字关闭时间相关的问题。 -
ssl.keyStore.location 和 ssl.keyStore.password以及ssl.quorum.keyStore.location和ssl.quorum.keyStore.password : (Java 系统属性:zookeeper.ssl.keyStore.location和zookeeper.ssl.keyStore.password以及zookeeper.ssl.quorum.keyStore.location和zookeeper.ssl.quorum.keyStore.password) 3.5.5 中的新增功能:指定包含用于客户端和仲裁 TLS 连接的本地凭据的 Java 密钥库的文件路径,以及用于解锁该文件的密码。
-
ssl.keyStore.passwordPath和ssl.quorum.keyStore.passwordPath : (Java 系统属性:zookeeper.ssl.keyStore.passwordPath和zookeeper.ssl.quorum.keyStore.passwordPath) 3.8.0 中的新增功能:指定包含密钥库密码的文件路径。从文件中读取密码优先于显式密码属性。
-
ssl.keyStore.type和ssl.quorum.keyStore.type : (Java 系统属性:zookeeper.ssl.keyStore.type和zookeeper.ssl.quorum.keyStore.type) 3.5.5 中的新增功能:指定客户端和仲裁密钥库的文件格式。值:JKS、PEM、PKCS12 或 null(按文件名检测)。默认值:null。3.5.10、3.6.3、3.7.0 中的新增功能:添加了 BCFKS 格式。
-
ssl.trustStore.location 和 ssl.trustStore.password以及ssl.quorum.trustStore.location和ssl.quorum.trustStore.password : (Java 系统属性:zookeeper.ssl.trustStore.location和zookeeper.ssl.trustStore.password以及zookeeper.ssl.quorum.trustStore.location和zookeeper.ssl.quorum.trustStore.password) 3.5.5 中的新增功能:指定包含用于客户端和仲裁 TLS 连接的远程凭据的 Java 信任库的文件路径,以及用于解锁该文件的密码。
-
ssl.trustStore.passwordPath和ssl.quorum.trustStore.passwordPath : (Java 系统属性:zookeeper.ssl.trustStore.passwordPath和zookeeper.ssl.quorum.trustStore.passwordPath) 3.8.0 中的新增功能:指定包含信任库密码的文件路径。从文件中读取密码优先于显式密码属性。
-
ssl.trustStore.type和ssl.quorum.trustStore.type : (Java 系统属性:zookeeper.ssl.trustStore.type和zookeeper.ssl.quorum.trustStore.type) 3.5.5 中的新增功能:指定客户端和仲裁信任库的文件格式。值:JKS、PEM、PKCS12 或 null(按文件名检测)。默认值:null。3.5.10、3.6.3、3.7.0 中的新增功能:添加了 BCFKS 格式。
-
ssl.protocol 和 ssl.quorum.protocol :(Java 系统属性:zookeeper.ssl.protocol 和 zookeeper.ssl.quorum.protocol)3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协商中使用的协议。默认值:TLSv1.3 或 TLSv1.2,具体取决于所使用的 Java 运行时版本。
-
ssl.enabledProtocols 和 ssl.quorum.enabledProtocols :(Java 系统属性:zookeeper.ssl.enabledProtocols 和 zookeeper.ssl.quorum.enabledProtocols)3.5.5 中的新增功能:指定客户端和仲裁 TLS 协商中启用的协议。默认值:TLSv1.3,如果
protocol
属性的值为 TLSv1.3。如果protocol
为 TLSv1.2,则为 TLSv1.2。 -
ssl.ciphersuites 和 ssl.quorum.ciphersuites :(Java 系统属性:zookeeper.ssl.ciphersuites 和 zookeeper.ssl.quorum.ciphersuites)3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协商中使用的已启用密码套件。默认值:已启用的密码套件取决于所使用的 Java 运行时版本。
-
ssl.context.supplier.class 和 ssl.quorum.context.supplier.class :(Java 系统属性:zookeeper.ssl.context.supplier.class 和 zookeeper.ssl.quorum.context.supplier.class)3.5.5 中的新增功能:指定在客户端和仲裁 SSL 通信中用于创建 SSL 上下文的类。这允许你使用自定义 SSL 上下文并实现以下场景
- 使用硬件密钥库,使用 PKCS11 或类似方法加载。
- 你无法访问软件密钥库,但可以从其容器中检索已构建的 SSLContext。默认值:null
-
ssl.hostnameVerification 和 ssl.quorum.hostnameVerification :(Java 系统属性:zookeeper.ssl.hostnameVerification 和 zookeeper.ssl.quorum.hostnameVerification)3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协商过程中是否启用主机名验证。仅建议将其禁用用于测试目的。默认值:true
-
ssl.crl 和 ssl.quorum.crl :(Java 系统属性:zookeeper.ssl.crl 和 zookeeper.ssl.quorum.crl)3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协议中是否启用证书吊销列表。默认值:false
-
ssl.ocsp 和 ssl.quorum.ocsp :(Java 系统属性:zookeeper.ssl.ocsp 和 zookeeper.ssl.quorum.ocsp)3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协议中是否启用在线证书状态协议。默认值:false
-
ssl.clientAuth 和 ssl.quorum.clientAuth :(Java 系统属性:zookeeper.ssl.clientAuth 和 zookeeper.ssl.quorum.clientAuth)在 3.5.5 中添加,但在 3.5.7 之前已损坏:指定从客户端验证 ssl 连接的选项。有效值为
- "none": 服务器不会请求客户端认证
- "want": 服务器将“请求”客户端认证
- "need": 服务器将“要求”客户端认证
默认值:“need”
-
ssl.handshakeDetectionTimeoutMillis 和 ssl.quorum.handshakeDetectionTimeoutMillis :(Java 系统属性:zookeeper.ssl.handshakeDetectionTimeoutMillis 和 zookeeper.ssl.quorum.handshakeDetectionTimeoutMillis)3.5.5 中的新增功能:待定
-
ssl.sslProvider :(Java 系统属性:zookeeper.ssl.sslProvider)3.9.0 中的新增功能:允许在启用 TLS 时在客户端-服务器通信中选择 SSL 提供程序。Netty-tcnative 本机库已在 3.9.0 版中添加到 ZooKeeper 中,这允许我们在受支持的平台上使用本机 SSL 库(如 OpenSSL)。请参阅 Netty-tcnative 文档中的可用选项。默认值为“JDK”。
-
sslQuorumReloadCertFiles :(无 Java 系统属性)3.5.5、3.6.0 中的新增功能:允许在文件系统上的证书更改时重新加载 Quorum SSL keyStore 和 trustStore,而无需重新启动 ZK 进程。默认值:false
-
client.certReload :(Java 系统属性:zookeeper.client.certReload)3.7.2、3.8.1、3.9.0 中的新增功能:允许在文件系统上的证书更改时重新加载客户端 SSL keyStore 和 trustStore,而无需重新启动 ZK 进程。默认值:false
-
client.portUnification:(Java 系统属性:zookeeper.client.portUnification)指定客户端端口应接受 SSL 连接(使用与安全客户端端口相同的配置)。默认值:false
-
authProvider:(Java 系统属性:zookeeper.authProvider)您可以为 ZooKeeper 指定多个认证提供程序类。通常,您使用此参数来指定 SASL 认证提供程序,例如:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
-
kerberos.removeHostFromPrincipal(Java 系统属性:zookeeper.kerberos.removeHostFromPrincipal)您可以在认证期间指示 ZooKeeper 从客户端主体名称中删除主机。(例如,在 ZooKeeper 中,zk/[email protected] 客户端主体将认证为 [email protected])默认值:false
-
kerberos.removeRealmFromPrincipal(Java 系统属性:zookeeper.kerberos.removeRealmFromPrincipal)您可以在认证期间指示 ZooKeeper 从客户端主体名称中删除域。(例如,在 ZooKeeper 中,zk/[email protected] 客户端主体将认证为 zk/myhost)默认值:false
-
kerberos.canonicalizeHostNames(Java 系统属性:zookeeper.kerberos.canonicalizeHostNames)3.7.0 中的新增功能:指示 ZooKeeper 将从 server.x 行中提取的服务器主机名规范化。这允许使用例如
CNAME
记录来引用配置文件中的服务器,同时仍允许 quorum 成员之间的 SASL Kerberos 认证。它本质上是客户端的 zookeeper.sasl.client.canonicalize.hostname 属性的 quorum 等效项。为了向后兼容,默认值为 false。 -
multiAddress.enabled :(Java 系统属性:zookeeper.multiAddress.enabled)3.6.0 中的新增功能:从 ZooKeeper 3.6.0 开始,您还可以为每个 ZooKeeper 服务器实例指定多个地址(当群集中可以并行使用多个物理网络接口时,这可以提高可用性)。将此参数设置为 true 将启用此功能。请注意,如果旧 ZooKeeper 群集的版本低于 3.6.0,则在滚动升级期间无法启用此功能。默认值为 false。
-
multiAddress.reachabilityCheckTimeoutMs : (Java 系统属性:zookeeper.multiAddress.reachabilityCheckTimeoutMs)3.6.0 中的新增内容:自 ZooKeeper 3.6.0 起,您还可以为每个 ZooKeeper 服务器实例指定多个地址(当群集中可以并行使用多个物理网络接口时,这可以提高可用性)。ZooKeeper 将执行 ICMP ECHO 请求或尝试在目标主机的端口 7(回显)上建立 TCP 连接,以查找可访问的地址。仅当您在配置中提供多个地址时才会发生这种情况。在此属性中,您可以设置可访问性检查的超时时间(以毫秒为单位)。该检查对不同的地址并行进行,因此您在此处设置的超时时间是检查所有地址的可访问性所需的最大时间。默认值为 1000。
此参数无效,除非您通过设置 multiAddress.enabled=true 启用多地址功能。
-
fips-mode : (Java 系统属性:zookeeper.fips-mode)3.8.2 中的新增内容:在 ZooKeeper 中启用 FIPS 兼容模式。如果启用,将禁用用于主机名验证的自定义信任管理器 (
ZKTrustManager
),以符合 FIPS 要求。因此,群集协议中不可用主机名验证,但仍可以在客户端-服务器通信中设置。默认值:true(3.9.0+),false(3.8.x)
实验选项/功能
目前被认为是实验性的新功能。
-
只读模式服务器 : (Java 系统属性:readonlymode.enabled)3.4.0 中的新增内容:将此值设置为 true 将启用只读模式服务器支持(默认情况下禁用)。ROM 允许请求 ROM 支持的客户端会话连接到服务器,即使服务器可能与群集分离。在此模式下,ROM 客户端仍然可以从 ZK 服务读取值,但无法写入值和查看其他客户端的更改。有关更多详细信息,请参阅 ZOOKEEPER-784。
-
zookeeper.follower.skipLearnerRequestToNextProcessor : (Java 系统属性:zookeeper.follower.skipLearnerRequestToNextProcessor)当我们的群集具有与 ObserverMaster 连接的观察者时,打开此标志可能有助于您降低 Observer Master 上的某些内存压力。如果您的群集没有任何观察者或它们未与 ObserverMaster 连接,或者您的观察者没有进行太多写入,那么使用此标志将无济于事。目前,此处的更改受标志保护,以帮助我们对内存收益获得更多信心。从长远来看,我们可能希望删除此标志并将其行为设置为默认代码路径。
不安全选项
以下选项可能有用,但使用时请小心。每个选项的风险在变量功能说明中进行了说明。
-
forceSync : (Java 系统属性:zookeeper.forceSync) 要求在完成更新处理之前将更新同步到事务日志的介质。如果此选项设置为否,ZooKeeper 将不要求将更新同步到介质。
-
jute.maxbuffer : (Java 系统属性:jute.maxbuffer)。
- 此选项只能作为 Java 系统属性设置。它没有 zookeeper 前缀。它指定可以存储在 znode 中的最大数据大小。单位:字节。默认值为 0xfffff(1048575) 字节,或略小于 1M。
- 如果更改此选项,则必须在所有服务器和客户端上设置系统属性,否则会出现问题。
- 当客户端中的 jute.maxbuffer 大于服务器端时,客户端希望写入的数据超过服务器端中的 jute.maxbuffer,服务器端将收到 java.io.IOException: Len error
- 当客户端中的 jute.maxbuffer 小于服务器端时,客户端希望读取的数据超过客户端中的 jute.maxbuffer,客户端将收到 java.io.IOException: Unreasonable length 或 Packet len is out of range!
- 这实际上是一种健全性检查。ZooKeeper 设计为存储千字节大小的数据。在生产环境中,不建议将此属性增加到超过默认值,原因如下
- 大尺寸 znode 会导致不合理的延迟峰值,降低吞吐量
- 大尺寸 znode 会使领导者和跟随者之间的同步时间不可预测且不收敛(有时会超时),导致仲裁不稳定
-
jute.maxbuffer.extrasize: (Java 系统属性:zookeeper.jute.maxbuffer.extrasize) 3.5.7 中的新增功能:在处理客户端请求时,ZooKeeper 服务器会在将请求持久化为事务之前向请求中添加一些附加信息。之前,此附加信息的大小固定为 1024 字节。对于许多场景,特别是 jute.maxbuffer 值大于 1 MB 且请求类型为多值的情况,此固定大小是不够的。为了处理所有场景,附加信息的大小从 1024 字节增加到与 jute.maxbuffer 大小相同,并且还可以通过 jute.maxbuffer.extrasize 进行配置。通常不需要配置此属性,因为默认值是最优值。
-
skipACL : (Java 系统属性:zookeeper.skipACL) 跳过 ACL 检查。这会导致吞吐量提升,但会向所有人开放对数据树的完全访问权限。
-
quorumListenOnAllIPs : 设置为 true 时,ZooKeeper 服务器将侦听来自其对等方的所有可用 IP 地址的连接,而不仅仅是配置文件服务器列表中配置的地址。它会影响处理 ZAB 协议和快速领导者选举协议的连接。默认值为 false。
-
multiAddress.reachabilityCheckEnabled : (Java 系统属性:zookeeper.multiAddress.reachabilityCheckEnabled) 3.6.0 中的新增功能:自 ZooKeeper 3.6.0 起,您还可以为每个 ZooKeeper 服务器实例指定多个地址(当集群中可以并行使用多个物理网络接口时,这可以提高可用性)。ZooKeeper 将执行 ICMP ECHO 请求或尝试在目标主机的端口 7(Echo)上建立 TCP 连接,以查找可访问的地址。只有在配置中提供多个地址时才会发生这种情况。如果您遇到一些 ICMP 速率限制(例如在 macOS 上),则可访问性检查可能会失败,此时您尝试在单台机器上启动一个大型(例如 11 个以上的成员)集群以进行测试。
默认值为true。通过将此参数设置为“false”,您可以禁用可达性检查。请注意,禁用可达性检查会导致集群在网络问题期间无法正确地重新配置自身,因此仅在测试期间建议禁用。
此参数无效,除非您通过设置 multiAddress.enabled=true 启用多地址功能。
禁用数据目录自动创建
ZooKeeper 3.5 新增功能:ZooKeeper 服务器的默认行为是在启动时自动创建数据目录(在配置文件中指定),如果该目录不存在。在某些情况下,这可能不方便甚至很危险。以对正在运行的服务器进行配置更改为例,其中dataDir参数被意外更改。当 ZooKeeper 服务器重新启动时,它将创建此不存在的目录并开始提供服务 - 使用空 znode 命名空间。此场景可能导致有效的“脑裂”情况(即新无效目录和原始有效数据存储中的数据)。因此,最好有一个选项来关闭此自动创建行为。通常对于生产环境应该这样做,但不幸的是,默认的旧行为无法在此处更改,因此必须逐案进行。这留给用户和 ZooKeeper 发行版的打包者。
运行zkServer.sh时,可以通过将环境变量ZOO_DATADIR_AUTOCREATE_DISABLE设置为 1 来禁用自动创建。直接从类文件运行 ZooKeeper 服务器时,可以通过在 Java 命令行上设置zookeeper.datadir.autocreate=false来实现此目的,即-Dzookeeper.datadir.autocreate=false
禁用此功能后,如果 ZooKeeper 服务器确定所需的目录不存在,它将生成错误并拒绝启动。
提供了一个新脚本zkServer-initialize.sh来支持此新功能。如果禁用了自动创建,则用户需要先安装 ZooKeeper,然后创建数据目录(以及潜在的 txnlog 目录),然后启动服务器。否则,如前一段所述,服务器将不会启动。运行zkServer-initialize.sh将创建所需的目录,并可以选择设置 myid 文件(可选命令行参数)。即使不使用自动创建功能本身,也可以使用此脚本,并且可能对用户有用,因为这(设置,包括创建 myid 文件)过去一直是用户遇到的问题。请注意,此脚本仅确保数据目录存在,它不会创建配置文件,而是需要一个配置文件才能执行。
启用数据库存在验证
3.6.0 新特性:启动时未找到数据树时,ZooKeeper 服务器的默认行为是将 zxid 设置为零,并作为投票成员加入仲裁组。如果在服务器关闭时某个事件(例如流氓“rm -rf”)删除了数据目录,则这可能很危险,因为此服务器可能帮助选举了一个缺少事务的领导者。启用数据库存在性验证将在启动时更改未找到数据树时的行为:服务器将作为非投票参与者加入集群,直到它能够与领导者同步并获取集群数据的最新版本。为了指示预期一个空数据树(集群创建),用户应将文件“initialize”放在与“myid”相同的目录中。此文件将在启动时被服务器检测到并删除。
直接从类文件运行 ZooKeeper 服务器时,可以通过在 Java 命令行上设置 zookeeper.db.autocreate=false(即 -Dzookeeper.db.autocreate=false)来启用初始化验证。运行 zkServer-initialize.sh 将创建所需的初始化文件。
性能调优选项
3.5.0 新特性:已重新设计多个子系统以提高读取吞吐量。这包括 NIO 通信子系统和请求处理管道(提交处理器)的多线程处理。NIO 是默认的客户端/服务器通信子系统。其线程模型包括 1 个接收器线程、1-N 个选择器线程和 0-M 个套接字 I/O 工作线程。在请求处理管道中,系统可以配置为一次处理多个读取请求,同时保持相同的一致性保证(同一会话的读后写)。提交处理器线程模型包括 1 个主线程和 0-N 个工作线程。
默认值旨在最大化专用 ZooKeeper 机器上的读取吞吐量。这两个子系统都需要有足够数量的线程才能达到峰值读取吞吐量。
-
zookeeper.nio.numSelectorThreads :(仅限 Java 系统属性:zookeeper.nio.numSelectorThreads)3.5.0 新特性:NIO 选择器线程数。至少需要 1 个选择器线程。建议为大量客户端连接使用多个选择器。默认值为 sqrt(cpu 内核数 / 2)。
-
zookeeper.nio.numWorkerThreads :(仅限 Java 系统属性:zookeeper.nio.numWorkerThreads)3.5.0 新特性:NIO 工作线程数。如果配置为 0 个工作线程,则选择器线程将直接执行套接字 I/O。默认值为 cpu 内核数的 2 倍。
-
zookeeper.commitProcessor.numWorkerThreads :(仅限 Java 系统属性:zookeeper.commitProcessor.numWorkerThreads)3.5.0 新特性:提交处理器工作线程数。如果配置为 0 个工作线程,则主线程将直接处理请求。默认值为 cpu 内核数。
-
zookeeper.commitProcessor.maxReadBatchSize :(仅限 Java 系统属性:zookeeper.commitProcessor.maxReadBatchSize)在切换到处理提交之前,从 queuedRequests 处理的最大读取数。如果值 < 0(默认值),则只要有本地写入和待处理提交,我们就进行切换。较高的读取批处理大小会延迟提交处理,导致提供陈旧数据。如果已知读取以固定大小的批处理到达,则将该批处理大小与此属性的值匹配可以平滑队列性能。由于读取是并行处理的,因此一个建议是将此属性设置为与 zookeeper.commitProcessor.numWorkerThread(默认值为 cpu 内核数)匹配或更低。
-
zookeeper.commitProcessor.maxCommitBatchSize :(仅限 Java 系统属性:zookeeper.commitProcessor.maxCommitBatchSize)在处理读取之前要处理的最大提交数。我们将尝试处理尽可能多的远程/本地提交,直到达到此计数。较高的提交批处理大小将在处理更多提交时延迟读取。较低的提交批处理大小将优先考虑读取。建议仅在集群以高提交速率提供工作负载时设置此属性。如果已知写入以一定数量的批处理到达,那么将该批处理大小与该属性的值匹配可以平滑队列性能。一种通用方法是将此值设置为等于集群大小,以便在处理每个批处理时,当前服务器可能会处理与其直接客户端之一相关的写入。默认值为“1”。不支持负值和零值。
-
znode.container.checkIntervalMs :(仅限 Java 系统属性)3.6.0 中的新增功能:候选容器和 ttl 节点的每次检查的时间间隔(以毫秒为单位)。默认值为“60000”。
-
znode.container.maxPerMinute :(仅限 Java 系统属性)3.6.0 中的新增功能:每分钟可删除的容器和 ttl 节点数的最大值。这可以防止在容器删除期间发生群集。默认值为“10000”。
-
znode.container.maxNeverUsedIntervalMs :(仅限 Java 系统属性)3.6.0 中的新增功能:从未有过任何子项的容器保留的最大时间间隔(以毫秒为单位)。应足够长,以便客户端创建容器、执行任何所需工作,然后创建子项。默认值为“0”,用于指示从未有过任何子项的容器永远不会被删除。
调试可观察性配置
3.6.0 中的新增功能:引入了以下选项,以使 zookeeper 更易于调试。
-
zookeeper.messageTracker.BufferSize: (仅限 Java 系统属性)控制存储在 MessageTracker 中的最大消息数。值应为正整数。默认值为 10。MessageTracker 在 3.6.0 中引入,用于在服务器(跟随者或观察者)与领导者断开连接时记录服务器之间最后的一组消息。然后,这组消息将转储到 Zookeeper 的日志文件中,并有助于在断开连接时重建服务器的状态,并且对于调试目的很有用。
-
zookeeper.messageTracker.Enabled: (仅限 Java 系统属性)设置为“true”时,将启用 MessageTracker 来跟踪和记录消息。默认值为“false”。
AdminServer 配置
3.9.0 中的新增功能: 以下选项用于配置 AdminServer。
-
admin.rateLimiterIntervalInMS: (Java 系统属性:zookeeper.admin.rateLimiterIntervalInMS)速率限制管理命令以保护服务器的时间间隔。默认为 5 分钟。
-
admin.snapshot.enabled: (Java 系统属性:zookeeper.admin.snapshot.enabled)启用快照命令的标志。默认为 true。
-
admin.restore.enabled: (Java 系统属性:zookeeper.admin.restore.enabled)启用还原命令的标志。默认为 true。
-
admin.needClientAuth: (Java 系统属性:zookeeper.admin.needClientAuth)控制是否需要客户端身份验证的标志。使用 x509 身份验证需要为 true。默认为 false。
3.7.1 中的新增功能: 以下选项用于配置 AdminServer。
- admin.forceHttps: (Java 系统属性:zookeeper.admin.forceHttps)强制 AdminServer 使用 SSL,从而仅允许 HTTPS 流量。默认为禁用。覆盖 admin.portUnification 设置。
3.6.0 中的新增功能: 以下选项用于配置 AdminServer。
- admin.portUnification: (Java 系统属性:zookeeper.admin.portUnification)启用管理端口以接受 HTTP 和 HTTPS 流量。默认为禁用。
3.5.0 中的新增功能: 以下选项用于配置 AdminServer。
-
admin.enableServer: (Java 系统属性:zookeeper.admin.enableServer)设置为“false”以禁用 AdminServer。默认情况下,AdminServer 处于启用状态。
-
admin.serverAddress: (Java 系统属性:zookeeper.admin.serverAddress)嵌入式 Jetty 服务器侦听的地址。默认为 0.0.0.0。
-
admin.serverPort: (Java 系统属性:zookeeper.admin.serverPort)嵌入式 Jetty 服务器侦听的端口。默认为 8080。
-
admin.idleTimeout: (Java 系统属性:zookeeper.admin.idleTimeout)设置连接在发送或接收数据之前可以等待的最大空闲时间(以毫秒为单位)。默认值为 30000 毫秒。
-
admin.commandURL: (Java 系统属性:zookeeper.admin.commandURL)相对于根 URL 列出和发出命令的 URL。默认值为“/commands”。
指标提供程序
3.6.0 中的新增功能:以下选项用于配置指标。
默认情况下,ZooKeeper 服务器使用 AdminServer 和 Four Letter Words 接口公开有用的指标。
从 3.6.0 开始,您可以配置不同的指标提供程序,该提供程序将指标导出到您最喜欢的系统。
从 3.6.0 开始,ZooKeeper 二进制包捆绑了与 Prometheus.io 的集成。
-
metricsProvider.className:设置为“org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider”以启用 Prometheus.io 导出程序。
-
metricsProvider.httpHost:3.8.0 中的新增功能:Prometheus.io 导出程序将启动 Jetty 服务器并侦听此地址,默认值为“0.0.0.0”。
-
metricsProvider.httpPort:Prometheus.io 导出程序将启动 Jetty 服务器并绑定到此端口,默认值为 7000。Prometheus 端点将为 http://hostname:httPort/metrics。
-
metricsProvider.exportJvmInfo:如果此属性设置为 true,Prometheus.io 将导出有关 JVM 的有用指标。默认值为 true。
-
metricsProvider.numWorkerThreads:3.7.1 中的新增功能:用于报告 Prometheus 摘要指标的 worker 线程数。默认值为 1。如果该数字小于 1,则将使用主线程。
-
metricsProvider.maxQueueSize:3.7.1 中的新增功能:Prometheus 摘要指标报告任务的最大队列大小。默认值为 1000000。
-
metricsProvider.workerShutdownTimeoutMs:3.7.1 中的新增功能:Prometheus worker 线程关闭的超时时间(以毫秒为单位)。默认值为 1000 毫秒。
使用 Netty 框架进行通信
Netty 是一个基于 NIO 的客户端/服务器通信框架,它简化了 Java 应用程序中网络级通信的许多复杂性(直接使用 NIO)。此外,Netty 框架内置了对加密 (SSL) 和身份验证(证书)的支持。这些都是可选功能,可以单独启用或禁用。
在 3.5+ 版本中,ZooKeeper 服务器可以通过将环境变量 zookeeper.serverCnxnFactory 设置为 org.apache.zookeeper.server.NettyServerCnxnFactory 来使用 Netty 而不是 NIO(默认选项);对于客户端,将 zookeeper.clientCnxnSocket 设置为 org.apache.zookeeper.ClientCnxnSocketNetty。
法定人数 TLS
3.5.5 新增
基于 Netty 框架,ZooKeeper 集群可以设置在通信通道中使用 TLS 加密。本部分介绍如何在仲裁通信中设置加密。
请注意,仲裁 TLS 封装了保护领导者选举和仲裁通信协议的安全。
- 创建 SSL 密钥库 JKS 来存储本地证书
应该为每个 ZK 实例创建一个密钥库。
在此示例中,我们生成一个自签名证书,并将其与私钥一起存储在 keystore.jks
中。这适用于测试目的,但在生产环境中,您可能需要官方证书来签署您的密钥。
请注意,别名(-alias
)和专有名称(-dname
)必须与关联的主机的名称匹配,否则主机名验证将不起作用。
keytool -genkeypair -alias $(hostname -f) -keyalg RSA -keysize 2048 -dname "cn=$(hostname -f)" -keypass password -keystore keystore.jks -storepass password
- 从密钥库中提取已签名的公钥(证书)
此步骤可能仅适用于自签名证书。
keytool -exportcert -alias $(hostname -f) -keystore keystore.jks -file $(hostname -f).cer -rfc
- 创建包含所有 ZooKeeper 实例证书的 SSL 信任库 JKS
相同的信任库(存储所有已接受的证书)应在集群的参与者之间共享。您需要使用不同的别名在同一信任库中存储多个证书。别名的名称无关紧要。
keytool -importcert -alias [host1..3] -file [host1..3].cer -keystore truststore.jks -storepass password
- 您需要使用
NettyServerCnxnFactory
作为 serverCnxnFactory,因为 NIO 不支持 SSL。将以下配置设置添加到您的zoo.cfg
配置文件
sslQuorum=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
- 在日志中验证您的集群是否在 TLS 上运行
INFO [main:QuorumPeer@1789] - Using TLS encrypted quorum communication
INFO [main:QuorumPeer@1797] - Port unification disabled
...
INFO [QuorumPeerListener:QuorumCnxManager$Listener@877] - Creating TLS-only quorum server socket
在不中断服务的情况下升级现有的非 TLS 集群
3.5.5 新增
以下是在不中断服务的情况下通过利用端口统一功能将已运行的 ZooKeeper 集群升级到 TLS 所需的步骤。
-
如上一部分所述,为所有 ZK 参与者创建必要的密钥库和信任库
-
添加以下配置设置并重新启动第一个节点
sslQuorum=false
portUnification=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
请注意,TLS 尚未启用,但我们启用了端口统一。
- 对其余节点重复步骤 2。验证您是否在日志中看到了以下条目
INFO [main:QuorumPeer@1791] - Using insecure (non-TLS) quorum communication
INFO [main:QuorumPeer@1797] - Port unification enabled
...
INFO [QuorumPeerListener:QuorumCnxManager$Listener@874] - Creating TLS-enabled quorum server socket
您还应该在每次节点重新启动后仔细检查仲裁是否再次变得正常。
- 在每个节点上启用 Quorum TLS,然后进行滚动重启
sslQuorum=true
portUnification=true
- 一旦验证整个集合在 TLS 上运行,就可以禁用端口统一并进行另一次滚动重启
sslQuorum=true
portUnification=false
ZooKeeper 命令
四字母词
ZooKeeper 响应一组小命令。每个命令由四个字母组成。可以通过 telnet 或 nc 在客户端端口向 ZooKeeper 发出命令。
三个更有趣的命令:“stat”提供有关服务器和连接的客户端的一些一般信息,而“srvr”和“cons”分别提供有关服务器和连接的详细信息。
3.5.3 中的新增功能:在使用之前,必须将四字母单词明确列入白名单。有关详细信息,请参阅 集群配置部分 中描述的 4lw.commands.whitelist。未来,四字母单词将被弃用,请改用 AdminServer。
-
conf : 3.3.0 中的新增功能:打印有关服务配置的详细信息。
-
cons : 3.3.0 中的新增功能:列出连接到此服务器的所有客户端的完整连接/会话详细信息。包括有关接收/发送的数据包数量、会话 ID、操作延迟、执行的上次操作等信息...
-
crst : 3.3.0 中的新增功能:重置所有连接的连接/会话统计信息。
-
dump : 列出未完成的会话和临时节点。
-
envi : 打印有关服务环境的详细信息
-
ruok : 测试服务器是否在无错误状态下运行。当白名单启用 ruok 时,如果服务器正在运行,服务器将响应
imok
,否则它将根本不响应。当禁用 ruok 时,服务器将响应:“ruok 未执行,因为它不在白名单中”。“imok”的响应并不一定表示服务器已加入法定人数,而只是表示服务器进程处于活动状态并绑定到指定的客户端端口。使用“stat”获取有关法定人数和客户端连接信息的状态的详细信息。 -
srst : 重置服务器统计信息。
-
srvr : 3.3.0 中的新增功能:列出服务器的完整详细信息。
-
stat : 列出服务器和连接的客户端的简要详细信息。
-
wchs : 3.3.0 中的新增功能:列出有关服务器监视的简要信息。
-
wchc : 3.3.0 中的新增功能:按会话列出有关服务器监视的详细信息。这会输出具有关联监视(路径)的会话(连接)列表。请注意,根据监视的数量,此操作可能很昂贵(即影响服务器性能),请谨慎使用。
-
dirs : 3.5.1 中的新增功能:显示快照和日志文件的总大小(以字节为单位)
-
wchp : 3.3.0 中的新增功能:按路径列出服务器的详细监视信息。这会输出具有关联会话的路径(znode)列表。请注意,此操作的开销可能较大(即影响服务器性能),具体取决于监视的数量,请谨慎使用。
-
mntr : 3.4.0 中的新增功能:输出可用于监视集群运行状况的变量列表。
$ echo mntr | nc localhost 2185 zk_version 3.4.0 zk_avg_latency 0.7561 - 保留四位小数 zk_max_latency 0 zk_min_latency 0 zk_packets_received 70 zk_packets_sent 69 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 4 zk_watch_count 0 zk_ephemerals_count 0 zk_approximate_data_size 27 zk_followers 4 - 仅由领导者公开 zk_synced_followers 4 - 仅由领导者公开 zk_pending_syncs 0 - 仅由领导者公开 zk_open_file_descriptor_count 23 - 仅在 Unix 平台上可用 zk_max_file_descriptor_count 1024 - 仅在 Unix 平台上可用
输出与 Java 属性格式兼容,并且内容可能会随时间而改变(添加新键)。您的脚本应预期发生更改。注意:某些键是特定于平台的,而某些键仅由领导者导出。输出包含多行,格式如下
key \t value
-
isro : 3.4.0 中的新增功能:测试服务器是否以只读模式运行。如果处于只读模式,服务器将响应“ro”,如果不处于只读模式,则响应“rw”。
-
hash : 3.6.0 中的新增功能:返回与 zxid 关联的树摘要的最新历史记录。
-
gtmk : 以十进制格式获取当前跟踪掩码,为 64 位带符号长值。有关可能值的说明,请参见
stmk
。 -
stmk : 设置当前跟踪掩码。跟踪掩码为 64 位,其中每一位启用或禁用服务器上特定类别的跟踪日志记录。必须首先将 Logback 配置为启用
TRACE
级别,才能查看跟踪日志记录消息。跟踪掩码的位对应于以下跟踪日志记录类别。跟踪掩码位值 0b0000000000 未使用,保留以供将来使用。 0b0000000010 记录客户端请求,但不包括 ping 请求。 0b0000000100 未使用,保留以供将来使用。 0b0000001000 记录客户端 ping 请求。 0b0000010000 记录从当前领导者(群集对等方)接收的数据包,但不包括 ping 请求。 0b0000100000 记录客户端会话的添加、删除和验证。 0b0001000000 记录监视事件传递到客户端会话。 0b0010000000 记录从当前领导者仲裁对等方接收到的 ping 数据包。 0b0100000000 未使用,保留以供将来使用。 0b1000000000 未使用,保留以供将来使用。 64 位值中的所有剩余位未使用,并保留以备将来使用。通过计算记录值的按位 OR 来指定多个跟踪日志记录类别。默认跟踪掩码为 0b0100110010。因此,默认情况下,跟踪日志记录包括客户端请求、从领导者和会话接收的数据包。要设置不同的跟踪掩码,请发送包含
stmk
四个字母的单词的请求,后跟表示为 64 位带符号长值的跟踪掩码。此示例使用 Perlpack
函数来构造一个跟踪掩码,以启用上面描述的所有跟踪日志记录类别,并将其转换为具有大端字节顺序的 64 位带符号长值。结果附加到stmk
并使用 netcat 发送到服务器。服务器以十进制格式响应新的跟踪掩码。$ perl -e "print 'stmk', pack('q>', 0b0011111010)" | nc localhost 2181 250
以下是 ruok 命令的示例
$ echo ruok | nc 127.0.0.1 5111
imok
AdminServer
3.5.0 中的新增功能: AdminServer 是一个嵌入式 Jetty 服务器,它为四个字母的单词命令提供了一个 HTTP 接口。默认情况下,服务器在端口 8080 上启动,通过访问 URL "/commands/[command name]" 来发出命令,例如 http://localhost:8080/commands/stat。命令响应以 JSON 形式返回。与原始协议不同,命令不限于四个字母的名称,并且命令可以有多个名称;例如,“stmk”还可以称为“set_trace_mask”。要查看所有可用命令的列表,请将浏览器指向 URL /commands(例如 http://localhost:8080/commands)。有关如何更改端口和 URL,请参见 AdminServer 配置选项。
AdminServer 默认启用,但可以通过以下方式禁用
- 将 zookeeper.admin.enableServer 系统属性设置为 false。
- 从类路径中删除 Jetty。(如果您想覆盖 ZooKeeper 的 jetty 依赖项,此选项很有用。)
请注意,如果 AdminServer 已禁用,则 TCP 四个字母的单词接口仍然可用。
为 AdminServer 配置 SSL/TLS
- 生成 keystore.jks 和 truststore.jks,它们可以在 仲裁 TLS 中找到。
- 将以下配置设置添加到
zoo.cfg
配置文件
admin.portUnification=true
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
- 验证日志中可以查看以下条目
2019-08-03 15:44:55,213 [myid:] - INFO [main:JettyAdminServer@123] - Successfully loaded private key from /data/software/cert/keystore.jks
2019-08-03 15:44:55,213 [myid:] - INFO [main:JettyAdminServer@124] - Successfully loaded certificate authority from /data/software/cert/truststore.jks
2019-08-03 15:44:55,403 [myid:] - INFO [main:JettyAdminServer@170] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
可用命令包括
-
connection_stat_reset/crst:重置所有客户端连接统计信息。没有返回新字段。
-
configuration/conf/config:打印有关服务配置的基本详细信息,例如客户端端口、数据目录的绝对路径。
-
connections/cons:有关客户端与服务器连接的信息。请注意,根据客户端连接的数量,此操作可能很昂贵(即影响服务器性能)。返回“connections”,一个连接信息对象列表。
-
hash:历史摘要列表中的事务摘要。每 128 个事务记录一个。返回“digests”,一个事务摘要对象列表。
-
dirs:日志文件目录和快照目录大小(以字节为单位)的信息。返回“datadir_size”和“logdir_size”。
-
dump:会话过期和临时会话的信息。请注意,根据全局会话和临时会话的数量,此操作可能开销很大(即影响服务器性能)。返回“expiry_time_to_session_ids”和“session_id_to_ephemeral_paths”作为映射。
-
environment/env/envi:所有已定义的环境变量。每个变量作为其自己的字段返回。
-
get_trace_mask/gtmk:当前跟踪掩码。set_trace_mask 的只读版本。有关更多详细信息,请参阅四字母命令 stmk 的说明。返回“tracemask”。
-
initial_configuration/icfg:打印用于启动对等体的配置文件的文本。返回“initial_configuration”。
-
is_read_only/isro:如果此服务器处于只读模式,则为 true/false。返回“read_only”。
-
last_snapshot/lsnp:Zookeeper 服务器已完成保存到磁盘的上次快照的信息。如果在服务器启动和服务器完成保存其第一个快照之间的初始时间段内调用,则该命令将返回启动服务器时读取的快照信息。返回“zxid”和“timestamp”,后者使用秒为时间单位。
-
leader/lead:如果集合以仲裁模式配置,则发出对等体的当前领导者状态和当前领导者位置。返回“is_leader”、“leader_id”和“leader_ip”。
-
monitor/mntr:发出各种有用的信息以进行监视。包括性能统计信息、有关内部队列的信息以及数据树的摘要(除其他信息外)。每个信息作为其自己的字段返回。
-
observer_connection_stat_reset/orst:重置所有观察者连接统计信息。observers 的配套命令。没有返回新字段。
-
restore/rest:从当前服务器上的快照输入流还原数据库。在响应有效负载中返回以下数据:“last_zxid”:字符串。注意:此 API 受速率限制(默认情况下每 5 分钟一次),以保护服务器免于过载。
-
ruok:无操作命令,检查服务器是否正在运行。响应并不一定表示服务器已加入仲裁,而只是表示管理服务器处于活动状态并绑定到指定的端口。没有返回新字段。
-
set_trace_mask/stmk:设置跟踪掩码(因此,它需要一个参数)。get_trace_mask 的写入版本。有关更多详细信息,请参阅四字母命令 stmk 的说明。返回“tracemask”。
-
server_stats/srvr:服务器信息。返回多个字段,简要概述服务器状态。
-
snapshot/snap:在 datadir 中获取当前服务器的快照并流式传输数据。可选查询参数:“streaming”:布尔值(如果参数不存在,则默认为 true)通过 Http 标头返回以下内容:“last_zxid”:字符串“snapshot_size”:字符串注意:此 API 限流(默认情况下每 5 分钟一次),以防止服务器过载。
-
stats/stat:与 server_stats 相同,但还返回“connections”字段(有关详细信息,请参见 connections)。请注意,根据客户端连接数,此操作可能开销很大(即影响服务器性能)。
-
stat_reset/srst:重置服务器统计信息。这是 server_stats 和 stats 返回的信息的一部分。没有返回新字段。
-
observers/obsr:有关服务器观察者连接的信息。始终在 Leader 上可用,如果其充当学习者主服务器,则在 Follower 上可用。返回“synced_observers”(int)和“observers”(每个观察者属性的列表)。
-
system_properties/sysp:所有已定义的系统属性。返回每个属性作为其自己的字段。
-
voting_view:提供集群中当前的投票成员。将“current_config”作为映射返回。
-
watches/wchc:按会话聚合的监视信息。请注意,根据监视数,此操作可能开销很大(即影响服务器性能)。将“session_id_to_watched_paths”作为映射返回。
-
watches_by_path/wchp:按路径聚合的监视信息。请注意,根据监视数,此操作可能开销很大(即影响服务器性能)。将“path_to_session_ids”作为映射返回。
-
watch_summary/wchs:汇总的监视信息。返回“num_total_watches”、“num_paths”和“num_connections”。
-
zabstate:对等方运行的 Zab 协议的当前阶段以及它是否是投票成员。对等方可以处于以下阶段之一:选举、发现、同步、广播。返回字段“voting”和“zabstate”。
数据文件管理
ZooKeeper 将其数据存储在数据目录中,并将其事务日志存储在事务日志目录中。默认情况下,这两个目录是相同的。可以(并且应该)将服务器配置为将事务日志文件存储在与数据文件不同的目录中。当事务日志驻留在专用日志设备上时,吞吐量增加,延迟减少。
数据目录
此目录中有两个或三个文件
- myid - 包含一个整数,以人类可读的 ASCII 文本表示服务器 ID。
- initialize - 存在表示预期缺少数据树。数据树创建后清理。
- snapshot.
- 保存数据树的模糊快照。
每个 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 服务器的先前状态,甚至恢复该状态。
ZooKeeper 服务器创建快照和日志文件,但从不删除它们。数据和日志文件的保留策略在 ZooKeeper 服务器外部实现。服务器本身仅需要最新的完整模糊快照、其后的所有日志文件以及其前面的最后一个日志文件。后一个要求对于包含在该快照启动后发生但当时进入现有日志文件的更新是必需的。这是可能的,因为在 ZooKeeper 中,快照和日志的滚动是独立进行的。有关设置保留策略和维护 ZooKeeper 存储的详细信息,请参阅本文档中的维护部分。
注意
存储在这些文件中的数据未加密。在 ZooKeeper 中存储敏感数据时,需要采取必要的措施来防止未经授权的访问。此类措施是 ZooKeeper 外部的(例如,控制对文件的访问),并且取决于其部署的各个设置。
恢复 - TxnLogToolkit
更多详细信息,请参阅此处
需要避免的事项
以下是通过正确配置 ZooKeeper 可以避免的一些常见问题
-
不一致的服务器列表:客户端使用的 ZooKeeper 服务器列表必须与每个 ZooKeeper 服务器拥有的 ZooKeeper 服务器列表匹配。如果客户端列表是真实列表的子集,则一切正常,但如果客户端拥有不同 ZooKeeper 集群中的 ZooKeeper 服务器列表,则事情会变得非常奇怪。此外,每个 Zookeeper 服务器配置文件中的服务器列表应彼此一致。
-
事务日志放置不正确:ZooKeeper 中性能最关键的部分是事务日志。ZooKeeper 在返回响应之前将事务同步到媒体。专用事务日志设备是保持良好性能的关键。将日志放在繁忙的设备上会对性能产生不利影响。如果您只有一个存储设备,请增加 snapCount,以便较少生成快照文件;它不能消除问题,但它为事务日志提供了更多资源。
-
不正确的 Java 堆大小 : 您应特别注意正确设置 Java 最大堆大小。特别是,您不应创建 ZooKeeper 交换到磁盘的情况。磁盘对 ZooKeeper 来说是致命的。所有内容都是按顺序排列的,因此如果处理一个请求交换了磁盘,则所有其他排队的请求可能会执行相同操作。磁盘。不要交换。在您的估计中要保守:如果您有 4G 的 RAM,请不要将 Java 最大堆大小设置为 6G 甚至 4G。例如,您更可能为 4G 机器使用 3G 堆,因为操作系统和缓存也需要内存。估计系统所需堆大小的最佳且唯一推荐的做法是运行负载测试,然后确保您远低于会导致系统交换的使用限制。
-
可公开访问的部署 : ZooKeeper 集群应在受信任的计算环境中运行。因此,建议在防火墙后面部署 ZooKeeper。
最佳实践
为了获得最佳结果,请注意以下 Zookeeper 良好做法列表
对于多租户安装,请参阅详细说明 ZooKeeper “chroot” 支持的部分,这在将许多应用程序/服务部署到单个 ZooKeeper 集群时非常有用。