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 服务器是集群的最小推荐大小,我们还建议它们在不同的机器上运行。在雅虎,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 服务器实例指定多个地址(当集群中可以并行使用多个物理网络接口时,这可以提高可用性)。你将服务器 ID 归因于每台机器,方法是创建一个名为 myid 的文件,每个服务器一个,该文件驻留在该服务器的数据目录中,如配置文件参数 dataDir 所指定。
-
myid 文件由单行组成,仅包含该机器 ID 的文本。因此,服务器 1 的 myid 将包含文本“1”和无其他内容。ID 在集合中必须是唯一的,并且应该在 1 到 255 之间。重要提示:如果你启用扩展功能(例如 TTL 节点)(见下文),则由于内部限制,ID 必须在 1 到 254 之间。
-
在与 myid 相同的目录中创建一个初始化标记文件 initialize。此文件表示预期有一个空数据目录。存在时,将创建一个空数据库并删除标记文件。不存在时,空数据目录将表示此对等体没有投票权,并且在与活动 leader 通信之前,它不会填充数据目录。预期用途是在建立新集合时才创建此文件。
-
如果你的配置文件已设置,你可以启动 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)Zookeeper 事务日志文件还可以使用 txnLogSizeLimitInKb 更直接地进行控制。当使用事务日志进行同步时,较大的 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.extendedTypesEnabled 之外,还应将 zookeeper.emulate353TTLNodes 设置为
true
。注意:由于该错误,服务器 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 中的新增功能:启用此功能后,限制器将丢弃过时的请求,而不是将其发送到请求管道。过时的请求是由现在已关闭的连接发送的请求,和/或请求延迟高于会话超时的请求。默认值为 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,它不是无碰撞哈希函数,但与无碰撞哈希相比,它更有效率,并且碰撞可能性非常非常罕见,并且已经可以满足我们这里的需求。
此功能向后和向前兼容,因此可以安全地进行滚动升级、降级、启用和稍后禁用,而不会出现任何兼容性问题。以下是已涵盖和测试的场景
- 当领导者使用新代码运行而关注者使用旧代码运行时,摘要将附加到每个事务的末尾,关注者将只读取头和事务数据,事务中的摘要值将被忽略。它不会影响关注者读取和处理下一个事务。
- 当领导者使用旧代码运行而关注者使用新代码运行时,摘要不会随事务一起发送,当关注者尝试读取摘要时,它将抛出 EOF,该 EOF 被捕获并以将摘要值设置为 null 的方式妥善处理。
- 当使用新代码加载旧快照时,它将在尝试读取不存在的摘要值时抛出 IOException,并且该异常将被捕获,摘要将被设置为 null,这意味着我们在加载此快照时不会比较摘要,这有望在滚动升级期间发生
- 当使用旧代码加载新快照时,它将在反序列化数据树后成功完成,快照文件末尾的摘要值将被忽略
- 带有标志更改的滚动重新启动的场景类似于上面讨论的第 1 和第 2 个场景,如果领导者启用但关注者没有启用,则摘要值将被忽略,并且关注者在运行时不会比较摘要;如果领导者禁用但关注者启用,关注者将获得 EOF 异常,该异常将被妥善处理。
注意:由于 /zookeeper/quota 状态节点中潜在的不一致性,当前摘要计算不包括 /zookeeper 下的节点,我们可以在该问题得到解决后包含该节点。
默认情况下,此功能已启用,设置为“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 可以在恢复过程中继续执行正常的数据一致性检查。默认值为 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 中的新增功能:Learner 中的发送和接收数据包在临界区中同步完成。不及时解决的网络问题可能导致跟随者挂起(请参阅 ZOOKEEPER-3575 和 ZOOKEEPER-4074)。新设计将 Learner 中的发送数据包移至一个单独的线程,并异步发送数据包。此参数 (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 将使用快照文件名设置。
- 领导者和跟随者之间的同步 lastProcessedZxid 将不会在新旧代码中由领导者序列化,也不会由跟随者反序列化。它将设置为通过 QuorumPacket 从领导者发送的 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 集群不支持multiAddress 功能(和新的 Quorum 协议),则无法在滚动升级期间启用此功能并指定多个地址。如果您需要此功能,但还需要从早于3.6.0 的 ZooKeeper 集群执行滚动升级,那么您首先需要在不启用 MultiAddress 功能的情况下执行滚动升级,然后使用新配置进行单独的滚动重启,其中 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.2
-
ssl.enabledProtocols 和 ssl.quorum.enabledProtocols:(Java 系统属性:zookeeper.ssl.enabledProtocols 和 zookeeper.ssl.quorum.enabledProtocols) 3.5.5 中的新增功能:指定在客户端和仲裁 TLS 协商中启用的协议。默认值:
protocol
属性的值 -
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 中的新增功能:允许在文件系统上的证书更改时重新加载法定人数 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 从客户端主体名称中删除主机。(例如,zk/[email protected] 客户端主体将在 ZooKeeper 中作为 [email protected] 进行身份验证)默认值:false
-
kerberos.removeRealmFromPrincipal (Java 系统属性:zookeeper.kerberos.removeRealmFromPrincipal) 可以在身份验证期间指示 ZooKeeper 从客户端主体名称中删除领域。(例如,zk/[email protected] 客户端主体将在 ZooKeeper 中作为 zk/myhost 进行身份验证)默认值:false
-
kerberos.canonicalizeHostNames (Java 系统属性:zookeeper.kerberos.canonicalizeHostNames) 3.7.0 中的新增内容:指示 ZooKeeper 将从 server.x 行中提取的服务器主机名规范化。这允许使用例如
CNAME
记录来引用配置文件中的服务器,同时仍允许法定人数成员之间的 SASL Kerberos 身份验证。它本质上是客户端的 zookeeper.sasl.client.canonicalize.hostname 属性的法定人数等效项。默认值为 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 会使 leader 和 follower 之间的同步时间变得不可预测且不收敛(有时会超时),导致仲裁不稳定
-
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 协议和快速 Leader 选举协议的连接。默认值为 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 启用多地址功能,否则此参数无效。
禁用数据目录自动创建
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”相同的目录中。服务器将在启动时检测并删除此文件。
通过在 Java 命令行上设置 zookeeper.db.autocreate=false,即 -Dzookeeper.db.autocreate=false,可以启用初始化验证,直接从类文件运行 ZooKeeper 服务器。运行 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 的客户端/服务器通信框架,它简化了(直接使用 NIO)Java 应用程序的许多网络级通信复杂性。此外,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
您还应在每次重新启动节点后仔细检查仲裁是否再次变为正常。
- 在每个节点上启用仲裁 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/[命令名称]"(例如,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 四字母单词接口仍然可用。
可用命令包括
-
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 上可用,如果它充当学习者 master。返回“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 协议的当前阶段以及它是否具有投票权。对等方可以处于以下阶段之一:选举、发现、同步、广播。返回字段“投票”和“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 集群时非常有用。