Young's blog Young's blog
首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Young

首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Zookeeper入门相关概念总结
  • Zookeeper安装与使用实战
  • Zookeeper配置文件详解
    • 2.1 一般选项
    • 2.2 集群选项
    • 3.1 事务日志和快照相关的配置项
    • 3.2 事务日志和快照的命名规则
  • Zookeeper一致性协议——ZAB
  • Zookeeper实战之客户端Curator vs zkClient
  • 万字总结Zookeeper客户端Curator操作Api
  • Zookeeper
andanyang
2023-04-06
目录

Zookeeper配置文件详解

# ZooKeeper 的配置文件详解

zkServer.sh 读取的默认配置文件是$ZOOKEEPER_HOME/conf/zoo.cfg。如果要用其它配置文件。如下传递配置文件参数:

zkServer.sh start  your_config
zkServer.sh stop   your_config
zkServer.sh status your_config
1
2
3

配置文件的官方说明:https://zookeeper.apache.org/doc/r3.6.2/zookeeperAdmin.html#sc_configuration (opens new window)

以下是 ZooKeeper 的配置文件中各配置项的解释,分两部分:一部分是 ZooKeeper 正常运行所必须的配置项(只有 3 项),一部分是非必须项。

# 1.必须配置项

下面 3 项是 ZooKeeper 正常运行所必须配置的。

  • clientPort: 向外提供服务的端口号。换句话说,是给客户端连接的端口。
  • dataDir: ZooKeeper 的数据目录,主要目的是存储内存数据库序列化后的快照路径。如果没有配置事务日志(即 dataLogDir 配置项)的路径,那么 ZooKeeper 的事务日志也存放在数据目录中。
  • tickTime: tick 的中文意思是"嘀的一声",tickTime 指的是滴答一声的时间长度。在 ZooKeeper 中,它是所有涉及到时间长度的单元,单位为毫秒,就相当于时钟里的秒单元一样。例如,tickTime=2000;initLimit=5,表示 initLimit 的时间为"嘀嗒"5 次,长度为2000*5=10秒。tickTime 隐含了心跳时间(即心跳时间为 tickTime),还隐含了客户端和服务器之间保持的会话的最小和最大超时时间(最小 2 倍 tickTime,最大 20 倍 tickTime)。

# 2.其它配置项

# 2.1 一般选项

  • maxClientCnxns: 在套接字级别上限制同一客户端的并发连接数。因为同一客户端 IP 地址相同,可能会调度到同一个 ZooKeeper 服务器节点上。这个配置项是为了避免 DoS 攻击。默认值为 60,设置为 0 表示不做任何限制。
  • clientPortAddress: 指定为客户端提供服务的监听地址(ipv4/ipv6)。换句话说,clientPort 将只绑定在地址上。如果不设置该选项,将默认监听在所有地址上(0.0.0.0)。
  • minSessionTimeout:
  • maxSessionTimeout: 客户端和服务端会话保持的最小、最大超时时间。ZooKeeper 的很多数据和状态都和会话绑定。假如客户端和服务端成功建立连接(会话)后,正常情况下,客户端会时不时地向服务端发送心跳,如果这个服务端或者客户端挂了,它们之间的会话要保持多长时间。
  • fsync.warningthresholdms: 事务日志输出时,如果调用 fsync 方法超过此处指定的超时时间,那么会在日志中输出警告信息。默认是 1000ms。
  • autopurge.snapRetainCount: 该配置项指定开启了 ZooKeeper 的自动清理功能后(见下一个配置项),每次自动清理时要保留的版本数量。默认值为 3,最小值也为 3。它表示在自动清理时,会保留最近 3 个快照以及这 3 个快照对应的事务日志。其它的所有快照和日志都清理。
  • autopurge.purgeInterval: 指定触发自动清理功能的时间间隔,单位为小时,值为大于或等于 1 的整数,默认值为 0,表示不开启自动清理功能。
  • syncEnabled: 指定观察者(observers)是否像 follower 一样,也记录事务日志和快照,以便在 observers 重启时能加速恢复。默认值为 true,设置为 false 表示禁用该功能,不记录日志和快照。

# 2.2 集群选项

在配置 ZooKeeper 集群时可能用到的配置项。

  • electionAlg: 指定 leader 选举算法。默认值为 3,表示使用基于 TCP 的快速选举。在以前的版本中,还有 0/1/2 三种算法,它们都是基于 UDP 的,已经废弃了,以后的版本中会移除这三种算法。

  • initLimit: followers 启动时需要连接 leader,并从 Leader 处获取它所缺失的那部分数据,以便它能和 leader 的数据保持同步。只有保持了同步,该 follower 才被标记为 ONLINE,然后才能提供服务。这个配置项限定从 follower 启动到恢复完成的超时时间。一般情况下,ZooKeeper 保存的都是协调数据,数据量不会很大,但如果要同步的数据很大,可以考虑增大这个选项的值。注意,这个值依赖于 tickTime 时间单元,例如tickTime=2000,initLimit=2表示 4 秒。

  • syncLimit: follower 和 leader 之间数据延迟的最大时间长度。例如,有个节点的更新操作缓慢,它的数据已经严重落后于 leader,ZooKeeper 就会将它从 ZooKeeper 集群中踢出去。ZooKeeper 使用时间来度量 follower 和 leader 之间数据的延迟,这个选项的值依赖于 tickTime,例如tickTime=2000,syncLimit=2表示 follower 比 leader 延迟了 4 秒。

  • leaderServes: 默认值为 yes,表示 leader 也接受客户端的连接,接受来自客户端的读、写请求。leader 的主要作用是协调 ZooKeeper 集群服务器节点间的写操作,如果想要获取更高的写吞吐量,可以将其设置为 no,这样 leader 将不允许客户端的连接,它将专注于协调,但这会损失一点读吞吐量。

  • server.x=[hostname]:port_A:port_B
    
    1

    指定 ZooKeeper 集群中的服务器节点。有几个 server 节点,就给几个这个配置项,所有节点上的这部分配置要一致。

    • X:整数。是 ZooKeeper 中服务器的一个简单标识。这个数值需要和 dataDir 下的 myid 文件内容一致。在启动 ZooKeeper 集群中的每个实例时,需要读取 dataDir 中的 myid 文件,并将该文件中的数值和配置文件中的 server.X 做匹配,匹配到哪个就表示是哪个 ZooKeeper 服务器节点。
    • hostname:ZooKeeper 服务器节点的地址。
    • port_A:这是第一个端口,用于 Follower 和 Leader 之间的数据同步和其它通信。
    • port_B:这是第二个端口,用于 Leader 选举过程中投票通信。

    如果要配置的 ZooKeeper 的伪集群(多个 ZooKeeper 实例运行在同一机器上),每个 server.X 中的 X、port_A 和 port_B 必须不能相同。

    例如,3 个服务器节点的伪集群 ZooKeeper,数据目录分别为/zk/data1,/zk/data2,/zk/data3。可以这样配置。

    server.1=localhost:2881:3881
    server.2=localhost:2882:3882
    server.3=localhost:2883:3883
    
    1
    2
    3

    然后在 data1/myid、data2/myid、data3/myid 中分别写入 1、2、3(需要和 X 值对应)。

  • group.x=A[:B]:

  • weight.y=N
    
    1

    这两个一起用,用于启用分层仲裁功能。group 命令用于将 ZooKeeper 集群中的服务器节点进行分组。如果没有使用 group 选项,则 ZooKeeper 默认将所有服务器节点归入一个默认组中。weight 命令用于为每个服务器节点指定权重值,权重越高,投票时能投的票数越多。如果不配置 weight 命令,则所有节点的默认权重值为 1。

    • x:分组 id。整数值。
    • A:B:C...:用冒号分隔的服务器节点列表,表示这几个节点属于同一个组。整数值,取自 server.X 中的 X。例如,上面 server.x 中的示例,group.1=1:2:3表示将这 3 个节点放进一个 id=1 的组中。
    • y:取自 server.X 中的 X。
    • N:为该服务器节点指定的权重值。 例如,9 个节点的 ZooKeeper 集群,分成 3 组:
    server.1=aaaa
    server.2=aaaa
    server.3=aaaa
    server.4=aaaa
    server.5=aaaa
    server.6=aaaa
    server.7=aaaa
    server.8=aaaa
    server.9=aaaa
     
    group.1=1:2:3
    group.2=4:5:6
    group.3=7:8:9
     
    weight.1=1
    weight.2=1
    weight.3=1
    weight.4=1
    weight.5=1
    weight.6=1
    weight.7=1
    weight.8=1
    weight.9=1
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    当需要仲裁时,首先过滤掉权重值为 0 的组(即组中所有节点权重都为 0),然后判断,如果组中有大多数节点投票的组达到了大多数组的要求,仲裁就通过。换个理解方式,就是先在组内投票,然后组自身投票。组内投票数达到了该组的大多数,这个组就有一票。如果投票的组数量达到了总组数的大多数(不考虑权重为 0 的组),则整个仲裁就通过。

  • cnxTimeout: 在投票选举新的 leader 时,需要通过选举端口建立连接来发送通知信息。该配置项设置打开这个连接的超时时长。默认值为 5。

  • ipReachableTimeout: 3.4.11 版本中才引入的配置项。当解析主机名时,为可访问的 IP 地址设置此超时值,单位毫秒。默认情况下,ZooKeeper 将使用主机名的第一个 IP 地址(不做任何 reachable 检查)。设置 ipReachableTimeout(大于 0)后,ZooKeeper 将尝试获取第一个可访问的 IP 地址。这是通过调用 Java API 函数InetAddress.isreavailable(long timeout)实现的。其中使用了这个超时值。如果找不到这样的 IP 地址,主机名的第一个 IP 地址将被使用。

# 3. 事务日志和快照

ZooKeeper 有两种日志、一种快照。日志分为事务日志和 ZooKeeper 运行时的系统日志。

ZooKeeper 集群中的每个服务器节点每次接收到写操作请求时,都会先将这次请求发送给 leader,leader 将这次写操作转换为带有状态的事务,然后 leader 会对这次写操作广播出去以便进行协调。当协调通过(大多数节点允许这次写)后,leader 通知所有的服务器节点,让它们将这次写操作应用到内存数据库中,并将其记录到事务日志中。

当事务日志记录的次数达到一定数量后(默认 10W 次),就会将内存数据库序列化一次,使其持久化保存到磁盘上,序列化后的文件称为"快照文件"。每次拍快照都会生成新的事务日志。

有了事务日志和快照,就可以让任意节点恢复到任意时间点(只要没有清理事务日志和快照)。

# 3.1 事务日志和快照相关的配置项

  • dataDir: ZooKeeper 的数据目录,主要目的是存储内存数据库序列化后的快照路径。如果没有配置事务日志(即 dataLogDir 配置项)的路径,那么 ZooKeeper 的事务日志也存放在数据目录中。
  • dataLogDir: 指定事务日志的存放目录。事务日志对 ZooKeeper 的影响非常大,强烈建议事务日志目录和数据目录分开,不要将事务日志记录在数据目录(主要用来存放内存数据库快照)下。
  • preAllocSize: 为事务日志预先开辟磁盘空间。默认是 64M,意味着每个事务日志大小就是 64M(可以去事务日志目录中看一下,每个事务日志只要被创建出来,就是 64M)。如果 ZooKeeper 产生快照频率较大,可以考虑减小这个参数,因为每次快照后都会切换到新的事务日志,但前面的 64M 根本就没写完。(见 snapCount 配置项)
  • snapCount: ZooKeeper 使用事务日志和快照来持久化每个事务(注意是日志先写)。该配置项指定 ZooKeeper 在将内存数据库序列化为快照之前,需要先写多少次事务日志。也就是说,每写几次事务日志,就快照一次。默认值为 100000。为了防止所有的 ZooKeeper 服务器节点同时生成快照(一般情况下,所有实例的配置文件是完全相同的),当某节点的先写事务数量在(snapCount/2+1,snapCount)范围内时(挑选一个随机值),这个值就是该节点拍快照的时机。
  • autopurge.snapRetainCount: 该配置项指定开启了 ZooKeeper 的自动清理功能后(见下一个配置项),每次自动清理时要保留的版本数量。默认值为 3,最小值也为 3。它表示在自动清理时,会保留最近 3 个快照以及这 3 个快照对应的事务日志。其它的所有快照和日志都清理。
  • autopurge.purgeInterval: 指定触发自动清理功能的时间间隔,单位为小时,值为大于或等于 1 的整数,默认值为 0,表示不开启自动清理功能。

# 3.2 事务日志和快照的命名规则

在 ZooKeeper 集群启动后,当第一个客户端连接到某个服务器节点时,会创建一个会话,这个会话也是事务,于是创建第一个事务日志,一般名为log.100000001,这里的 100000001 是这次会话的事务 id(zxid)。之后的事务都将写入到这个文件中,直到拍下一个快照。

如果是事务 ZXID5 触发的拍快照,那么快照名就是 snapshot.ZXID5,拍完后,下一个事务的 ID 就是 ZXID6,于是新的事务日志名为 log.ZXID6。

编辑 (opens new window)
上次更新: 2024/04/19, 08:52:45
Zookeeper安装与使用实战
Zookeeper一致性协议——ZAB

← Zookeeper安装与使用实战 Zookeeper一致性协议——ZAB→

最近更新
01
idea 热部署插件 JRebel 安装及破解,不生效问题解决
04-10
02
spark中代码的执行位置(Driver or Executer)
12-12
03
大数据技术之 SparkStreaming
12-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Young | MIT License
浙ICP备20002744号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式