Apache > ZooKeeper
 

ZooKeeper 管理员指南

部署与管理指南

部署

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

前两部分假设您有兴趣在生产环境(如数据中心)中安装ZooKeeper。最后一部分则介绍在有限场景下(如评估、测试或开发)而非生产环境中搭建ZooKeeper的情况。

系统要求

支持的平台

ZooKeeper由多个组件组成。部分组件得到广泛支持,而其他组件仅适用于少数平台。

以下矩阵描述了在不同操作系统平台上运行各组件所承诺的支持级别。

支持矩阵
操作系统 客户端 服务器端 原生客户端 贡献组件
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内存和80GB IDE硬盘。

集群(多服务器)设置

为了确保ZooKeeper服务的可靠性,您应该将ZooKeeper部署在一个称为ensemble的集群中。只要集群中的大多数节点正常运行,服务就可用。由于Zookeeper需要多数节点存活,因此最好使用奇数台机器。例如,使用四台机器时,ZooKeeper只能处理单台机器故障;如果两台机器故障,剩下的两台机器无法构成多数。然而,使用五台机器时,ZooKeeper可以处理两台机器故障的情况。

注意

ZooKeeper入门指南所述,要实现容错集群设置至少需要三台服务器,强烈建议使用奇数台服务器。

通常在生产环境中,三台服务器就绰绰有余了,但为了在维护期间获得最高可靠性,您可能需要安装五台服务器。使用三台服务器时,如果对其中一台进行维护,那么在维护期间另外两台服务器出现故障就会导致系统脆弱。如果运行五台服务器,您可以停用一台进行维护,并且知道即使其他四台中突然有一台出现故障,系统仍然可以正常运行。

您的冗余考虑应涵盖环境的各个方面。如果您有三台ZooKeeper服务器,但它们的网线都插在同一台网络交换机上,那么该交换机的故障将导致整个集群瘫痪。

以下是设置一个将作为集群一部分的服务器的步骤。这些步骤应在集群中的每台主机上执行:

  1. 安装Java JDK。您可以使用系统自带的包管理系统,或从以下网址下载JDK:http://java.sun.com/javase/downloads/index.jsp

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

  3. Install the ZooKeeper Server Package. It can be downloaded from: http://zookeeper.apache.org/releases.html

  4. 创建配置文件。该文件可以任意命名。使用以下设置作为起点:

    tickTime=2000
    dataDir=/var/lib/zookeeper/
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=zoo1:2888:3888
    server.2=zoo2:2888:3888
    server.3=zoo3:2888:3888
    

    您可以在配置参数部分找到这些及其他配置设置的含义。这里简要说明几点:ZooKeeper集群中的每台机器都需要知道集群中的其他所有机器。这是通过一系列server.id=host:port:port形式的行实现的。(参数hostport很直观,对于每台服务器,您需要先指定仲裁端口,然后是ZooKeeper领导者选举专用端口)。自ZooKeeper 3.6.0起,您还可以为每个ZooKeeper服务器实例指定多个地址(当集群中可以并行使用多个物理网络接口时,这可以提高可用性)。您需要通过创建一个名为myid的文件为每台机器分配服务器ID,每个服务器一个文件,该文件位于该服务器的数据目录中,如配置文件参数dataDir所指定。

  5. myid文件仅包含一行文本,即该机器的ID。例如,服务器1的myid文件将只包含文本"1"而不包含其他内容。该ID在集群中必须是唯一的,并且取值应在1到255之间。重要提示:如果启用了TTL节点等扩展功能(见下文),由于内部限制,ID必须在1到254之间。

  6. 在与myid相同的目录中创建一个初始化标记文件initialize。该文件表示预期会有一个空的数据目录。当该文件存在时,将创建一个空数据库并删除标记文件。当该文件不存在时,空数据目录将意味着该节点没有投票权,并且在它与活跃领导者通信之前不会填充数据目录。预期用途是仅在启动新集群时创建此文件。

  7. 如果您的配置文件已设置完成,可以启动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的可靠性基于两个基本假设。

  1. 在部署环境中,只有少数服务器会出现故障。此处的故障指的是机器崩溃,或是导致服务器与多数节点断连的网络错误。
  2. 部署的机器运行正常。运行正常意味着正确执行代码、时钟工作正常,且存储和网络组件性能稳定。

以下部分包含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的数据目录包含特定服务集群存储的znode持久化副本文件,包括快照和事务日志文件。当znode发生变更时,这些变更会被追加到事务日志中。当日志增长到一定大小时,系统会将所有znode的当前状态快照写入文件系统,并创建新的事务日志文件用于后续事务。在快照过程中,ZooKeeper可能继续将新到达的事务追加到旧日志文件中。因此,某些比快照更新的事务可能会出现在快照前的最后一个事务日志中。

ZooKeeper服务器不会自动删除旧的快照和日志文件(默认配置下,参见下文autopurge设置),这是运维人员的职责。每个运行环境都不同,因此管理这些文件的需求可能因安装而异(例如备份需求)。

PurgeTxnLog工具实现了一个简单的保留策略,管理员可以使用该策略。API文档包含了调用约定(参数等)的详细信息。

在以下示例中,将保留最后个快照及其对应的日志文件,其余文件将被删除。的值通常应大于3(虽然这不是强制要求,但可以在极少数情况下当最近日志损坏时提供3份备份)。这个清理任务可以作为定时任务在ZooKeeper服务器上每天运行。

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.snapRetainCountautopurge.purgeInterval。更多详情请参阅下方的高级配置

调试日志清理 (logback)

请参阅本文档中关于日志记录的部分。建议您使用内置的logback功能设置滚动文件追加器。发布包tar中的示例配置文件conf/logback.xml提供了相关示例。

监控管理

您需要一个监督进程来管理每个ZooKeeper服务器进程(JVM)。ZK服务器被设计为"快速失败",这意味着当遇到无法恢复的错误时,它会立即关闭(进程退出)。由于ZooKeeper服务集群具有高度可靠性,即使单个服务器宕机,整个集群仍能保持活跃状态并继续处理请求。此外,由于集群具有"自我修复"能力,故障服务器在重启后将自动重新加入集群,无需任何人工干预。

使用像daemontoolsSMF这样的监管进程(还有其他监管进程选项可供选择,具体使用哪种由您决定,这里只是两个示例)来管理您的ZooKeeper服务器,可以确保如果进程异常退出,它将自动重启并快速重新加入集群。

还建议配置ZooKeeper服务器进程,在发生OutOfMemoryError**错误时终止并转储其堆内存。这可以通过分别在Linux和Windows上使用以下JVM参数启动来实现。ZooKeeper自带的zkServer.shzkServer.cmd脚本已设置了这些选项。

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

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

监控

ZooKeeper服务可以通过以下三种主要方式进行监控:

日志记录

ZooKeeper使用SLF4J 1.7版本作为其日志记录基础设施。默认情况下ZooKeeper附带LOGBack作为日志记录后端,但您可以选择使用任何其他受支持的日志记录框架。

ZooKeeper默认的logback.xml文件位于conf目录中。Logback要求logback.xml必须位于工作目录(运行ZooKeeper的目录)中,或者可以通过类路径访问。

有关SLF4J的更多信息,请参阅其手册

有关Logback的更多信息,请参阅Logback网站

故障排除

配置参数

ZooKeeper的行为由ZooKeeper配置文件控制。该文件的设计使得只要磁盘布局相同,组成ZooKeeper服务器的所有服务器都可以使用完全相同的配置文件。如果服务器使用不同的配置文件,则必须注意确保所有不同配置文件中的服务器列表匹配。

注意

在3.5.0及更高版本中,部分参数应放置在动态配置文件中。如果这些参数被放置在静态配置文件中,ZooKeeper会自动将它们迁移到动态配置文件。更多信息请参阅Dynamic Reconfiguration

最低配置

以下是配置文件中必须定义的最小配置关键词:

高级配置

本节中的配置设置是可选的。您可以使用它们进一步微调ZooKeeper服务器的行为。其中一些也可以通过Java系统属性设置,通常形式为zookeeper.keyword。当可用时,具体的系统属性会在下方注明。

该功能具有向后和向前兼容性。以下是不同的场景。

  1. 由服务器内部触发的快照。当使用新代码加载旧快照时,尝试读取不存在的lastProcessedZxid值时会抛出EOFException,该异常将被捕获。lastProcessedZxid将通过快照文件名进行设置。

    b. 当使用旧代码加载新快照时,在反序列化摘要值后会成功完成,快照文件末尾的lastProcessedZxid将被忽略。lastProcessedZxid将使用快照文件名来设置。

    1. 领导者与跟随者之间的同步 在旧代码和新代码中,lastProcessedZxid都不会被领导者序列化并由跟随者反序列化。它将被设置为通过QuorumPacket从领导者发送的lastProcessedZxid。
  2. 通过管理服务器API触发的快照功能 需要启用特性标志才能使快照命令生效。

集群选项

本节中的选项专为服务器集群设计——即在部署服务器集群时使用。

如果您确实需要默认启用所有四字母命令,可以使用星号选项,这样就不必在列表中逐一包含每个命令。例如,这将启用所有四字母命令:

4lw.commands.whitelist=*

加密、认证与授权选项

本节中的选项允许控制由服务执行的加密/认证/授权操作。

除了本页面外,您还可以在程序员指南中找到有关客户端配置的有用信息。ZooKeeper Wiki还包含关于ZooKeeper SSL支持ZooKeeper的SASL认证的有用页面。

实验性选项/功能

目前被视为实验性的新功能。

不安全选项

以下选项可能很有用,但使用时请务必谨慎。每个选项的风险说明会随变量功能的解释一并提供。

禁用数据目录自动创建

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,然后创建数据目录(可能还包括事务日志目录),最后启动服务器。否则如前一节所述,服务器将无法启动。运行zkServer-initialize.sh会创建所需目录,并可选择设置myid文件(可选命令行参数)。即使不使用自动创建功能本身,该脚本仍然可用,并且可能对用户有所帮助,因为(包括创建myid文件在内的)设置过程过去一直是用户遇到的问题。请注意,该脚本仅确保数据目录存在,不会创建配置文件,而是需要已有配置文件才能执行。

启用数据库存在性验证

3.6.0版本新增: 当ZooKeeper服务器启动时未找到数据树,默认行为是将zxid设为零并作为投票成员加入仲裁。如果服务器宕机期间某些事件(例如恶意执行的'rm -rf'命令)删除了数据目录,这种行为可能很危险,因为该服务器可能会帮助选举出一个缺失事务的领导者。启用数据库存在验证后,当未找到数据树时启动行为将改变:服务器会作为非投票参与者加入集群,直到能够与领导者同步并获取最新的集群数据版本。若要表示预期为空数据树(创建新集群),用户应在'myid'文件所在目录放置一个'initialize'文件。该文件将在服务器启动时被检测并删除。

当直接从类文件运行ZooKeeper服务器时,可以通过在Java命令行设置zookeeper.db.autocreate=false来启用初始化验证,即-Dzookeeper.db.autocreate=false。运行zkServer-initialize.sh将创建所需的初始化文件。

性能调优选项

3.5.0版本新增功能: 多个子系统经过重构以提升读取吞吐量。这包括NIO通信子系统和请求处理流水线(提交处理器)的多线程优化。NIO现在是默认的客户端/服务器通信子系统,其线程模型包含1个接收线程、1-N个选择器线程和0-M个套接字I/O工作线程。在请求处理流水线中,系统可配置为同时处理多个读取请求,同时保持相同的一致性保证(同会话写后读)。提交处理器的线程模型包含1个主线程和0-N个工作线程。

默认值旨在最大化专用ZooKeeper机器上的读取吞吐量。两个子系统都需要拥有足够数量的线程才能达到峰值读取吞吐量。

调试可观测性配置

3.6.0版本新增: 引入以下选项使zookeeper更易于调试。

AdminServer 配置

3.9.0版本新增: 以下选项用于配置AdminServer

3.7.1版本新增: 以下选项用于配置AdminServer

3.6.0 版本新增: 以下选项用于配置 AdminServer

3.5.0版本新增: 以下选项用于配置AdminServer

指标提供者

3.6.0版本新增: 以下选项用于配置指标。

默认情况下,ZooKeeper服务器通过AdminServerFour Letter Words接口暴露有用的指标数据。

自3.6.0版本起,您可以配置不同的指标提供程序,将指标导出到您偏好的系统中。

自3.6.0版本起,ZooKeeper二进制包集成了与Prometheus.io的对接功能

使用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

Quorum TLS

3.5.5版本新增

基于Netty框架,ZooKeeper集群可以配置为在其通信通道中使用TLS加密。本节介绍如何在法定人数通信中设置加密。

请注意,Quorum TLS封装了保护领导者选举和法定人数通信协议的安全机制。

  1. 创建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
  1. 从密钥库中提取已签名的公钥(证书)

此步骤可能仅对自签名证书有必要。

keytool -exportcert -alias $(hostname -f) -keystore keystore.jks -file $(hostname -f).cer -rfc
  1. 创建包含所有ZooKeeper实例证书的SSL信任库JKS

同一个信任库(存储所有被接受的证书)应该在集群的各个参与者之间共享。您需要使用不同的别名来在同一个信任库中存储多个证书。别名的名称无关紧要。

keytool -importcert -alias [host1..3] -file [host1..3].cer -keystore truststore.jks -storepass password
  1. 你需要使用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
  1. 在日志中验证您的集群是否在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且无需停机的步骤。

  1. 按照上一节所述,为所有ZK参与者创建必要的密钥库和信任库

  2. 添加以下配置设置并重启第一个节点

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尚未启用,但我们开启了端口统一功能。

  1. 在剩余节点上重复步骤 #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

每次节点重启后,你还应再次确认仲裁集群是否恢复健康状态。

  1. 在每个节点上启用Quorum TLS并执行滚动重启:
sslQuorum=true
portUnification=true
  1. 一旦确认整个集群都在TLS上运行,您可以禁用端口统一并执行另一轮滚动重启
sslQuorum=true
portUnification=false

ZooKeeper 命令

四字母命令

ZooKeeper响应一小部分命令。每个命令由四个字母组成。您可以通过telnet或nc在客户端端口向ZooKeeper发送这些命令。

三个比较有趣的命令:"stat"提供服务器和已连接客户端的一些基本信息,而"srvr"和"cons"则分别提供服务器和连接的扩展详细信息。

3.5.3版本新增: 使用四字命令前需显式加入白名单。详情请参阅集群配置章节中描述的4lw.commands.whitelist参数。未来版本将逐步弃用四字命令,建议改用AdminServer替代。

输出内容兼容Java属性格式,且内容可能随时间变化(新增键值)。您的脚本应能适应这些变更。注意:部分键是平台特定的,部分键仅由Leader导出。输出包含多行,格式如下:

key \t value

以下是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"。要查看所有可用命令列表,请在浏览器中访问/commands URL(例如http://localhost:8080/commands)。有关如何更改端口和URL的信息,请参阅AdminServer配置选项

AdminServer默认是启用的,但可以通过以下方式禁用:

请注意,如果AdminServer被禁用,TCP四字母命令接口仍然可用。

为AdminServer配置SSL/TLS
admin.portUnification=true
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
2019-08-03 15:44:55,213 [myid:] - INFO  [main:JettyAdminServer@123] - Successfully loaded private key from /data/software/cert/keystore.jks
2019-08-03 15:44:55,213 [myid:] - INFO  [main:JettyAdminServer@124] - Successfully loaded certificate authority from /data/software/cert/truststore.jks

2019-08-03 15:44:55,403 [myid:] - INFO  [main:JettyAdminServer@170] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands

可用命令包括:

数据文件管理

ZooKeeper将其数据存储在数据目录中,事务日志存储在事务日志目录中。默认情况下这两个目录是相同的。可以(也应该)将服务器配置为将事务日志文件与数据文件分开存储。当事务日志位于专用日志设备上时,吞吐量会增加,延迟会降低。

数据目录

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

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

存储在数据目录中的快照文件属于模糊快照,因为在ZooKeeper服务器拍摄快照期间,数据树仍在持续更新。快照文件名的后缀是zxid(ZooKeeper事务ID),表示快照开始时最后一个已提交事务的ID。因此,快照包含了拍摄过程中对数据树的部分更新。这种快照可能并不对应任何实际存在过的数据树状态,因此我们称之为模糊快照。尽管如此,ZooKeeper仍能利用这种快照进行恢复,因为它利用了更新操作的幂等特性。通过将事务日志重放到模糊快照上,ZooKeeper能获取日志末尾时刻的系统状态。

日志目录

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

文件管理

快照文件和日志文件的格式在独立ZooKeeper服务器与不同配置的复制ZooKeeper服务器之间保持不变。因此,您可以将这些文件从运行的复制ZooKeeper服务器提取到装有独立ZooKeeper服务器的开发机器上进行故障排查。

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

ZooKeeper服务器会创建快照和日志文件,但从不删除它们。数据和日志文件的保留策略是在ZooKeeper服务器外部实现的。服务器本身只需要最新的完整模糊快照、之后的所有日志文件以及之前的最后一个日志文件。后一个要求是必要的,以包含在此快照启动后发生但当时进入现有日志文件的更新。这是可能的,因为在ZooKeeper中,快照和日志滚动是相对独立进行的。有关设置保留策略和维护ZooKeeper存储的更多详细信息,请参阅本文档中的维护部分。

注意

这些文件中存储的数据未经加密。如果在ZooKeeper中存储敏感数据,需要采取必要措施防止未经授权的访问。此类措施在ZooKeeper外部实现(例如控制对文件的访问权限),具体取决于部署时的个性化配置。

恢复 - 事务日志工具包

更多详情请参阅this

需避免的事项

通过正确配置ZooKeeper,您可以避免以下常见问题:

最佳实践

为了获得最佳效果,请注意以下Zookeeper的良好实践列表:

对于多租户安装,请参阅详细介绍ZooKeeper "chroot"支持的章节,这在部署多个应用程序/服务连接到单个ZooKeeper集群时非常有用。