Zookeeper 配置文件:核心参数优化与实操指南

文章目录

  • 一、核心参数优化详解
    • [1.1 tickTime:Client-Server通信心跳时间](#1.1 tickTime:Client-Server通信心跳时间)
    • [1.2 initLimit:Leader-Follower初始通信时限](#1.2 initLimit:Leader-Follower初始通信时限)
    • [1.3 syncLimit:Leader-Follower同步通信时限](#1.3 syncLimit:Leader-Follower同步通信时限)
    • [1.4 dataDir:数据文件目录](#1.4 dataDir:数据文件目录)
    • [1.5 clientPort:客户端连接端口](#1.5 clientPort:客户端连接端口)
  • 二、优化操作说明
    • [2.1 jvm配置](#2.1 jvm配置)
    • [2.2 log4j配置](#2.2 log4j配置)
    • [2.3 ACL验证忽略](#2.3 ACL验证忽略)

一、核心参数优化详解

1.1 tickTime:Client-Server通信心跳时间

Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。

tickTime=2000

1.2 initLimit:Leader-Follower初始通信时限

集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。

initLimit=5

1.3 syncLimit:Leader-Follower同步通信时限

集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。

syncLimit=2

1.4 dataDir:数据文件目录

Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。

dataDir=/opt/zookeeper/data

1.5 clientPort:客户端连接端口

客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

clientPort=2181

服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)

这个配置项的书写格式比较特殊,规则如下:

复制代码
server.N=YYY:A:B
server.1=itcast05:2888:3888
server.2=itcast06:2888:3888
server.3=itcast07:2888:3888

ALLOW_ANONYMOUS_LOGIN=yes

表明zookeeper会读取该环境变量,从字面意思也可知,该参数配置的为是否可以让匿名用户访问服务,说白了也就是游客也可以访问。

ZOO_LISTEN_ALLIPS_ENABLED

二、优化操作说明

2.1 jvm配置

默认jvm没有配置Xmx、Xms等信息,可以在conf目录下创建java.env文件。

export JVMFLAGS="-Xms512m -Xmx512m $JVMFLAGS"

2.2 log4j配置

log4j配置,由于zk是通过nohup启动的,会有一个zookeeper.out日志文件,该文件中记录的是输出到console的日志。

log4j中只要配置输出到console即可,zookeeper.out日积月累会不断变大,要放在容量大的磁盘上。

复制代码
zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
log4j.rootLogger=${zookeeper.root.logger}
 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

zoo.cfg文件中,dataDir是存放快照数据的,dataLogDir是存放写前日志的。

这两个目录不要配置成一个路径,要配置到不同的磁盘上。

如果磁盘是使用了raid,系统就一块磁盘,那配置到一块磁盘上也可以。

写前日志的部分对写请求的性能影响很大,保证dataLogDir所在磁盘性能良好。

2.3 ACL验证忽略

zoo.cfg文件中skipACL=yes,忽略ACL验证,可以减少权限验证的相关操作,提升一点性能。

zoo.cfg文件中forceSync=no,这个对写请求的性能提升很有帮助,是指每次写请求的数据都要从pagecache中固化到磁盘上,才算是写成功返回。

当写请求数量到达一定程度的时候,后续写请求会等待前面写请求的forceSync操作,造成一定延时。

如果追求低延时的写请求,配置forceSync=no,数据写到pagecache后就返回。但是机器断电的时候,pagecache中的数据有可能丢失。

zk的dataDir和dataLogDir路径下,如果没有配置zk自动清理,会不断的新增数据文件。可配置成zk系统自动清理数据文件,但是最求系统最高性能的话,建议人工手动清理文件:

复制代码
zkCleanup.sh -n 3  #这样保留三份文件。

查看zk节点状态。重新启动zk节点前后,一定要查看状态

复制代码
echo ruok | nc host port
echo stat | nc host port

配置fsync.warningthresholdms=20,单位是毫秒,在forceSync=yes的时候,如果数据固化到磁盘的操作fsync超过20ms的时候,将会在zookeeper.out中输出一条warn日志。

这个目前zk的3.4.5和3.5版本有bug,在zoo.cfg中配置不生效。我的做法是在conf/java.env中添加java系统属性:

1

export JVMFLAGS="-Dfsync.warningthresholdms=20 $JVMFLAGS"

相关推荐
运维栈记7 小时前
如何排错运行在Kubernetes集群中的服务?
云原生·容器·kubernetes
阿里云云原生8 小时前
直播回顾丨详解阿里云函数计算 AgentRun,手把手带你走进 Agentic AI 生产时代
云原生
ChaITSimpleLove9 小时前
基于 .NET Garnet 1.0.91 实现高性能分布式锁(使用 Lua 脚本)
分布式·.net·lua
yumgpkpm9 小时前
Iceberg在Cloudera CDP集群详细操作步骤
大数据·人工智能·hive·zookeeper·spark·开源·cloudera
原神启动111 小时前
Kafka详解
分布式·kafka
yumgpkpm12 小时前
Iceberg在Hadoop集群使用步骤(适配AI大模型)
大数据·hadoop·分布式·华为·zookeeper·开源·cloudera
元气满满-樱13 小时前
分布式LNMP部署
分布式
Wang's Blog14 小时前
RabbitMQ: 声明式配置简化管理
分布式·rabbitmq
叫致寒吧15 小时前
zookeeper与kafka
分布式·zookeeper·云原生
赵得C15 小时前
2025下半年软件设计师考前几页纸
java·开发语言·分布式·设计模式·性能优化·软考·软件设计师