zookeeper指南
部署和管理指南
· 部署
o 系统需求
§ 支持的平台
§ 所需软件
o 群集(多服务器)设置
o 单一服务器和开发人员设置
· 管理
o 设计zookeeper部署
§ 跨机器要求
§ 单机需求
o 准备金提取
o 需要考虑的事情:zookeeper的优势和局限性
o 管理
o 保持
§ 正在进行的数据目录清理
§ 调试日志清理(log4j)
o 管理
o 监视
o 记录
o 解决纷争
o 配置参数
§ 最低配置
§ 高级配置
§ 集群选项
§ 加密、身份验证、授权选项
§ 实验选项/功能
§ 不安全选项
§ 禁用数据目录自动创建
§ 启用数据库存在验证
§ 性能调整选项
§ 管理服务器配置
o 使用Netty框架进行沟通
§ 法定人数
§ 在不停机的情况下升级现有的非TLS群集
o zookeeper命令
§ 四个字母单词
§ 管理服务器
o 数据文件管理
§ 数据目录
§ 日志目录
§ 文件管理
§ 恢复- TxnLogToolkit
o 需要避免的事情
o 最佳实践
部署
本节包含有关部署zookeeper的信息,并涵盖以下主题:
· 系统需求
· 群集(多服务器)设置
· 单一服务器和开发人员设置
前两部分假设您对在生产环境(如数据中心)中安装ZooKeeper感兴趣。最后一节介绍了在有限的基础上建立ZooKeeper的情况——用于评估、测试或开发——但不是在生产环境中。
系统需求
支持的平台
zookeeper由多个组件组成。一些组件得到广泛支持,而其他组件只在一个较小的平台上得到支持。
· 客户是一个Java客户端库,应用程序使用它来连接到一个ZooKeeper集合。
· 服务器是运行在ZooKeeper集成节点上的Java服务器。
· 本地客户端是一个用C实现的客户端,类似于Java客户端,被应用程序用来连接到ZooKeeper集合。
· 贡献指多个可选的附加组件。
下表描述了在不同操作系统平台上运行每个组件所承诺的支持级别。
支持矩阵
操作系统 | 客户 | 服务器 | 本地客户端 | 贡献 |
GNU/Linux | 开发和生产 | 开发和生产 | 开发和生产 | 开发和生产 |
Solaris | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
FreeBSD | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
Windows | 开发和生产 | 开发和生产 | 不支持 | 不支持 |
Mac·OS X | 仅限发展 | 仅限发展 | 不支持 | 不支持 |
对于矩阵中未明确提到支持的任何操作系统,组件可能工作,也可能不工作。ZooKeeper社区将修复其他平台报告的明显缺陷,但是没有完全的支持。
所需软件
ZooKeeper运行在Java 1.7或更高版本(JDK 7或更高版本,FreeBSD支持需要openjdk7)。它作为一个全体ZooKeeper服务器。三个ZooKeeper服务器是一个集合的最小推荐大小,我们还建议它们在不同的机器上运行。在雅虎!,ZooKeeper通常部署在专用的RHEL机箱上,配备双核处理器、2GB内存和80GB IDE硬盘。
群集(多服务器)设置
为了获得可靠的ZooKeeper服务,您应该在一个称为全体。只要大部分人都起来了,这项服务就可以用了。因为zookeeper需要多数,所以最好使用奇数台机器。例如,有四台机器,ZooKeeper只能处理一台机器的故障;如果两台机器出现故障,其余两台机器不构成多数。然而,有了五台机器,ZooKeeper可以处理两台机器的故障。
注意
如中所述zookeeper入门指南,容错群集设置至少需要三台服务器,强烈建议您使用奇数台服务器。
通常,三个服务器对于生产安装来说已经足够了,但是为了在维护期间获得最大的可靠性,您可能希望安装五个服务器。对于三台服务器,如果您在其中一台服务器上执行维护,那么在维护期间,您很容易在另外两台服务器中的一台上出现故障。如果你有五个正在运行,你可以取下一个进行维护,并且知道如果另外四个中的一个突然出现故障,你仍然可以。
您的冗余考虑应该包括您环境的所有方面。如果你有三个ZooKeeper服务器,但是它们的网络电缆都插在同一个网络交换机上,那么这个交换机的故障会使你的整个系统瘫痪。
以下是设置服务器的步骤,服务器将成为集合的一部分。这些步骤应该在集合中的每个主机上执行:
1. 安装爪哇JDK。您可以将本机打包系统用于您的系统,或者从以下网址下载JDK:http://java.sun.com/javase/downloads/index.jsp
2. 设置Java堆的大小。这对于避免交换非常重要,交换会严重降低ZooKeeper的性能。要确定正确的值,请使用负载测试,并确保远远低于导致交换的使用限制。保守一点——4GB机器的最大堆大小为3GB。
3. 安装zookeeper服务器包。可从以下网站下载:http://zookeeper.apache.org/releases.html
4. 创建配置文件。这个文件可以被称为任何东西。使用以下设置作为起点:
tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
您可以在部分找到这些和其他配置设置的含义配置参数。这里有几个人想说一句话:zookeeper集合中的每一台机器都应该知道集合中的其他每一台机器。您可以通过表单的一系列行来实现这一点server.id =主机:端口:端口。参数宿主和港口很简单。您可以通过创建名为的文件将服务器id分配给每台计算机myid,每个服务器一个,驻留在该服务器的数据目录中,由配置文件参数指定数据目录。
5. myid文件由一行仅包含该机器id的文本组成。因此myid服务器1的将包含文本“1”而没有其他内容。id在集合中必须是唯一的,并且应该具有1到255之间的值。重要提示:如果启用扩展功能,如TTL节点(见下文),由于内部限制,id必须介于1和254之间。
6. 如果设置了配置文件,您可以启动ZooKeeper服务器:
$ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
QuorumPeerMain启动一个zookeeper服务器,JMX还注册了管理beans,允许通过JMX管理控制台进行管理。这zookeeperJMX文件包含与JMX一起管理zookeeper的详细信息。看剧本bin/zkServer.sh,它包含在发行版中,用于启动服务器实例的示例。
1. 通过连接到主机来测试您的部署:在Java中,您可以运行以下命令来执行简单的操作:
$ bin/zkCli.sh -server 127.0.0.1:2181
单一服务器和开发人员设置
如果您想为开发目的设置ZooKeeper,您可能需要设置ZooKeeper的单个服务器实例,然后在您的开发机器上安装Java或C客户端库和绑定。
设置单个服务器实例的步骤与上面类似,只是配置文件更简单。您可以在在单服务器模式下安装和运行ZooKeeper的部分zookeeper入门指南。
有关安装客户端库的信息,请参阅粘合剂的部分zookeeper程序员指南。
管理
本节包含有关运行和维护ZooKeeper的信息,并涵盖以下主题:
· 设计zookeeper部署
· 准备金提取
· 需要考虑的事情:zookeeper的优势和局限性
· 管理
· 保持
· 管理
· 监视
· 记录
· 解决纷争
· 配置参数
· zookeeper命令
· 数据文件管理
· 需要避免的事情
· 最佳实践
设计zookeeper部署
zookeeper的可靠性基于两个基本假设。
1. 部署中只有少数服务器会失败。失败在这种情况下,这意味着机器崩溃,或者网络中的一些错误将服务器与大多数服务器隔离开来。
2. 部署的机器运行正常。正确操作意味着正确执行代码,让时钟正常工作,让存储和网络组件持续运行。
下面几节包含了zookeeper的考虑事项,以最大化这些假设成立的可能性。其中一些是跨机器的考虑,其他的是您应该为部署中的每一台机器考虑的事情。
跨机器要求
要使ZooKeeper服务处于活动状态,必须有大多数非故障机器能够相互通信。要创建一个可以容忍F机器故障的部署,您应该依靠部署2xF+1机器。因此,由三台机器组成的部署可以处理一个故障,而由五台机器组成的部署可以处理两个故障。请注意,六台机器的部署只能处理两台故障,因为三台机器不是大多数。因此,ZooKeeper部署通常由奇数台机器组成。
为了获得最大的容忍故障的可能性,你应该努力使机器故障独立。例如,如果大多数机器共享同一个交换机,该交换机的故障可能会导致相关的故障并导致服务中断。共享电源电路、冷却系统等也是如此。
单机需求
如果ZooKeeper不得不与其他应用程序争夺对存储介质、中央处理器、网络或内存等资源的访问权,它的性能将会大打折扣。ZooKeeper有很强的持久性保证,这意味着它在负责变更的操作被允许完成之前,使用存储介质记录变更。那么你应该意识到这种依赖性,如果你想确保ZooKeeper的操作不被你的媒体所阻碍,那就要非常小心。以下是您可以做的一些事情,以最大限度地减少这种退化:
· ZooKeeper的事务日志必须在专用设备上。(专用分区是不够的。)ZooKeeper按顺序写入日志,而不寻求与其他进程共享您的日志设备会导致寻道和争用,这反过来又会导致多秒延迟。
· 不要将ZooKeeper置于可能导致交换的情况。为了让ZooKeeper以任何形式的及时性运行,它根本不能被允许交换。因此,确保给ZooKeeper的最大堆大小不大于ZooKeeper可用的实际内存量。有关这方面的更多信息,请参见需要避免的事情下面。
准备金提取
需要考虑的事情:zookeeper的优势和局限性
管理
保持
zookeeper集群几乎不需要长期维护,但是您必须注意以下几点:
正在进行的数据目录清理
动物园看守数据目录包含由特定服务集合存储的znodes的永久副本的文件。这些是快照和事务日志文件。当对znodes进行更改时,这些更改会附加到事务日志中。有时,当日志变大时,所有znodes的当前状态的快照将被写入文件系统,并为将来的事务创建一个新的事务日志文件。在快照期间,ZooKeeper可能会继续将传入的事务附加到旧的日志文件中。因此,某些比快照更新的事务可能会在快照之前的最后一个事务日志中找到。
zookeeper服务器不会删除旧快照和日志文件当使用默认配置时(见下面的自动敦促),这是操作员的责任。每个服务环境都是不同的,因此管理这些文件的要求可能因安装而异(例如备份)。
PurgeTxnLog实用程序实现了一个管理员可以使用的简单保留策略。这原料药包含调用约定(参数等)的详细信息...)。
在以下示例中,保留最后一个计数快照及其对应的日志,并删除其他快照。的价值通常应大于3(虽然不是必需的,但这在最近的日志损坏的情况下提供了3个备份)。这可以作为一个cron作业在ZooKeeper服务器上运行,以便每天清理日志。
java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>
快照和相应事务日志的自动清除是在3.4.0版中引入的,可以通过以下配置参数启用autopurge.snapRetainCount和autopurge.purgeInterval。有关这方面的更多信息,请参见高级配置下面。
调试日志清理(log4j)
请参见中的一节记录在这份文件中。预计您将使用内置的log4j功能设置一个滚动文件附加器。发布tar的conf/log4j.properties中的示例配置文件提供了一个例子。
管理
您将希望有一个管理过程来管理您的每个ZooKeeper服务器进程(JVM)。ZK服务器被设计为“快速故障”,这意味着如果出现无法恢复的错误,它将关闭(进程退出)。由于ZooKeeper服务集群是高度可靠的,这意味着尽管服务器可能会关闭,但整个集群仍然是活动的,并服务于请求。此外,由于集群是“自我修复”的,故障服务器一旦重启,将自动重新加入集群,无需任何手动交互。
具有监督过程,例如daemontools或者SMF(管理进程的其他选项也是可用的,这取决于您想使用哪一个,这只是两个例子)管理您的ZooKeeper服务器可以确保如果进程异常退出,它将自动重新启动并快速重新加入集群。
还建议将ZooKeeper服务器进程配置为在发生OutOfMemoryError**时终止并转储其堆。这是通过在Linux和Windows上分别使用以下参数启动JVM来实现的。这zkServer.sh和zkServer.cmdZooKeeper附带的脚本设置了这些选项。
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'
"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"
监视
ZooKeeper服务可以通过两种主要方式之一进行监控;1)命令端口通过使用4个字母单词和2)JMX。请参见适合您的环境/要求的部分。
记录
zookeeper使用SLF4J版本1.7.5作为其日志记录基础设施。为了向后兼容,它绑定到LOG4J但是你可以用日志返回或者您选择的任何其他受支持的日志框架。
zookeeper默认log4j.properties文件驻留在conf目录。Log4j要求log4j.properties要么在工作目录中(运行ZooKeeper的目录),要么可以从类路径访问。
有关SLF4J的更多信息,请参见它的手册。
有关LOG4J的更多信息,请参见Log4j默认初始化程序log4j手册。
解决纷争
· 由于文件损坏,服务器无法运行:服务器可能无法读取其数据库,并且由于ZooKeeper服务器的事务日志中的某些文件损坏而无法启动。你会看到一些加载zookeeper数据库的异常。在这种情况下,请确保您的集群中的所有其他服务器都正常工作。使用命令端口上的“stat”命令查看他们是否健康。在您验证了集合中的所有其他服务器都已启动之后,您可以继续清理损坏服务器的数据库。删除datadir/version-2和datalogdir/version-2/中的所有文件。重新启动服务器。
配置参数
管理员的行为由管理员配置文件控制。假设磁盘布局相同,该文件的设计使得组成ZooKeeper服务器的所有服务器都可以使用完全相同的文件。如果服务器使用不同的配置文件,必须注意确保所有不同配置文件中的服务器列表匹配。
注意
在3.5.0和更高版本中,其中一些参数应该放在动态配置文件中。如果它们被放在静态配置文件中,ZooKeeper会自动将它们移到动态配置文件中。看见动态重构了解更多信息。
最低配置
以下是必须在配置文件中定义的最低配置关键字:
· clientPort:监听客户端连接的端口;也就是客户端试图连接的端口。
· 安全客户端端口:使用SSL监听安全客户端连接的端口。clientPort指定明文连接的端口安全客户端端口指定SSL连接的端口。指定两者都启用混合模式,而忽略其中一个将禁用该模式。请注意,当用户将zoo keeper . ServerCnXnfactory . zoo keeper . ClientCnXnSocket作为Netty插入时,将启用SSL功能。
· 数据目录:ZooKeeper将存储内存中数据库快照的位置,以及数据库更新的事务日志,除非另有指定。
注意
请小心放置事务日志的位置。专用事务日志设备是保持良好性能的关键。将日志放在繁忙的设备上会对性能产生负面影响。
· tickTime:单个刻度的长度,它是ZooKeeper使用的基本时间单位,以毫秒为单位。它用于调节心跳和超时。例如,最小会话超时将是两个刻度。
高级配置
部分中的配置设置是可选的。您可以使用它们来进一步微调ZooKeeper服务器的行为。有些也可以使用Java系统属性来设置,通常是以下形式zookeeper .关键字。准确的系统属性(如果可用)如下所示。
· 数据日志目录:(无Java系统属性)此选项将指示计算机将事务日志写入数据日志目录而不是数据目录。这允许使用专用日志设备,并有助于避免日志记录和快照之间的竞争。
注意
拥有专用日志设备对吞吐量和稳定延迟有很大影响。强烈建议使用专用的日志设备和设置数据日志目录指向该设备上的目录,然后确保指向数据目录到目录不驻留在那个设备上。
· globalOutstandingLimit:(Java系统属性:zookeeper。)客户提交请求的速度比ZooKeeper处理请求的速度快,尤其是在有很多客户的情况下。为了防止ZooKeeper因排队请求而耗尽内存,ZooKeeper将限制客户端,以便系统中没有超过globalOutstandingLimit的未决请求。默认限制为1,000。
· 预分配大小:(Java系统属性:zookeeper.预分配大小)为了避免查找,ZooKeeper在事务日志文件中以预分配大小为千字节的块来分配空间。默认块大小为64M。更改数据块大小的一个原因是,如果更频繁地拍摄快照,可以减小数据块大小。(另请参见快照计数)。
· 快照计数:(Java系统属性:zookeeper。快照)ZooKeeper使用快照和事务日志(想想预写日志)记录它的事务。在拍摄快照(和滚动事务日志)之前,事务日志中记录的事务数由快照计数决定。为了防止仲裁中的所有机器同时拍摄快照,当事务日志中的事务数量达到[快照计数/2+1,快照计数]范围内运行时生成的随机值时,每个ZooKeeper服务器将拍摄快照。默认快照计数为100,000。
· maxClientCnxns:(无Java系统属性)限制单个客户端(通过IP地址标识)可以与ZooKeeper集合的单个成员建立的并发连接数(在套接字级别)。这用于防止特定类别的DoS攻击,包括文件描述符耗尽。默认值为60。将此设置为0将完全取消对并发连接的限制。
· 客户端端口地址:3.3.0中的新功能:侦听客户端连接的地址(ipv4、ipv6或主机名);也就是客户端试图连接的地址。这是可选的,默认情况下,我们以这样的方式绑定clientPort对于服务器上的任何地址/接口/nic,都将被接受。
· minSessionTimeout:(没有Java系统属性)3.3.0中的新功能:服务器允许客户端协商的最小会话超时时间(毫秒)。默认为的2倍tickTime。
· maxSessionTimeout:(没有Java系统属性)3.3.0中的新功能:服务器允许客户端协商的最大会话超时时间(毫秒)。默认为的20倍tickTime。
· fsync.warningthresholdms:(Java系统属性:zoo keeper . fsync . warningthresholdms)3.3.4中的新功能:每当事务日志(WAL)中的fsync花费的时间超过该值时,就会向日志输出一条警告消息。这些值以毫秒为单位指定,默认值为1000。该值只能设置为系统属性。
· autopurge.snapRetainCount:(没有Java系统属性)3.4.0中的新增功能:启用后,ZooKeeper自动清除功能将保留autopurge.snapRetainCount中最近的快照和相应的事务日志数据目录和数据日志目录并删除其余部分。默认值为3。最小值为3。
· autopurge.purgeInterval:(没有Java系统属性)3.4.0中的新增功能:必须触发清除任务的时间间隔(小时)。设置为正整数(1及以上)以启用自动清除。默认值为0。
· 同步已启用:(Java系统属性:zookeeper.observer.syncEnabled)3.4.6、3.5.0中的新增功能:观察者现在像参与者一样默认记录事务并将快照写入磁盘。这减少了重启时观察器的恢复时间。设置为“假”禁用此功能。默认值为“真”
· zookeeper.extendedTypesEnabled:(仅限于Java系统属性:zookeeper.extendedTypesEnabled)3.5.4中的新增功能:定义为“真”,以启用扩展功能,如创建TTL节点。默认情况下,它们是禁用的。重要提示:当启用时,由于内部限制,服务器标识必须小于255。
· zoo keeper . simulate 353 tlnodes:(仅限于Java系统属性:zoo keeper . simulate 353 tlnodes)3.5.4中的新功能:由于ZOOKEERE-3 . 5 . 3版中创建的2901 TTL节点在3.5.4/3.6.0中不受支持。但是,通过zoo keeper . simulate 353 tlnodes系统属性提供了一种解决方法。如果您在ZooKeeper 3.5.3中使用了TTL节点,并且需要维护兼容性集zoo keeper . simulate 353 tlnodes除了“真”zookeeper.extendedTypesEnabled。注意:由于这个错误,服务器标识必须是127或更少。此外,最大支持TTL值为1099511627775,小于3.5.3中允许的值(1152921504606846975)
· 服务器工厂:(Java系统属性:zoo keeper . ServerCNxNFfactory)指定服务器工厂实现。这应该设置为NettyServerCnxnFactory以便使用基于TLS的服务器通信。默认值为NIOServerCnxnFactory。
集群选项
本节中的选项设计用于服务器集成,即部署服务器集群时。
· 选举g:(没有Java系统属性)选择要使用的实现。值“1”对应于快速领导者选举的非认证的基于UDP的版本,“2”对应于快速领导者选举的认证的基于UDP的版本,“3”对应于快速领导者选举的基于TCP的版本。目前,算法3是默认的。
注意
领导者选举1和2的实现现在是反对。我们打算在下一个版本中删除它们,到那时只有FastLeaderElection可用。
· 极限极限:(无Java系统属性)时间量,以刻度为单位(请参见tickTime),允许追随者连接并同步到领导者。如果ZooKeeper管理的数据量很大,则根据需要增加该值。
· 领导服务:(Java系统属性:zookeeper。**领导者服务* *)领导者接受客户连接。默认值为“是”。引导机协调更新。为了以读吞吐量为代价获得更高的更新吞吐量,可以将领导者配置为不接受客户端,而专注于协调。此选项的默认值为“是”,这意味着领导者将接受客户连接。
注意
当您在一个集合中有三个以上的ZooKeeper服务器时,强烈建议启用领导者选择。
· 服务器. x =[主机名]:[:等等:(没有Java系统属性)组成zookeeper集合的服务器。当服务器启动时,它通过查找文件来确定它是哪个服务器myid在数据目录中。该文件包含服务器号,以ASCII表示,并且应该匹配x在server.x在这个设置的左边。客户端使用的组成ZooKeeper服务器的服务器列表必须与每个ZooKeeper服务器拥有的ZooKeeper服务器列表相匹配。有两个端口号nnnnn。第一个跟随者用于连接到领导者,第二个用于领导者选举。如果您想在一台机器上测试多台服务器,那么每台服务器可以使用不同的端口。
· 同步限制:(无Java系统属性)时间量,以刻度为单位(请参见tickTime),允许追随者与ZooKeeper同步。如果追随者远远落后于领导者,他们就会被抛弃。
· [:nnnnn n]:(无Java系统属性)启用分层仲裁构造。“x”是组标识符,“=”符号后面的数字对应于服务器标识符。分配的左侧是一个以冒号分隔的服务器标识符列表。请注意,组必须是不相交的,并且所有组的并集必须是ZooKeeper集合。你会找到一个例子这里
· weight.x=nnnnn:(无Java系统属性)与“组”一起使用,它在形成quorums时为服务器分配一个权重。这样的值对应于投票时服务器的重量。ZooKeeper有几个部分需要投票,比如领导者选举和原子广播协议。默认情况下,服务器的重量为1。如果配置定义了组,但没有定义权重,则值1将分配给所有服务器。你会找到一个例子这里
· cnxTimeout:(Java系统属性:zookeeper。**cnxTimeout**)设置为领导人选举通知打开连接的超时值。仅适用于您正在使用第三代电子邮件的情况。
注意
默认值为5秒。
· standaloneEnabled:(没有Java系统属性)3.5.0中的新功能:当设置为false时,可以在复制模式下启动单个服务器,一个单独的参与者可以与观察者一起运行,集群可以向下重新配置到一个节点,从一个节点向上重新配置。对于向后兼容性,默认值为真。可以使用QuorumPeerConfig的setStandaloneEnabled方法或通过在服务器的配置文件中添加“standaloneEnabled=false”或“standaloneEnabled=true”来设置。
· 重新配置已启用:(没有Java系统属性)3.5.3中的新增功能:这控制的启用或禁用动态重构特色。启用该功能后,用户可以通过ZooKeeper客户端应用程序接口或ZooKeeper命令行工具执行重新配置操作,前提是用户被授权执行此类操作。当该功能被禁用时,任何用户(包括超级用户)都不能执行重新配置。任何重新配置的尝试都会返回一个错误。"重新配置已启用"选项可以设置为"重新配置启用=假"或者"重新配置启用=真"或者使用QuorumPeerConfig的setReconfigEnabled方法。默认值为假。如果存在,该值应该在整个集合中的每台服务器上保持一致。在某些服务器上将该值设置为真,而在其他服务器上将该值设置为假将导致不一致的行为,具体取决于哪个服务器被选为领导者。如果领导者的设置为"重新配置启用=真",则集合将启用重新配置功能。如果领导者的设置为"重新配置启用=假",则集合将禁用重新配置功能。因此,建议具有一致的值"重新配置已启用"集合中的服务器。
· 4lw.commands .白名单:(Java系统属性:zookeeper.4lw.commands .白名单)3.5.3中的新增功能:逗号分隔的列表四个字母单词用户想要使用的命令。必须将有效的四个字母单词命令放在该列表中,否则ZooKeeper服务器将不会启用该命令。默认情况下,白名单只包含zkServer.sh使用的“srvr”命令。默认情况下,其余四个字母单词命令被禁用。下面是一个配置示例,它启用stat、ruok、conf和isro命令,同时禁用其余的四个字母单词命令:
4lw.commands.whitelist=stat, ruok, conf, isro
如果您真的需要在默认情况下启用所有四个字母的word命令,您可以使用星号选项,这样您就不必在列表中逐个包含每个命令。例如,这将启用所有四个字母的单词命令:
4lw.commands.whitelist=*
· tcpKeepAlive:(Java系统属性:zookeeper.tcpKeepAlive)3.5.4中的新功能:将该值设置为true会在法定成员用来执行选举的套接字上设置TCP keepAlive标志。这将允许法定成员之间的连接在网络基础设施中断时保持正常。对于长时间运行或空闲的连接,一些网络终端和防火墙可能会终止或失去状态。启用此选项依赖于操作系统级别设置才能正常工作,有关更多信息,请检查您的操作系统中有关TCP保持活动的选项。默认为错误的。
加密、身份验证、授权选项
本节中的选项允许控制服务执行的加密/身份验证/授权。
· digestauthenticationprovider . superdigest:(Java系统属性:zookeeper。digestauthenticationprovider . super digest)默认情况下,此功能为有缺陷的 3.2中的新功能:允许ZooKeeper集合管理员以“超级”用户的身份访问znode层次结构。特别是,对于被认证为超级用户的用户,不会进行ACL检查。org . Apache . zoo keeper . server . auth. DigestAuthenticationProvider可用于生成超级摘要,用一个参数“super:“。提供生成的"超级:"作为系统属性值。向ZooKeeper服务器(从ZooKeeper客户端)进行身份验证时,传递“摘要”方案和“超级:“。请注意,摘要式身份验证以明文形式将身份验证数据传递给服务器,谨慎的做法是仅在本地主机(而不是通过网络)或加密连接上使用此身份验证方法。
· X509AuthenticationProvider .超级用户:(Java系统属性:zookeeper。X509AuthenticationProvider .超级用户)支持SSL的方式,使ZooKeeper集成管理员能够作为“超级”用户访问znode层次结构。当此参数设置为X500主体名称时,只有具有该主体的经过身份验证的客户端才能绕过ACL检查,并对所有节点拥有完全权限。
· zookeeper .超级用户:(Java系统属性:zookeeper .超级用户)类似于zookeeper。X509AuthenticationProvider .超级用户但是对于基于SASL的登录是通用的。它存储可以作为“超级”用户访问znode层次结构的用户名。
· ssl.authProvider:(Java系统属性:zookeeper.ssl.authProvider)指定的子类org . Apache . zoo keeper . auth . x509 authenticationprovider用于安全客户端身份验证。这在不使用JKS的证书密钥基础结构中很有用。可能有必要延长javax.net.ssl.X509KeyManager和javax.net.ssl.X509TrustManager从SSL堆栈中获取所需的行为。要将ZooKeeper服务器配置为使用自定义提供程序进行身份验证,请为自定义身份验证提供程序选择一个方案名称,并设置属性zookeeper.授权提供商.[计划]自定义实现的完全限定类名。这将把提供程序加载到提供程序注册表中。然后设置这个属性zookeeper. SSL . AuthProvider =[方案]该提供商将用于安全认证。
· sslQuorum:(Java系统属性:zookeeper.sslQuorum)3.5.5中的新功能:启用加密的法定通信。默认值为错误的。
· ssl.keyStore.location和ssl.keyStore.password和ssl.quorum.keyStore.location和ssl.quorum.keyStore.password:(Java系统属性:zoo keeper . SSL . KeyStore . location和zoo keeper . SSL . KeyStore . password和zoo keeper . SSL . quorum . KeyStore . location和zoo keeper . SSL . quorum . KeyStore . password)3.5.5中的新功能:指定包含用于客户端和法定TLS连接的本地凭据的Java密钥库的文件路径,以及解锁文件的密码。
· ssl.keyStore.type和ssl.quorum.keyStore.type:(Java系统属性:zookeeper.ssl.keyStore.type和zoo keeper . SSL . quorum . KeyStore . type)3.5.5中的新功能:指定客户端和仲裁密钥库的文件格式。值:JKS、PEM或空(通过文件名检测)。默认值:空
· ssl.trustStore.location和ssl.trustStore.password和ssl.quorum.trustStore.location和ssl.quorum.trustStore.password:(Java系统属性:zoo keeper . SSL . TrustStore . location和zoo keeper . SSL . TrustStore . password和zoo keeper . SSL . quorum . TrustStore . location和zoo keeper . SSL . quorum . TrustStore . password)3.5.5中的新功能:指定指向包含用于客户端和法定TLS连接的远程凭据的Java信任库的文件路径,以及解锁文件的密码。
· ssl.trustStore.type和ssl.quorum.trustStore.type:(Java系统属性:zookeeper.ssl.trustStore.type和zoo keeper . SSL . quorum . TrustStore . type)3.5.5中的新功能:指定客户端和法定信任库的文件格式。值:JKS、PEM或空(通过文件名检测)。默认值:空
· 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和zoo keeper . SSL . quorum . enabledprotocols)3.5.5中的新功能:指定在客户端和法定TLS协商中启用的协议。默认值:的值草案财产
· ssl .密码套件和ssl.quorum .密码套件:(Java系统属性:zookeeper.ssl .密码套件和zookeeper.ssl.quorum .密码套件)3.5.5中的新功能:指定要在客户端和法定TLS协商中使用的已启用密码套件。默认:启用的密码套件取决于使用的Java运行时版本。
· ssl.context.supplier.class和SSL . quorum . context . supplier . class:(Java系统属性:zoo keeper . SSL . context . supplier . class和zoo keeper . SSL . quorum . context . supplier . class)3.5.5中的新功能:指定用于在客户端和仲裁SSL通信中创建SSL上下文的类。这允许您使用自定义的SSL上下文并实现以下场景:
1. 使用硬件密钥库,使用PKCS11或类似工具加载。
2. 您没有访问软件密钥库的权限,但是可以从它们的容器中检索已经构建好的SSLContext。默认值:空
· SSL . hostname验证和SSL . quorum . hostname验证:(Java系统属性:zoo keeper . SSL . hostname验证和zoo keeper . SSL . quorum . hostname验证)3.5.5中的新功能:指定在客户端和法定TLS协商过程中是否启用主机名验证。仅出于测试目的,建议禁用它。默认值:真
· 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和zoo keeper . SSL . quorum . ClientAuth)3.5.5中的新功能:TBD
· SSL . handshakedetectiontimeoutmillis和SSL . quorum . handshakedetectiontimeoutmillis:(Java系统属性:zoo keeper . SSL . handshakedetetectontimeoutmillis和zoo keeper . SSL . quorum . handshakedetectureontimeoutmillis)3.5.5中的新功能:TBD
实验选项/功能
目前被认为是实验性的新特性。
· 只读模式服务器:(Java系统属性:readonlymode.enabled)3.4.0中的新增功能:将此值设置为true将启用只读模式服务器支持(默认情况下禁用)。只读存储器允许请求只读存储器支持的客户端会话连接到服务器,即使服务器可能与法定人数相分离。在这种模式下,只读存储器客户端仍然可以从ZK服务中读取值,但不能写入值和查看其他客户端的更改。详见ZOOKEEER-784。
不安全选项
以下选项可能有用,但在使用时要小心。每个变量的风险都和变量的作用一起被解释。
· forceSync:(Java系统属性:zookeeper.forceSync)要求在完成更新处理之前,将更新同步到事务日志的媒体。如果此选项设置为否,ZooKeeper将不要求更新同步到媒体。
· jute.maxbuffer::(Java系统属性:**jute.maxbuffer**)此选项只能设置为Java系统属性。上面没有zookeeper的前缀。它指定了一个znode中可以存储的数据的最大大小。默认值为0xfffff,或略低于1M。如果更改了此选项,则必须在所有服务器和客户端上设置系统属性,否则会出现问题。这真是一次明智的检查。ZooKeeper被设计成以千字节为单位存储数据。
· skipACL:(Java系统属性:zookeeper.skipACL)跳过ACL检查。这提高了吞吐量,但也向每个人开放了对数据树的完全访问。
· quorumListenOnAllIPs:当设置为真时,ZooKeeper服务器将侦听所有可用的IP地址上来自其对等方的连接,而不仅仅是配置文件的服务器列表中配置的地址。它会影响处理ZAB协议和快速领导者选举协议的连接。默认值为错误的。
禁用数据目录自动创建
3.5中的新功能:ZooKeeper服务器的默认行为是在启动时自动创建数据目录(在配置文件中指定),如果该目录不存在的话。这可能不方便,在某些情况下甚至是危险的。以对正在运行的服务器进行配置更改的情况为例,其中数据目录参数被意外更改。当ZooKeeper服务器重新启动时,它将创建这个不存在的目录,并开始提供服务——使用一个空的znode命名空间。这种情况会导致有效的“大脑分裂”情况(即新的无效目录和原始有效数据存储中的数据)。因此,最好有一个选项来关闭这种自动创建行为。一般来说,对于生产环境来说,这是应该做的,但是不幸的是,默认的遗留行为此时不能被改变,因此这必须在个案的基础上进行。这是留给用户和ZooKeeper发行版的打包者的。
跑步时zkServer.sh通过设置环境变量可以禁用自动创建动物园_数据目录_自动创建_禁用到1。当直接从类文件运行ZooKeeper服务器时,这可以通过设置来实现zoo keeper . datadir . autocreate = false在java命令行上,即-Dzookeeper . data dir . auto create = false
当此功能被禁用,并且ZooKeeper服务器确定所需的目录不存在时,它将生成一个错误并拒绝启动。
新剧本zkServer-initialize.sh来支持这一新功能。如果自动创建被禁用,用户必须首先安装ZooKeeper,然后创建数据目录(可能还有txnlog目录),然后启动服务器。否则,如前一段所述,服务器将不会启动。运转zkServer-initialize.sh将创建所需的目录,并可选地设置myid文件(可选的命令行参数)。即使不使用autocreate特性本身,也可以使用该脚本,并且该脚本可能对用户有用,因为这(设置,包括创建myid文件)在过去一直是用户的问题。请注意,该脚本确保数据目录只存在,它不创建配置文件,而是要求配置文件可用才能执行。
性能调整选项
3.5.0中的新功能:为了提高读取吞吐量,已经对几个子系统进行了改造。这包括NIO通信子系统和请求处理管道(提交处理器)的多线程。NIO是默认的客户机/服务器通信子系统。它的线程模型包括1个接受者线程、1-N选择器线程和0-M套接字输入/输出工作线程。在请求处理流水线中,系统可以被配置成一次处理多个读请求,同时保持相同的一致性保证(相同会话写后读)。提交处理器线程模型包括1个主线程和0-N个工作线程。
默认值旨在最大化专用ZooKeeper机器上的读取吞吐量。两个子系统都需要有足够数量的线程来实现峰值读取吞吐量。
· zoo keeper . nio . numselectorthreads:(仅限于Java系统属性:zoo keeper . nio . numselectorthreads)3.5.0中的新功能:NIO选择器线程的数量。至少需要一个选择器线程。对于大量客户端连接,建议使用多个选择器。默认值为sqrt(CPU内核数/ 2)。
· zookeeper.nio.numWorkerThreads:(仅限于Java系统属性:zookeeper.nio.numWorkerThreads)3.5.0中的新功能:NIO工作线程的数量。如果配置了0个工作线程,选择器线程直接执行套接字输入/输出。默认值是cpu内核数量的2倍。
· zoo keeper . commitprocessor .numworkerThreads:(仅限于Java系统属性:zoo keeper . commitprocessor .numworkerThreads)3.5.0中的新功能:提交处理器工作线程的数量。如果配置了0个工作线程,主线程将直接处理请求。默认值是cpu内核的数量。
· znode . container . CheckInterval:(仅限于Java系统属性)3.5.1中的新功能:候选容器和ttl节点的每次检查的时间间隔(毫秒)。默认值为“60000”。
· znode.container.maxPerMinute:(仅限于Java系统属性)3.5.1中的新功能:每分钟可以删除的最大容器和ttl节点数。这防止了容器删除过程中的羊群行为。默认值为“10000”。
管理服务器配置
3.5.0中的新功能:以下选项用于配置管理服务器。
· admin.enableServer:(Java系统属性:zookeeper.admin.enableServer)设置为“假”以禁用管理服务器。默认情况下,管理服务器处于启用状态。
· 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)相对于根网址列出和发出命令的网址。默认为"/命令"。
使用Netty框架进行沟通
内蒂是一个基于NIO的客户机/服务器通信框架,它简化了(通过NIO直接使用)java应用程序网络级通信的许多复杂性。此外,Netty框架内置了对加密(SSL)和身份验证(证书)的支持。这些是可选功能,可以单独打开或关闭。
在3.5+版本中,ZooKeeper服务器可以通过设置环境变量来使用Netty而不是NIO(默认选项)zoo keeper . ServerCNxNFfactory到org . Apache . zoo keeper . server . NettyservercnxFactory;对于客户端,设置zookeeper.clientCnxnSocket到org . Apache . zoo keeper . clientcnxnsocketnetty。
TBD-netty的调整选项-目前没有netty特定的选项,但是我们应该添加一些。特别是在netty创建的读者工作线程数上限附近。
法定人数
3.5.5中的新功能
基于网络框架,zookeeper集合可以被设置为在其通信信道中使用TLS加密。本节介绍如何在法定通信上设置加密。
请注意,法定TLS封装了对领导者选举和法定通信协议的保护。
1. 创建SSL密钥库JKS以存储本地凭据
应为每个ZK实例创建一个密钥库。
在本例中,我们生成一个自签名证书,并将其与私钥一起存储在中keystore.jks。这适用于测试目的,但是您可能需要一个官方证书来在生产环境中签署您的密钥。
请注意别名(-别名)和可分辨名称(-域名)必须与关联的计算机的主机名匹配,否则主机名验证将不起作用。
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因为不支持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. 在每个节点上启用法定TLS并执行滚动重启:
SSL quorum =True
Portionalization = true
1. 一旦您验证了您的整个系综在TLS上运行,您就可以禁用端口统一并进行另一次滚动重启
SSL quorum =True
Portionalization = false
zookeeper命令
四个字母单词
zookeeper对一小部分命令做出响应。每个命令由四个字母组成。您可以在客户端通过telnet或nc向ZooKeeper发出命令。
三个更有趣的命令:“stat”给出了一些关于服务器和连接的客户端的一般信息,而“srvr”和“cons”分别给出了关于服务器和连接的详细信息。
3.5.3中的新增功能:四个字母单词在使用前需要被明确地白色列出。请参考4lw.commands .白名单如中所述集群配置部分详情。向前看,四个字母单词将被否决,请使用管理服务器相反。
· conf:3.3.0中的新功能:打印服务配置的详细信息。
· 骗局:3.3.0中的新功能:列出连接到此服务器的所有客户端的完整连接/会话详细信息。包括关于接收/发送的分组数量、会话id、操作等待时间、最后执行的操作等的信息...
· crst:3.3.0中的新功能:重置所有连接的连接/会话统计。
· 倾销:列出未完成的会话和临时节点。这只对领导者有效。
· envirosphere company 环球公司:打印服务环境的详细信息
· ruok:测试服务器是否在非错误状态下运行。如果正在运行,服务器将使用imok进行响应。否则它根本不会回应。“imok”的响应不一定表示服务器已加入仲裁,而只是表示服务器进程处于活动状态并绑定到指定的客户端端口。有关状态wrt仲裁和客户端连接信息的详细信息,请使用“stat”。
· srst:重置服务器统计信息。
· srvr:3.3.0中的新功能:列出服务器的全部详细信息。
· 斯达:列出服务器和连接的客户端的简要详细信息。
· wchs:3.3.0中的新功能:列出服务器监视的简要信息。
· wchc:3.3.0中的新功能:按会话列出服务器监视的详细信息。这将输出一个会话(连接)列表以及相关的观察(路径)。请注意,根据手表的数量,这个操作可能很昂贵(即影响服务器性能),请小心使用。
· dirs:3.5.1中的新功能:以字节显示快照和日志文件的总大小
· wchp:3.3.0中的新功能:按路径列出服务器监视的详细信息。这将输出带有关联会话的路径列表(znodes)。请注意,根据手表的数量,这个操作可能很昂贵(即影响服务器性能),请小心使用。
· mntr:3.4.0中的新增功能:输出可用于监控群集运行状况的变量列表。
$ echo mntr | nc localhost 2185
zk_version 3.4.0
zk_avg_latency 0
zk_max_latency 0
zk_min_latency 0
zk_packets_received 70
zk_packets_sent 69
zk_num_alive_connections 1
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 - only exposed by the Leader
zk_synced_followers 4 - only exposed by the Leader
zk_pending_syncs 0 - only exposed by the Leader
zk_open_file_descriptor_count 23 - only available on Unix platforms
zk_max_file_descriptor_count 1024 - only available on Unix platforms
zk_last_proposal_size 23
zk_min_proposal_size 23
输出与java属性格式兼容,内容可能会随着时间而变化(添加了新的键)。您的脚本应该会有变化。注意:有些密钥是特定于平台的,有些密钥仅由领导者导出。输出包含多行,格式如下:
key \t value
· 以色罗:3.4.0中的新增功能:测试服务器是否以只读模式运行。如果处于只读模式,服务器将以“ro”响应,如果不处于只读模式,则以“rw”响应。
· gtmk:以十进制格式的64位带符号长值获取当前跟踪掩码。看见stmk有关可能值的解释。
· stmk:设置当前跟踪掩码。跟踪掩码为64位,其中每一位启用或禁用服务器上特定类别的跟踪日志记录。Log4J必须配置为启用微量级别,以便查看跟踪日志消息。跟踪掩码的位对应于以下跟踪日志记录类别。
跟踪掩码位值 | |
0b0000000000 | 未使用,保留供将来使用。 |
0b0000000010 | 记录客户端请求,不包括ping请求。 |
0b0000000100 | 未使用,保留供将来使用。 |
0b0000001000 | 记录客户端ping请求。 |
0b0000010000 | 记录从当前领导的法定对等方接收的数据包,不包括ping请求。 |
0b0000100000 | 记录客户端会话的添加、删除和验证。 |
0b0001000000 | 记录监视事件到客户端会话的传递。 |
0b0010000000 | 记录从当前领导的法定对等方接收的ping数据包。 |
0b0100000000 | 未使用,保留供将来使用。 |
0b1000000000 | 未使用,保留供将来使用。 |
· 64位值中的所有剩余位都是未使用的,保留供将来使用。通过计算记录值的位或来指定多个跟踪日志记录类别。默认跟踪掩码是0b0100110010。因此,默认情况下,跟踪日志记录包括客户端请求、从领导者接收的数据包和会话。若要设置不同的跟踪掩码,请发送一个包含stmk四个字母的单词,后面是跟踪掩码,表示为64位有符号长值。这个例子使用了Perl包装函数来构造一个跟踪掩码,该掩码启用上述所有跟踪日志记录类别,并将其转换为具有大字节顺序的64位有符号长值。结果被附加到stmk并使用netcat发送到服务器。服务器用十进制格式的新跟踪掩码进行响应。
$ perl -e "print'stmk,pack('q%3E ',0b 0011111010)" | NC localhost 2181
250
这里有一个例子ruok命令:
$ echo ruok | nc127.0.0.1 5111 imok
管理服务器
3.5.0中的新功能:管理服务器是一个嵌入式Jetty服务器,它为四个字母的单词命令提供了一个HTTP接口。默认情况下,服务器在端口8080上启动,通过转到“网址”/“命令/[命令名”发出命令,例如,http://localhost:8080/commands/stat。命令响应作为JSON返回。与原始协议不同,命令不限于四个字母的名称,命令可以有多个名称;例如,“stmk”也可以称为“set_trace_mask”。要查看所有可用命令的列表,请将浏览器指向网址/命令(例如,http://localhost:8080/commands)。看到了吗管理服务器配置选项了解如何更改端口和网址。
默认情况下,管理服务器处于启用状态,但可以通过以下方式禁用:
· 将zookeeper.admin.enableServer系统属性设置为false。
· 从类路径中删除Jetty。(如果您想要覆盖ZooKeeper的码头依赖性,此选项很有用。)
请注意,如果管理员服务器被禁用,则四个字母的TCP字接口仍然可用。
数据文件管理
ZooKeeper将其数据存储在数据目录中,其事务日志存储在事务日志目录中。默认情况下,这两个目录是相同的。服务器可以(也应该)配置为将事务日志文件存储在与数据文件不同的目录中。当事务日志驻留在专用日志设备上时,吞吐量增加,延迟减少。
数据目录
这个目录中有两三个文件:
· myid-在人类可读的ASCII文本中包含代表服务器id的单个整数。
· 初始化-存在表示预计缺少数据树。创建数据树后清理。
· 快照。-保存数据树的模糊快照。
每个ZooKeeper服务器都有一个唯一的id。该id用于两个地方:一个是myid文件和配置文件。这myid文件标识对应于给定数据目录的服务器。配置文件列出了由服务器id标识的每台服务器的联系信息。当ZooKeeper服务器实例启动时,它从myid文件,然后使用该id读取配置文件,查找它应该侦听的端口。
这快照存储在数据目录中的文件是模糊快照,也就是说,在ZooKeeper服务器拍摄快照的过程中,数据树会发生更新。的后缀快照文件名是zxid快照开始时最后提交的事务的ZooKeeper事务id。因此,快照包括在快照过程中发生的数据树更新的子集。因此,快照可能不对应于任何实际存在的数据树,因此我们将其称为模糊快照。不过,ZooKeeper可以使用这个快照进行恢复,因为它利用了更新的幂等性。通过对模糊快照重放事务日志,ZooKeeper在日志末尾获得系统状态。
日志目录
日志目录包含ZooKeeper事务日志。在任何更新发生之前,ZooKeeper确保代表更新的事务被写入非易失性存储。当写入当前日志文件的事务数量达到(可变)阈值时,将启动新的日志文件。使用影响快照频率的相同参数计算阈值(参见上面的快照计数)。日志文件的后缀是写入该日志的第一个zxid。
文件管理
快照和日志文件的格式在独立的ZooKeeper服务器和复制的ZooKeeper服务器的不同配置之间不会改变。因此,您可以将这些文件从正在运行的复制的ZooKeeper服务器拉到具有独立ZooKeeper服务器的开发机器上,以便进行故障排除。
使用旧的日志和快照文件,您可以查看ZooKeeper服务器的先前状态,甚至可以恢复该状态。日志格式器类允许管理员查看日志中的事务。
ZooKeeper服务器创建快照和日志文件,但从不删除它们。数据和日志文件的保留策略在ZooKeeper服务器之外实现。服务器本身只需要最新的完整的模糊快照,所有的日志文件在它之后,最后一个日志文件在它之前。后一个要求是必要的,以包括在该快照启动后发生的更新,但当时已进入现有的日志文件。这是可能的,因为在ZooKeeper中,对日志的快照和滚动是独立进行的。看到了吗保持有关设置保留策略和维护ZooKeeper存储的更多详细信息,请参见本文档的。
注意
存储在这些文件中的数据没有加密。在ZooKeeper中存储敏感数据的情况下,需要采取必要的措施来防止未经授权的访问。此类措施在ZooKeeper之外(例如,控制对文件的访问),并取决于部署它的各个设置。
恢复- TxnLogToolkit
TxnLogToolkit是ZooKeeper附带的命令行工具,它能够恢复带有损坏的循环冗余校验的事务日志条目。
不使用任何命令行参数或使用-h-救命参数,它输出以下帮助页面:
$ bin/zkTxnLogToolkit.sh
usage: TxnLogToolkit [-dhrv] txn_log_file_name
-d,--dump Dump mode. Dump all entries of the log file. (this is the default)
-h,--help Print help message
-r,--recover Recovery mode. Re-calculate CRC for broken entries.
-v,--verbose Be verbose in recovery mode: print all entries, not just fixed ones.
-y,--yes Non-interactive mode: repair all CRC errors without asking
默认行为是安全的:它将给定事务日志文件的条目转储到屏幕上:(与使用相同-d-转储参数)
$ bin/zkTxnLogToolkit.sh log.100000001
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
4/5/18 2:15:58 PM CEST session 0x16295bafcc40000 cxid 0x0 zxid 0x100000001 createSession 30000
CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
4/5/18 2:16:12 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x100000003 createSession 30000
4/5/18 2:17:34 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x200000001 closeSession null
4/5/18 2:17:34 PM CEST session 0x16295bd23720000 cxid 0x0 zxid 0x200000002 createSession 30000
4/5/18 2:18:02 PM CEST session 0x16295bd23720000 cxid 0x2 zxid 0x200000003 create '/andor,#626262,v{s{31,s{'world,'anyone}}},F,1
EOF reached after 6 txns.
在上述事务日志文件的第二个条目中有一个循环冗余校验错误。在倾销模式下,工具包只将这些信息打印到屏幕上,而不触及原始文件。在恢复模式(-r-恢复标志)原始文件仍然保持不变,所有事务都将被复制到一个新的txn日志文件中。固定后缀。它会重新计算循环冗余校验值,并复制计算出的值,如果它不匹配原始的文本条目。默认情况下,该工具以交互方式工作:每当遇到CRC错误时,它都会要求确认。
$ bin/zkTxnLogToolkit.sh -r log.100000001
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
Would you like to fix it (Yes/No/Abort) ?
应答是意味着新计算的循环冗余校验值将输出到新文件。不意味着原始的循环冗余校验值将被复制。流产将中止整个操作并退出。(在这种情况下为“.“fixed”不会被删除并处于半完成状态:仅包含已经处理过的条目,或者如果操作在第一个条目处中止,则仅包含标题。)
$ bin/zkTxnLogToolkit.sh -r log.100000001
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
Would you like to fix it (Yes/No/Abort) ? y
EOF reached after 6 txns.
Recovery file log.100000001.fixed has been written with 1 fixed CRC error(s)
恢复的默认行为是保持沉默:只有出现循环冗余校验错误的条目才会被打印到屏幕上。可以使用打开详细模式-v-冗长参数查看所有记录。可以使用关闭交互模式-是的-是的参数。在这种情况下,所有的循环冗余校验错误都将在新的事务文件中修复。
需要避免的事情
通过正确配置ZooKeeper,您可以避免以下一些常见问题:
· 服务器列表不一致:客户端使用的ZooKeeper服务器列表必须与每个ZooKeeper服务器拥有的ZooKeeper服务器列表相匹配。如果客户端列表是真实列表的一个子集,事情就可以正常工作,但是如果客户端有一个位于不同ZooKeeper集群中的ZooKeeper服务器列表,事情就会变得很奇怪。此外,每个zookeeper服务器配置文件中的服务器列表应该彼此一致。
· 事务日志的放置不正确:ZooKeeper最关键的性能部分是事务日志。ZooKeeper在返回响应之前将事务同步到媒体。专用事务日志设备是保持良好性能的关键。将日志放在繁忙的设备上会对性能产生负面影响。如果您只有一个存储设备,请将跟踪文件放在NFS,并增加快照数量;这并不能消除问题,但应该可以缓解问题。
· 不正确的Java堆大小:您应该特别注意正确设置您的Java最大堆大小。特别是,您不应该创建ZooKeeper交换到磁盘的情况。这个圆盘对zookeeper来说是致命的。一切都是有序的,所以如果处理一个请求交换磁盘,所有其他排队的请求可能也会这样做。磁盘。不要交换。保守估计:如果你有4G的内存,不要将最大堆大小设置为6G甚至4G。例如,您更有可能将3G堆用于4G机器,因为操作系统和缓存也需要内存。评估系统所需堆大小的最佳且唯一推荐的做法是运行负载测试,然后确保您远远低于导致系统交换的使用限制。
· 可公开访问的部署:ZooKeeper集合预计将在可信的计算环境中运行。因此,建议在防火墙后部署ZooKeeper。
最佳实践
为了获得最佳效果,请注意以下良好的zookeeper实践列表:
有关多租户安装,请参见部分详述ZooKeeper的“chroot”支持,这在部署许多应用程序/服务接口到一个ZooKeeper集群时非常有用。