ZooKeeper 管理员指南
部署和管理指南
- 部署
- 行政
部署
本节包含有关部署 Zookeeper 的信息并涵盖以下主题:
前两节假设您有兴趣在生产环境(如数据中心)中安装 ZooKeeper。最后一部分涵盖了您在有限的基础上设置 ZooKeeper 的情况 - 用于评估、测试或开发 - 但不在生产环境中。
系统要求
支持的平台
ZooKeeper 由多个组件组成。某些组件受到广泛支持,而其他组件仅在较小的平台集上受支持。
- Client是 Java 客户端库,应用程序使用它来连接到 ZooKeeper 集成。
- 服务器是在 ZooKeeper 集成节点上运行的 Java 服务器。
- Native Client是用 C 实现的客户端,类似于 Java 客户端,应用程序使用它来连接到 ZooKeeper 集成。
- Contrib是指多个可选的附加组件。
以下矩阵描述了为在不同操作系统平台上运行每个组件而承诺的支持级别。
支持矩阵
操作系统 | 客户 | 服务器 | 本机客户端 | 贡献 |
---|---|---|---|---|
GNU/Linux | 开发和生产 | 开发和生产 | 开发和生产 | 开发和生产 |
索拉里斯 | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
自由BSD | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
视窗 | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
Mac OS X | 仅开发 | 仅开发 | 不支持 | 不支持 |
对于矩阵中未明确提及支持的任何操作系统,组件可能工作也可能不工作。ZooKeeper 社区将修复其他平台报告的明显错误,但没有完全支持。
所需软件
ZooKeeper 在 Java 1.8 或更高版本中运行(JDK 8 LTS、JDK 11 LTS、JDK 12 - 不支持 Java 9 和 10)。它作为ZooKeeper 服务器的集合运行。三个 ZooKeeper 服务器是 ensemble 的最小推荐大小,我们还建议它们在单独的机器上运行。在 Yahoo!,ZooKeeper 通常部署在专用的 RHEL 机器上,具有双核处理器、2GB RAM 和 80GB IDE 硬盘驱动器。
集群(多服务器)设置
对于可靠的 ZooKeeper 服务,您应该将 ZooKeeper 部署在称为ensemble的集群中。只要大多数合奏都启动了,该服务就可以使用。因为 Zookeeper 需要多数,所以最好使用奇数台机器。例如,有四台机器的 ZooKeeper 只能处理单台机器的故障;如果两台机器发生故障,剩下的两台机器不构成多数。但是,使用五台机器 ZooKeeper 可以处理两台机器的故障。
笔记
正如ZooKeeper 入门指南中所述,容错集群设置至少需要三台服务器,强烈建议您拥有奇数台服务器。
通常三台服务器对于生产安装来说绰绰有余,但为了在维护期间获得最大的可靠性,您可能希望安装五台服务器。对于三台服务器,如果您对其中一台执行维护,那么在维护期间您很容易在其他两台服务器中的一台上发生故障。如果您有五个正在运行,您可以将其中一个停机进行维护,并且知道如果其他四个中的一个突然出现故障,您仍然可以。
您的冗余考虑应包括环境的所有方面。如果您有三个 ZooKeeper 服务器,但它们的网络电缆都插入同一个网络交换机,那么该交换机的故障将导致您的整个集群瘫痪。
以下是设置将成为 ensemble 一部分的服务器的步骤。应在 ensemble 中的每个主机上执行这些步骤:
-
安装 Java JDK。您可以为您的系统使用本机打包系统,或从以下网址下载 JDK:http: //java.sun.com/javase/downloads/index.jsp
-
设置 Java 堆大小。这对于避免交换非常重要,这将严重降低 ZooKeeper 的性能。要确定正确的值,请使用负载测试,并确保您远低于会导致您交换的使用限制。保守一点 - 对 4GB 的机器使用 3GB 的最大堆大小。
-
安装 ZooKeeper 服务器包。可从以下网址下载:http: //zookeeper.apache.org/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很简单,对于每个服务器,您需要先指定 Quorum 端口,然后指定 ZooKeeper 领导者选举的专用端口)。从 ZooKeeper 3.6.0 开始,您还可以指定多个地址对于每个 ZooKeeper 服务器实例(当集群中可以并行使用多个物理网络接口时,这可以提高可用性)。您可以通过创建一个名为myid的文件将服务器 ID 分配给每台机器,每个服务器都有一个文件,该文件位于该服务器的数据目录中,由配置文件参数dataDir指定。
-
myid 文件由一行组成,其中仅包含该机器 id 的文本。因此,服务器 1 的myid将包含文本“1”,仅此而已。id 在 ensemble 中必须是唯一的,并且应该具有介于 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 服务处于活动状态,必须有大多数可以相互通信的非故障机器。对于具有 N 个服务器的 ZooKeeper 集成,如果 N 是奇数,则集成能够容忍多达 N/2 个服务器故障而不会丢失任何 znode 数据;如果 N 是偶数,则集成能够容忍多达 N/2-1 个服务器故障。
例如,如果我们有一个包含 3 个服务器的 ZooKeeper 集成,则该集成能够容忍多达 1 (3/2) 个服务器故障。如果我们有一个包含 5 个服务器的 ZooKeeper 集成,那么该集成最多可以容忍 2 (5/2) 个服务器故障。如果 ZooKeeper ensemble 具有 6 个服务器,则该 ensemble 还能够容忍多达 2 (6/2-1) 个服务器故障而不会丢失数据并防止“脑裂”问题。
ZooKeeper ensemble 通常有奇数个服务器。这是因为对于偶数的服务器,容错能力与少一台服务器的 ensemble 相同(5 节点 ensemble 和 6 节点 ensemble 都发生 2 次故障),但 ensemble 必须保持额外的连接和多台服务器的数据传输。
为了最大程度地容忍故障,您应该尝试使机器故障独立。例如,如果大多数机器共享同一个交换机,则该交换机的故障可能会导致相关故障并导致服务中断。共享电源电路、冷却系统等也是如此。
单机要求
如果 ZooKeeper 必须与其他应用程序竞争访问存储介质、CPU、网络或内存等资源,其性能将受到显着影响。ZooKeeper 具有强大的持久性保证,这意味着它在负责更改的操作被允许完成之前使用存储介质记录更改。你应该意识到这种依赖关系,如果你想确保 ZooKeeper 操作不会被你的媒体阻止,请务必小心。您可以采取以下措施来最大程度地减少这种退化:
- ZooKeeper 的事务日志必须在专用设备上。(一个专用的分区是不够的。) ZooKeeper 顺序写入日志,而不是寻找 与其他进程共享您的日志设备可能会导致寻找和争用,这反过来又会导致多秒延迟。
- 不要将 ZooKeeper 置于可能导致交换的情况下。为了让 ZooKeeper 以任何形式的及时性运行,它根本不允许交换。因此,请确保分配给 ZooKeeper 的最大堆大小不大于 ZooKeeper 可用的实际内存量。有关这方面的更多信息,请参阅下面要避免的事情。
供应
需要考虑的事项:ZooKeeper 的优势和局限性
管理
维护
ZooKeeper 集群几乎不需要长期维护,但是您必须注意以下几点:
正在进行的数据目录清理
ZooKeeper数据目录包含文件,这些文件是由特定服务集成存储的 znode 的持久副本。这些是快照和事务日志文件。随着对 znode 的更改,这些更改将附加到事务日志中。偶尔,当日志变大时,所有znode当前状态的快照将被写入文件系统,并为将来的事务创建一个新的事务日志文件。在快照期间,ZooKeeper 可能会继续将传入事务附加到旧日志文件。因此,一些比快照更新的事务可能会在快照之前的最后一个事务日志中找到。
ZooKeeper 服务器在使用默认配置时不会删除旧的快照和日志文件(参见下面的自动清除),这是操作员的责任。每个服务环境都不同,因此管理这些文件的要求可能因安装而异(例如备份)。
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 服务器可确保如果进程确实异常退出,它将自动重新启动并快速重新加入集群。
如果发生 OutOfMemoryError**,还建议配置 ZooKeeper 服务器进程以终止并转储其堆。这是通过分别在 Linux 和 Windows 上使用以下参数启动 JVM 来实现的。ZooKeeper 附带的zkServer.sh和zkServer.cmd脚本设置了这些选项。
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'
"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"
监控
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。在这种情况下,请确保您的 ensemble 中的所有其他服务器都已启动并正常工作。在命令端口上使用“stat”命令查看它们是否健康。在您确认 ensemble 的所有其他服务器都已启动后,您可以继续清理损坏服务器的数据库。删除 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。
-
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 确定。为了防止 quorum 中的所有机器同时拍摄快照,每个 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 或主机名);即客户端尝试连接的地址。这是可选的,默认情况下,我们以这样一种方式绑定,即服务器上任何地址/接口/nic 的任何到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 自动清除功能会分别在dataDir和dataLogDir中保留autopurge.snapRetainCount最近的快照和相应的事务日志,并删除其余部分。默认为 3。最小值为 3。
-
autopurge.purgeInterval:(无 Java 系统属性)3.4.0 中的新功能:必须触发清除任务的时间间隔(以小时为单位)。设置为正整数(1 及以上)以启用自动清除。默认为 0。
-
syncEnabled:(Java 系统属性:zookeeper.observer.syncEnabled) 3.4.6、3.5.0中的新功能:观察者现在记录事务并将快照写入磁盘,默认情况下与参与者一样。这减少了观察者在重启时的恢复时间。设置为“false”以禁用此功能。默认为“真”
-
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。注意:由于该错误,服务器 ID 必须为 127 或更少。此外,最大支持 TTL 值小于 3.5.3 中允许的值 ( )
true
1099511627775
1152921504606846975
-
watchManagerName:(仅限 Java 系统属性:zookeeper.watchManagerName)3.6.0 中的新功能:在ZOOKEEPER-1179中添加新的 watcher manager WatchManagerOptimized 被添加以优化繁重的 watch 用例中的内存开销。此配置用于定义要使用的观察者管理器。目前,我们只支持 WatchManager 和 WatchManagerOptimized。
-
watcherCleanThreadsNum:(仅限 Java 系统属性:zookeeper.watcherCleanThreadsNum)3.6.0 中的新功能:在ZOOKEEPER-1179中添加新的观察者管理器 WatchManagerOptimized 将懒惰地清理死掉的观察者,此配置用于决定 WatcherCleaner 中使用了多少线程. 更多线程通常意味着更大的清理吞吐量。默认值为 2,即使对于繁重且连续的会话关闭/重新创建情况也足够好。
-
watcherCleanThreshold : (Java 系统属性: zookeeper.watcherCleanThreshold ) 3.6.0新增: 在ZOOKEEPER-1179中添加新的 watcher manager WatchManagerOptimized 会懒惰地清理死掉的 watchers,清理过程比较繁重,批处理会降低成本和提高性能。此设置用于决定批量大小。默认是 1000,如果没有内存或清理速度问题,我们不需要更改它。
-
watcherCleanIntervalInSeconds:(仅限Java系统属性:zookeeper.watcherCleanIntervalInSeconds)3.6.0 新:ZOOKEEPER-1179中添加新的 watcher manager WatchManagerOptimized 会懒惰地清理死掉的 watchers,清理过程比较繁重,批处理会降低成本和提高性能。除了 watcherCleanThreshold 之外,这个设置用于在一定时间后清理死掉的 watchers,即使死掉的 watchers 不大于 watcherCleanThreshold,这样我们就不会把死掉的 watchers 留在那里太久。默认设置为 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)领导选举的两次连续通知检查之间的时间长度的下限。这个时间间隔决定了对等节点等待检查选举投票集的时间,并影响选举解决的速度。间隔遵循从配置的最小值 (this) 和配置的最大值 (fastleader.maxNotificationInterval) 的退避策略,以进行长选举。
-
fastleader.maxNotificationInterval:(Java 系统属性:zookeeper.fastleader.maxNotificationInterval)领导选举的两次连续通知检查之间的时间长度上限。这个时间间隔决定了对等节点等待检查选举投票集的时间,并影响选举解决的速度。间隔遵循从配置的最小值 (fastleader.minNotificationInterval) 和配置的最大值 (this) 的退避策略进行长选举。
-
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 中的新功能:强制执行配额检查。当启用并且客户端超过总字节数或子节点计数硬配额时,服务器将拒绝请求并
QuotaExceededException
强制回复客户端。默认值为:假。探索配额功能以获取更多详细信息。 -
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 的请求。默认值为真。
-
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)在netty中根据ZooKeeper管道的状态使用精确的流量控制,避免直接缓冲区OOM。它将禁用 Netty 中的 AUTO_READ。
-
enableEagerACLCheck:(仅限 Java 系统属性:zookeeper.enableEagerACLCheck)当设置为“true”时,在将请求发送到仲裁之前,对每个本地服务器上的写入请求启用即时 ACL 检查。默认为“假”。
-
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 的哈希值会根据数据集的变化增量更新。当领导者准备 txn 时,它会根据公式发生的变化预先计算树的哈希:
current_hash = current_hash + hash(new node data) - hash(old node data)
如果它正在创建一个新节点,则哈希(旧节点数据)将为 0,如果它是删除节点操作,则哈希(新节点数据)将为 0。
在将 txn 应用于数据树后,该哈希将与每个 txn 相关联,以表示预期的哈希值,并将其与原始提案一起发送给追随者。学习者将 txn 应用到数据树后,将实际的哈希值与 txn 中的哈希值进行比较,如果不匹配则报告不匹配。
这些摘要值也将与每个 txn 和快照一起保存在磁盘上,因此当服务器重新启动并从磁盘加载数据时,它会比较并查看是否存在哈希不匹配,这将有助于检测磁盘上的数据丢失问题。
对于实际的hash函数,我们内部使用的是CRC,它不是无碰撞的hash函数,但是相比无碰撞的hash,效率更高,而且碰撞的可能性真的非常少,已经可以满足我们这里的需求了。
此功能向后和向前兼容,因此它可以安全地滚动升级、降级、启用和稍后禁用,而不会出现任何兼容问题。以下是已经涵盖和测试的场景:
- 当leader使用新代码运行而follower使用旧代码运行时,摘要将附加到每个txn的末尾,follower只会读取header和txn数据,txn中的摘要值将被忽略。它不会影响follower读取和处理下一个txn。
- 当leader使用旧代码运行而follower使用新代码运行时,摘要不会与txn一起发送,当follower尝试读取摘要时,它将抛出EOF,该EOF被优雅地捕获并处理,摘要值设置为null。
- 用新代码加载旧快照时,尝试读取不存在的摘要值时会抛出 IOException,并且会捕获异常并将摘要设置为空,这意味着我们在加载此快照时不会比较摘要,预计在滚动升级期间发生
- 使用旧代码加载新快照时,反序列化数据树后会成功完成,快照文件末尾的摘要值将被忽略
- 更改标志滚动重启的场景类似于上面讨论的第一种和第二种场景,如果领导者启用但跟随者没有,则摘要值将被忽略,并且跟随者不会在运行时比较摘要;如果领导者禁用但追随者启用,追随者将获得EOF异常,该异常会被优雅地处理。
注意:由于 /zookeeper/quota stat 节点可能存在不一致,当前摘要计算排除了 /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 可能只有事务日志文件但不存在快照文件。如果在升级过程中设置了该值,我们建议升级后将该值设置回false并重新启动ZooKeeper进程,以便ZooKeeper在恢复过程中可以继续正常的数据一致性检查。默认值为假。
-
audit.enable:(Java 系统属性:zookeeper.audit.enable)3.6.0 中的新功能:默认情况下禁用审核日志。设置为“true”以启用它。默认值为“假”。有关更多信息,请参阅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。
-
standingHandshake.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 连接很有用。尽管套接字关闭时间很长,但异步关闭套接字可以避免阻塞关闭过程,并且可以在套接字关闭时开始新的领导者选举。默认值为假。
-
leader.closeSocketAsync(Java 系统属性:zookeeper.leader.closeSocketAsync)(Java 系统属性:leader.closeSocketAsync)(为向后兼容而添加)3.7.0 中的新增功能:启用后,领导者将异步关闭仲裁套接字。这对于关闭套接字可能需要很长时间的 TLS 连接很有用。如果由于 SyncLimitCheck 失败而在 ping() 中启动了断开跟随者的连接,则较长的套接字关闭时间将阻止向其他跟随者发送 ping。在没有收到 ping 的情况下,其他追随者不会向领导者发送会话信息,这会导致会话过期。将此标志设置为 true 可确保定期发送 ping。默认值为假。
-
learner.asyncSending(Java 系统属性:zookeeper.learner.asyncSending)(Java 系统属性:learner.asyncSending)(为向后兼容而添加)3.7.0 中的新功能: Learner 中的发送和接收数据包在关键部分同步完成。不及时的网络问题可能会导致关注者挂起(请参阅ZOOKEEPER-3575和ZOOKEEPER-4074)。新设计将 Learner 中的发送数据包移动到单独的线程并异步发送数据包。使用此参数 (learner.asyncSending) 启用新设计。默认值为假。
-
forward_learner_requests_to_commit_processor_disabled (Java 系统属性:zookeeper.forward_learner_requests_to_commit_processor_disabled ) 设置此属性后,learner 的请求不会被排入 CommitProcessor 队列,这将有助于节省 leader 的资源和 GC 时间。
默认值为假。
集群选项
本节中的选项设计用于服务器集合——即部署服务器集群时。
- electionAlg:(无 Java 系统属性)要使用的选举实现。“1”对应非认证的基于UDP的快速leader选举版本,“2”对应认证的基于UDP的快速leader选举版本,“3”对应基于TCP的快速leader版本选举。算法 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 的最长时间。如果leader从它的一个投票者那里收到一个LOOKING通知,并且在maxTimeToWaitForEpoch内没有收到来自多数的epoch包,那么它将转到LOOKING并再次选举leader。这可以调整以减少仲裁或服务器不可用时间,它可以设置为比 initLimit * tickTime 小得多。在跨数据中心环境中,可以设置为 2s 之类的。
-
initLimit:(无 Java 系统属性)允许追随者连接并同步到领导者的时间量,以滴答为单位(请参阅滴答时间)。如果 ZooKeeper 管理的数据量很大,则根据需要增加此值。
-
connectToLearnerMasterLimit:(Java 系统属性:zookeeper.connectToLearnerMasterLimit )允许跟随者在领导者选举后连接到领导者的时间量,以滴答为单位(参见tickTime )。默认为 initLimit 的值。当 initLimit 很高时使用,因此连接到学习者主服务器不会导致更高的超时。
-
leaderServes:(Java 系统属性:zookeeper.leaderServes ) Leader 接受客户端连接。默认值为“是”。领导机器坐标更新。为了以轻微的读取吞吐量为代价获得更高的更新吞吐量,可以将领导者配置为不接受客户端并专注于协调。此选项的默认值为 yes,这意味着领导者将接受客户端连接。
笔记
当您在一个 ensemble 中拥有三个以上 ZooKeeper 服务器时,强烈建议启用领导者选择。
- server.x=[hostname]:nnnnn[:nnnnn] 等:(无 Java 系统属性)组成 ZooKeeper 集合的服务器。当服务器启动时,它通过在数据目录中查找文件myid来确定它是哪个服务器。该文件包含 ASCII 格式的服务器编号,它应该与此设置左侧的server.x中的x匹配。客户端使用的组成 ZooKeeper 服务器的服务器列表必须与每个 ZooKeeper 服务器拥有的 ZooKeeper 服务器列表匹配。有两个端口号nnnnn。第一个follower用于连接leader,第二个用于leader选举。如果您想在一台机器上测试多个服务器,则可以为每个服务器使用不同的端口。
从 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 Server-Server 协议)将发生变化。用户不会注意到这一点,当有人使用新配置启动 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 系统属性)与“组”一起使用,它在形成仲裁时为服务器分配权重。这样的值对应于投票时服务器的权重。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 方法。默认值为假。如果存在,该值应该在整个集成中的每个服务器上保持一致。在某些服务器上将该值设置为 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
。 -
选举端口绑定重试:(仅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:
”。提供生成的“超级:" 作为启动 ensemble 的每个服务器时的系统属性值。当向 ZooKeeper 服务器(从 ZooKeeper 客户端)进行身份验证时,传递“digest”方案和“super: "。请注意,digest auth 以明文形式将 authdata 传递给服务器,谨慎的做法是仅在 localhost(而不是通过网络)或加密连接上使用此身份验证方法。 -
DigestAuthenticationProvider.digestAlg:(Java 系统属性:zookeeper.DigestAuthenticationProvider.digestAlg)3.7.0 新功能:设置 ACL 摘要算法。默认值为:
SHA1
将来会因安全问题而弃用。在所有服务器中将此属性设置为相同的值。-
如何支持其他更多算法?
-
通过指定修改
java.security
配置文件$JAVA_HOME/jre/lib/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-jdk15on-1.60.jar to $JAVA_HOME/jre/lib/ext/
-
-
如何从一种摘要算法迁移到另一种?
-
superDigest
迁移到新算法时重新生成。
-
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 中的新功能:指定一个以逗号分隔的有效名称/别名列表。客户端可以提供它打算连接的集合名称作为方案“集合”的凭据。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 and ssl.keyStore.password and ssl.quorum.keyStore.location and ssl.quorum.keyStore.password : (Java系统属性:zookeeper.ssl.keyStore.location and zookeeper.ssl.keyStore.password and zookeeper .ssl.quorum.keyStore.location和zookeeper.ssl.quorum.keyStore.password ) 3.5.5 中的新功能:指定 Java 密钥库的文件路径,其中包含用于客户端和仲裁 TLS 连接的本地凭据以及密码解锁文件。
-
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(按文件名检测)。默认值:空。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 中的新功能:指定 Java 信任库的文件路径,其中包含要用于客户端和仲裁 TLS 连接的远程凭据以及密码解锁文件。
-
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(按文件名检测)。默认值:空。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。默认值:空
-
ssl.hostnameVerification和ssl.quorum.hostnameVerification:(Java 系统属性:zookeeper.ssl.hostnameVerification和zookeeper.ssl.quorum.hostnameVerification)3.5.5 中的新功能:指定是否在客户端和仲裁 TLS 协商过程中启用主机名验证。仅建议出于测试目的禁用它。默认值:真
-
ssl.crl和ssl.quorum.crl:(Java 系统属性:zookeeper.ssl.crl和zookeeper.ssl.quorum.crl)3.5.5 中的新功能:指定是否在客户端和仲裁 TLS 协议中启用证书吊销列表。默认值:假
-
ssl.ocsp和ssl.quorum.ocsp:(Java 系统属性:zookeeper.ssl.ocsp和zookeeper.ssl.quorum.ocsp)3.5.5 中的新功能:指定是否在客户端和仲裁 TLS 协议中启用在线证书状态协议。默认值:假
-
ssl.clientAuth和ssl.quorum.clientAuth:(Java 系统属性:zookeeper.ssl.clientAuth和zookeeper.ssl.quorum.clientAuth)在 3.5.5 中添加,但在 3.5.7 之前中断:指定用于验证来自客户端的 ssl 连接的选项. 有效值为
- "none":服务器不会请求客户端认证
- “want”:服务器将“请求”客户端身份验证
- “需要”:服务器将“要求”客户端身份验证
默认值:“需要”
-
ssl.handshakeDetectionTimeoutMillis和ssl.quorum.handshakeDetectionTimeoutMillis:(Java 系统属性:zookeeper.ssl.handshakeDetectionTimeoutMillis和zookeeper.ssl.quorum.handshakeDetectionTimeoutMillis)3.5.5 中的新功能:待定
-
client.portUnification:(Java 系统属性:zookeeper.client.portUnification)指定客户端端口应该接受 SSL 连接(使用与安全客户端端口相同的配置)。默认值:假
-
authProvider:(Java 系统属性:zookeeper.authProvider)您可以为 ZooKeeper 指定多个身份验证提供程序类。通常您使用此参数来指定 SASL 身份验证提供程序,例如:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
-
kerberos.removeHostFromPrincipal(Java 系统属性:zookeeper.kerberos.removeHostFromPrincipal)您可以指示 ZooKeeper 在身份验证期间从客户端主体名称中删除主机。(例如 zk/myhost@EXAMPLE.COM 客户端主体将在 ZooKeeper 中作为 zk@EXAMPLE.COM 进行身份验证)默认值:false
-
kerberos.removeRealmFromPrincipal(Java 系统属性:zookeeper.kerberos.removeRealmFromPrincipal)您可以指示 ZooKeeper 在身份验证期间从客户端主体名称中删除领域。(例如 zk/myhost@EXAMPLE.COM 客户端主体将在 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(Echo)上建立 TCP 连接,以找到可到达的地址。仅当您在配置中提供多个地址时才会发生这种情况。在此属性中,您可以设置可达性检查的超时时间(以毫秒为单位)。检查对不同的地址并行进行,因此您在此处设置的超时是检查所有地址的可达性所花费的最长时间。默认值为1000。
此参数无效,除非您通过设置multiAddress.enabled=true启用 MultiAddress 功能。
实验选项/功能
目前被认为是实验性的新功能。
-
只读模式服务器:(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)要求在完成更新处理之前将更新同步到事务日志的媒体。如果此选项设置为 no,ZooKeeper 将不需要将更新同步到媒体。
-
jute.maxbuffer:(Java 系统属性:jute.maxbuffer)。
- 此选项只能设置为 Java 系统属性。上面没有 zookeeper 前缀。它指定可以存储在 znode 中的数据的最大大小。单位为:字节。默认值为 0xfffff(1048575) 字节,或略低于 1M。
- 如果更改此选项,则必须在所有服务器和客户端上设置系统属性,否则会出现问题。
- 当客户端的jute.maxbuffer大于服务端,客户端要写入的数据超过服务端的jute.maxbuffer,服务端会报java.io.IOException: Len错误
- 当client端的jute.maxbuffer小于server端,client想读取的数据超过client端的jute.maxbuffer,client端会报java.io.IOException: Unreasonable length or Packet len is out of范围!
- 这真的是一个健全的检查。ZooKeeper 旨在存储大小为千字节的数据。在生产环境中,不建议将该属性增加到超过默认值,原因如下:
- 大尺寸 znode 会导致不必要的延迟峰值,使吞吐量恶化
- 大型znodes使得leader和follower之间的同步时间不可预测且不收敛(有时超时),导致quorum不稳定
-
jute.maxbuffer.extrasize:(Java 系统属性:zookeeper.jute.maxbuffer.extrasize)3.5.7 中的新功能:在处理客户端请求时,ZooKeeper 服务器会在请求中添加一些附加信息,然后将其作为事务持久化。早些时候,此附加信息大小固定为 1024 字节。对于很多场景,特别是 jute.maxbuffer 值大于 1 MB 且请求类型为 multi 的场景,这个固定大小是不够的。为了处理所有场景,附加信息大小从 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 连接,以找到可到达的地址。仅当您在配置中提供多个地址时才会发生这种情况。当您尝试在单台机器上启动大型(例如 11 个以上)集成成员集群进行测试时,如果遇到一些 ICMP 速率限制(例如在 macOS 上),可达性检查可能会失败。
默认值为true。通过将此参数设置为“false”,您可以禁用可达性检查。请注意,禁用可达性检查将导致集群在网络问题期间无法正确重新配置自身,因此建议仅在测试期间禁用。
此参数无效,除非您通过设置multiAddress.enabled=true启用 MultiAddress 功能。
禁用数据目录自动创建
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”)在服务器关闭时删除了数据目录,这可能会很危险,因为该服务器可能会帮助选举缺少事务的领导者。启用 db 存在验证将在未找到数据树时更改启动时的行为:服务器作为非投票参与者加入 ensemble,直到它能够与领导者同步并获取最新版本的 ensemble 数据. 为了指示预期的空数据树(集成创建),用户应将文件“initialize”放在与“myid”相同的目录中。该文件将在启动时被服务器检测并删除。
通过在 java 命令行上设置zookeeper.db.autocreate=false直接从类文件运行 ZooKeeper 服务器时,可以启用初始化验证,即-Dzookeeper.db.autocreate=false。运行zkServer-initialize.sh将创建所需的初始化文件。
性能调整选项
3.5.0 中的新功能:重新设计了几个子系统以提高读取吞吐量。这包括 NIO 通信子系统和请求处理管道(Commit Processor)的多线程。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) 在处理读取之前要处理的最大提交数。我们将尝试处理尽可能多的远程/本地提交,直到达到这个数量。高提交批量大小将在处理更多提交时延迟读取。低提交批量大小将有利于读取。建议仅在 ensemble 为具有高提交率的工作负载提供服务时设置此属性。如果已知写入以一定数量的批次到达,则将该批次大小与此属性的值匹配可以平滑队列性能。一种通用的方法是将此值设置为等于整体大小,以便在处理每个批次时,当前服务器将概率性地处理与其直接客户端之一相关的写入。默认为“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能够跟踪和记录消息。默认值为“假”。
管理服务器配置
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。默认为“/命令”。
指标提供者
3.6.0 中的新功能:以下选项用于配置指标。
默认情况下,ZooKeeper 服务器使用AdminServer公开有用的指标。和四个字母单词界面。
从 3.6.0 开始,您可以配置不同的 Metrics Provider,将指标导出到您喜欢的系统。
自 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 的有用指标。默认值为真。
-
metricsProvider.numWorkerThreads:3.7.1 中的新功能:用于报告 Prometheus 汇总指标的工作线程数。默认值为1。如果数字小于1,将使用主线程。
-
metricsProvider.maxQueueSize:3.7.1 中的新功能: Prometheus 汇总指标报告任务的最大队列大小。默认值为 1000000。
-
metricsProvider.workerShutdownTimeoutMs:3.7.1 中的新功能: Prometheus 工作线程关闭的超时毫秒数。默认值为 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 加密。本节介绍如何在仲裁通信上设置加密。
请注意,Quorum 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
应该在 ensemble 的参与者上共享相同的信任库(存储所有接受的证书)。您需要使用不同的别名将多个证书存储在同一个信任库中。别名的名称无关紧要。
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
- 在日志中验证您的 ensemble 是否在 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
- 一旦你确认你的整个 ensemble 都在 TLS 上运行,你可以禁用端口统一并再次滚动重启
sslQuorum=true
portUnification=false
动物园管理员命令
四个字母的单词
ZooKeeper 响应一小组命令。每个命令由四个字母组成。您通过 telnet 或 nc 在客户端端口向 ZooKeeper 发出命令。
其中三个更有趣的命令:“stat”提供有关服务器和连接的客户端的一些一般信息,而“srvr”和“cons”分别提供有关服务器和连接的详细信息。
3.5.3 中的新功能:四个字母单词在使用前需要明确列入白名单。详细请参考集群配置章节中描述的4lw.commands.whitelist。展望未来,四个字母的单词将被弃用,请改用AdminServer。
-
conf : 3.3.0 中的新功能:打印有关服务配置的详细信息。
-
缺点:3.3.0 中的新功能:列出连接到此服务器的所有客户端的完整连接/会话详细信息。包括有关接收/发送的数据包数量、会话 ID、操作延迟、最后执行的操作等信息...
-
crst:3.3.0 中的新功能:重置所有连接的连接/会话统计信息。
-
dump:列出未完成的会话和临时节点。
-
envi:打印有关服务环境的详细信息
-
ruok:测试服务器是否在非错误状态下运行。当白名单启用 ruok 时,
imok
如果服务器正在运行,服务器将响应,否则根本不响应。当 ruok 被禁用时,服务器响应:“ruok 未执行,因为它不在白名单中。” “imok”的响应不一定表示服务器已加入仲裁,只是服务器进程处于活动状态并绑定到指定的客户端端口。使用“stat”获取有关状态 wrt quorum 和客户端连接信息的详细信息。 -
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 | 数控本地主机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领导zk_znode_count 4 zk_watch_count 0 zk_ephemerals_count 0 zk_approximate_data_size 27个zk_followers 4 - 只有领导者zk_synced_followers 4曝光 - 只露Leader zk_pending_syncs 0 - 仅由 Leader 公开 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 位值中的所有剩余位都未使用并保留以供将来使用。通过计算记录值的按位或来指定多个跟踪日志记录类别。默认跟踪掩码为 0b0100110010。因此,默认情况下,跟踪日志包括客户端请求、从领导者收到的数据包和会话。要设置不同的跟踪掩码,请发送包含
stmk
四个字母字的请求,后跟表示为 64 位有符号长值的跟踪掩码。此示例使用 Perlpack
函数构造一个启用上述所有跟踪日志记录类别的跟踪掩码,并将其转换为具有大端字节序的 64 位有符号长值。使用 netcat将结果附加到stmk
服务器并发送到服务器。服务器使用十进制格式的新跟踪掩码进行响应。$ perl -e "打印 'stmk', pack('q>', 0b0011111010)" | 数控本地主机 2181 250
以下是ruok命令的示例:
$ echo ruok | nc 127.0.0.1 5111
imok
管理服务器
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 四字母单词接口仍然可用。
可用的命令包括:
-
connection_stat_reset/crst:重置所有客户端连接统计信息。没有返回新字段。
-
configuration/conf/config:打印有关服务配置的基本详细信息,例如客户端端口、数据目录的绝对路径。
-
连接/缺点:有关客户端连接到服务器的信息。请注意,根据客户端连接的数量,此操作可能很昂贵(即影响服务器性能)。返回“连接”,连接信息对象的列表。
-
hash:历史摘要列表中的 Txn 摘要。每 128 笔交易记录一次。返回“摘要”,交易摘要对象的列表。
-
dirs:有关日志文件目录和快照目录大小的信息(以字节为单位)。返回“datadir_size”和“logdir_size”。
-
转储:有关会话到期和短暂的信息。请注意,根据全局会话和临时性的数量,此操作可能会很昂贵(即影响服务器性能)。返回“expiry_time_to_session_ids”和“session_id_to_ephemeral_paths”作为地图。
-
environment/env/envi:所有定义的环境变量。返回每个作为其自己的字段。
-
get_trace_mask/gtmk:当前跟踪掩码。set_trace_mask的只读版本。有关详细信息,请参阅四字母命令stmk的说明。返回“跟踪掩码”。
-
initial_configuration/icfg:打印用于启动对等体的配置文件的文本。返回“initial_configuration”。
-
is_read_only/isro:如果此服务器处于只读模式,则为 true/false。返回“只读”。
-
last_snapshot/lsnp:zookeeper 服务器完成保存到磁盘的最后一个快照的信息。如果在服务器启动到服务器完成保存第一个快照的初始时间段调用,该命令返回启动服务器时读取的快照信息。返回“zxid”和“timestamp”,后者使用秒为时间单位。
-
领导者/领导者:如果整体配置为仲裁模式,则发出对等体的当前领导者状态和当前领导者位置。返回“is_leader”、“leader_id”和“leader_ip”。
-
monitor/mntr : 发出各种有用的监控信息。包括性能统计信息、有关内部队列的信息和数据树的摘要(除其他外)。返回每个作为其自己的字段。
-
observer_connection_stat_reset/orst:重置所有观察者连接统计信息。对观察员的同伴指挥。没有返回新字段。
-
ruok:无操作命令,检查服务器是否正在运行。响应不一定表明服务器已加入仲裁,只是管理服务器处于活动状态并绑定到指定端口。没有返回新字段。
-
set_trace_mask/stmk:设置跟踪掩码(因此,它需要一个参数)。编写get_trace_mask的版本。有关详细信息,请参阅四字母命令stmk的说明。返回“跟踪掩码”。
-
server_stats/srvr:服务器信息。返回多个字段,简要概述服务器状态。
-
stats/stat:与server_stats相同,但也返回“connections”字段(有关详细信息,请参阅连接)。请注意,根据客户端连接的数量,此操作可能很昂贵(即影响服务器性能)。
-
stat_reset/srst:重置服务器统计信息。这是server_stats和stats返回的信息的子集。没有返回新字段。
-
观察者/观察者:观察者与服务器的连接信息。始终在领导者上可用,如果追随者充当学习者大师,则在追随者上可用。返回“synced_observers”(int)和“observers”(每个观察者属性的列表)。
-
system_properties/sysp:所有定义的系统属性。返回每个作为其自己的字段。
-
voting_view:提供集合中的当前投票成员。将“current_config”作为地图返回。
-
watch/wchc:按会话聚合的观看信息。请注意,根据手表的数量,此操作可能会很昂贵(即影响服务器性能)。将“session_id_to_watched_paths”作为地图返回。
-
watch_by_path/wchp:按路径聚合的观看信息。请注意,根据手表的数量,此操作可能会很昂贵(即影响服务器性能)。将“path_to_session_ids”作为地图返回。
-
watch_summary/wchs:汇总的手表信息。返回“num_total_watches”、“num_paths”和“num_connections”。
-
zabstate:peer 正在运行的 Zab 协议的当前阶段以及它是否是投票成员。对等点可能处于以下阶段之一:选举、发现、同步、广播。返回字段“voting”和“zabstate”。
数据文件管理
ZooKeeper 将其数据存储在数据目录中,并将其事务日志存储在事务日志目录中。默认情况下,这两个目录是相同的。服务器可以(并且应该)配置为将事务日志文件存储在与数据文件不同的目录中。当事务日志驻留在专用日志设备上时,吞吐量会增加,延迟会减少。
数据目录
该目录中有两三个文件:
- myid - 在人类可读的 ASCII 文本中包含一个整数,表示服务器 ID。
- 初始化- 存在表示预期缺少数据树。创建数据树后进行清理。
- 快照。
- 保存数据树的模糊快照。
每个 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。例如,您更有可能将 3G 堆用于 4G 机器,因为操作系统和缓存也需要内存。估计系统所需的堆大小的最佳且唯一推荐的做法是运行负载测试,然后确保您远低于会导致系统交换的使用限制。
-
可公开访问的部署:ZooKeeper 集成预计将在受信任的计算环境中运行。因此建议在防火墙后面部署 ZooKeeper。
最佳实践
为获得最佳结果,请注意以下良好 Zookeeper 实践列表:
对于多租户安装,请参阅详细说明 ZooKeeper“chroot”支持的部分,这在部署许多应用程序/服务连接到单个 ZooKeeper 集群时非常有用。