##前言 ZooKeeper 的行为是由 ZooKeeper 配置文件(zoo.cfg)来控制的。假设 ZooKeeper 服务器的磁盘布局是一样的, 那么 ZooKeeper 集群中的所有服务器都可以使用相同的配置文件。如果服务器使用不同的配置文件, 那么必须要保证不同配置文件中的服务器列表相匹配。
##最小配置
最小配置意味着所有的配置文件中必须要包含这些配置选项。
###clientPort 服务器监听客户端连接的端口, 亦即客户端尝试连接到服务器上的指定端口。
###dataDir ZooKeeper 存储内存数据库快照文件的路径, 并且如果没有指定其它路径的话, 数据库更新的事务日志也将存储到该路径下。
注意: 事务日志会影响 ZooKeeper 服务器的整体性能, 所以建议将事务日志放置到由 dataLogDir 参数指定的路径下。
###tickTime 单个 tick 的时间长度, 它是 ZooKeeper 中使用的基本时间单元, 以毫秒为单位。它用来调节心跳和超时时间。例如, 最小会话超时时间是 2 个 tick。
##高级配置 本节的配置选项是可选的。你可以使用它们进一步的优化 ZooKeeper 服务器的行为。有些可以使用 Java 系统属性来设置, 一般的格式是 "zookeeper.keyword"。如果有具体的系统属性, 会在配置选项下面标注出来。
###dataLogDir 没有对应的 Java 系统属性。
该参数用于配置 ZooKeeper 服务器存储事务日志文件的路径, ZooKeeper 默认将事务日志文件和数据快照存储在同一个目录下, 应尽量将它们分开存储。
注意: 将事务日志文件存储到一个专门的日志设备上对于服务器的吞吐量和稳定的延迟有很大的影响。事务日志对磁盘性能要求比较高, 为了保证数据一致性, ZooKeeper 在响应客户端事务请求之前, 需要将请求的事务日志写到磁盘上, 所以事务日志的写入性能直接影响 ZooKeeper 服务器处理请求的吞吐。所以建议给事务日志的输出配置一个单独的磁盘或者挂载点。
###globalOutstandingLimit 对应的 Java 系统属性: zookeeper.globalOutstandingLimit。
客户端提交请求的速度可能比 ZooKeeper 处理的速度快得多, 特别是当客户端的数量非常多的时候。为了防止 ZooKeeper 因为排队的请求而耗尽内存, ZooKeeper 将会对客户端进行限流, 即限制系统中未处理的请求数量不超过 globalOutstandingLimit 设置的值。默认的限制是 1,000。
###preAllocSize 对应的 Java 系统属性: zookeeper.preAllocSize。
用于配置 ZooKeeper 事务日志文件预分配的磁盘空间大小。默认的块大小是 64M。改变块大小的其中一个原因是当数据快照文件生成比较频繁时可以适当减少块大小。比如 1000 次事务会新产生一个快照(参数为snapCount), 新产生快照后会用新的事务日志文件, 假设一个事务信息大小100b, 那么事务日志预分配的磁盘空间大小为100kb会比较好。
###snapCount 对应的 Java 系统属性: zookeeper.snapCount。
ZooKeeper 将事务记录到事务日志中。当 snapCount 个事务被写到一个日志文件后, 启动一个快照并创建一个新的事务日志文件。snapCount 的默认值是 100,000。
###traceFile 对应的 Java 系统属性: requestTraceFile。
如果定义了该选项, 那么请求将会记录到一个名为 traceFile.year.month.day 的跟踪文件中。使用该选项可以提供很有用的调试信息, 但是会影响性能。
注意: requestTraceFile 这个系统属性没有 zookeeper 前缀, 并且配置的变量名称和系统属性不一样。
###maxClientCnxns 没有对应的 Java 系统属性
在 socket 级别限制单个客户端到 ZooKeeper 集群中单台服务器的并发连接数量, 可以通过 IP 地址来区分不同的客户端。它用来阻止某种类型的 DoS 攻击, 包括文件描述符资源耗尽。默认值是 60。将值设置为 0 将完全移除并发连接的限制。
###clientPortAddress 服务器监听客户端连接的地址 (ipv4, ipv6 或 主机名) , 亦即客户端尝试连接到服务器上的地址。该参数是可选的, 默认我们以这样一种方式绑定, 即对于服务器上任意 address/interface/nic, 任何连接到 clientPort 的请求将会被接受。
###minSessionTimeout 没有对应的 Java 系统属性
服务器允许客户端会话的最小超时时间, 以毫秒为单位。默认值是 2 倍的 tickTime。
###maxSessionTimeout 没有对应的 Java 系统属性
服务器允许客户端会话的最大超时时间, 以毫秒为单位。默认值是 20 倍的 tickTime。
###fsync.warningthresholdms 对应的 Java 系统属性: fsync.warningthresholdms。
用于配置 ZooKeeper 进行事务日志 (WAL) fsync 操作消耗时间的报警阈值, 一旦超过这个阈值将会打印输出报警日志。该参数的默认值是 1000, 以毫秒为单位。参数值只能作为系统属性来设置。
###autopurge.snapRetainCount 没有对应的 Java 系统属性。
当启用自动清理功能后, ZooKeeper 将只保留 autopurge.snapRetainCount 个最近的数据快照(dataDir)和对应的事务日志文件(dataLogDir), 其余的将会删除掉。默认值是 3。最小值也是 3。
###autopurge.purgeInterval 没有对应的 Java 系统属性。
用于配置触发清理任务的时间间隔, 以小时为单位。要启用自动清理, 可以将其值设置为一个正整数 (大于 1) 。默认值是 0。
###syncEnabled 对应的 Java 系统属性: zookeeper.observer.syncEnabled。
和参与者一样, 观察者现在默认将事务日志以及数据快照写到磁盘上, 这将减少观察者在服务器重启时的恢复时间。将其值设置为 "false" 可以禁用该特性。默认值是 "true"。
##集群配置选项 本节中的选项主要用于ZooKeeper集群。
###electionAlg 没有对应的 Java 系统属性。
用于选择使用的 leader 选举算法。"0" 对应于原始的基于 UDP 的版本, "1" 对应于快速 leader 选举基于UDP的无身份验证的版本, "2" 对应于快速 leader 选举有基于UDP的身份验证的版本, 而 "3" 对应于快速 leader 选举基于TCP的版本。目前默认值是算法 3。
注意: leader 选举 0, 1, 2 这三种实现已经废弃, 在接下来的版本中将会移除它们, 这样就只剩下 FastLeaderElection 算法。
###initLimit 没有对应的 Java 系统属性。
默认值是 10, 即 tickTime 属性值的 10 倍。它用于配置允许 followers 连接并同步到 leader 的最大时间。如果 ZooKeeper 管理的数据量很大的话可以增加这个值。
###leaderServes 对应的 Java 系统属性: zookeeper.leaderServes。
用于配置 Leader 是否接受客户端连接, 默认值是 "yes", 即 leader 将会接受客户端连接。在 ZooKeeper 中, leader 服务器主要协调事务更新请求。对于事务更新请求吞吐很高而读取请求吞吐很低的情况可以配置 leader 不接受客户端连接, 这样就可以专注于协调工作。
注意: 当 ZooKeeper 集群中服务器的数量超过 3 个时, 建议开启 leader 选举。
###server.x=[hostname]:nnnnn:nnnnn 没有对应的 Java 系统属性。
组成 ZooKeeper 集群的服务器。当服务器启动时, 可以通过查找数据目录中的 myid 文件来决定它是哪一台服务器。myid 文件包含服务器编号, 并且它要匹配 "server.x" 中的 x。
客户端用来组成 ZooKeeper 集群的服务器列表必须和每个 ZooKeeper 服务器中配置的 ZooKeeper 服务器列表相匹配。
有两个端口号 nnnnn, 第一个是 followers 用来连接到 leader, 第二个是用于 leader 选举。如果想在单台机器上测试多个服务, 则可以为每个服务配置不同的端口。
###syncLimit 没有对应的 Java 系统属性。
默认值是 5, 即 tickTime 属性值的 5 倍。它用于配置leader 和 followers 间进行心跳检测的最大延迟时间。如果在设置的时间内 followers 无法与 leader 进行通信, 那么 followers 将会被丢弃。
###group.x=nnnnn[:nnnnn] 没有对应的 Java 系统属性。
Enables a hierarchical quorum construction."x" 是一个组的标识, 等号右边的数字对应于服务器的标识. 赋值操作右边是冒号分隔的服务器标识。注意: 组必须是不相交的, 并且所有组联合后必须是 ZooKeeper 集群。
###weight.x=nnnnn 没有对应的 Java 系统属性。
和 "group" 一起使用, 当形成集群时它给每个服务器赋权重值。这个值对应于投票时服务器的权重。ZooKeeper 中只有少数部分需要投票, 比如 leader 选举以及原子的广播协议。服务器权重的默认值是 1。如果配置文件中定义了组, 但是没有权重, 那么所有服务器的权重将会赋值为 1。
###cnxTimeout 对应的 Java 系统属性: zookeeper.cnxTimeout。
用于配置 leader选举过程中,打开一次连接(选举的 server 互相通信建立连接)的超时时间。默认值是 5s。
##身份认证和授权选项 本节的选项允许通过身份认证和授权来控制服务执行。
###zookeeper.DigestAuthenticationProvider.superDigest 对应的 Java 系统属性: zookeeper.DigestAuthenticationProvider.superDigest。
该功能默认是禁用的。
能够使 ZooKeeper 集群管理员可以作为一个 "super" 用户来访问 znode 层级结构。特别是对于一个已经认证为超级管理员的用户不需要 ACL 检查。
org.apache.zookeeper.server.auth.DigestAuthenticationProvider 可以用来生成 superDigest, 调用它带有 "super:<password>" 参数的方法。当启动集群中的每台服务器时, 将生成的 "super:<data>" 作为系统属性提供。
当 ZooKeeper 客户端向 ZooKeeper 服务器进行身份认证时, 会传递一个 "digest" 和 "super:<password>" 的认证数据. 注意摘要式身份验证将认证数据以普通文本的形式传递给服务器, 在网络中需要谨慎使用该认证方法, 要么只在本机上或通过一个加密的连接。
##实验性选项/特性 本节列举了一些目前还处于实验阶段的新特性。
###服务器只读模式 对应的 Java 系统属性: readonlymode.enabled。
将其设置为 true 将会启用服务器只读模式支持, 默认是禁用的。ROM 允许请求了 ROM 支持的客户端会话连接到服务器, 即使当服务器可能已经从集群中分隔出去。在该模式中, ROM 客户端仍然可以从 ZK 服务中读取值, 但是不能进行写操作以及看见其它客户端所做的一些变更。更多详细信息可以参见 ZOOKEEPER-784 获取更多详细信息。 ###不安全的选项 下面的选项会很有用, 但是使用的时候需要特别小心。
####forceSync 对应的 Java 系统属性: zookeeper.forceSync。
用于配置是否需要在事务日志提交的时候调用 FileChannel.force 来保证数据完全同步到磁盘。默认值是 "yes"。如果该选项设置为 "no", ZooKeeper 将不会强制同步事务更新日志到磁盘。
####jute.maxbuffer: 对应的 Java 系统属性: jute.maxbuffer。没有 zookeeper 前缀。
用于指定一个 znode 中可以存储数据量的最大值, 默认值是 0xfffff, 或 1M 内。如果这个选项改变了, 那么该系统属性必须在所有的服务端和客户端进行设置, 否则会出现问题。ZooKeeper 是按照字节大小顺序来存储数据的。
####skipACL 对应的 Java 系统属性: zookeeper.skipACL。
用于配置 ZooKeeper 服务器跳过 ACL 权限检查。这将一定程度的提高服务器吞吐量, 但是也向所有客户端完全开放数据访问。
####quorumListenOnAllIPs 当设置为 true 时, ZooKeeper 服务器将会在所有可用的 IP 地址上监听来自其对等点的连接请求, 而不仅是配置文件的服务器列表中配置的地址。它会影响处理 ZAB 协议和 Fast Leader Election 协议的连接。默认值是 false。
##参考资料 http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_configuration