前言

zookeeper是分布式大数据平台的核心枢纽,没有了它,很多依赖它的分布式直接是无可奈何,它就像是一个催化剂一样,默默无闻的辅助着各类工具的稳定和运行. (kafka,habse ,clickhouse ,hdfs…).我这里简单描述 一下,zookeeper常用参数的细节优化

一.配置

1.配置snapshot文件清理策略

autopurge.purgeInterval=1
autopurge.purgeInterval:开启清理事务日志和快照文件的功能,单位是小时。默认是0,表示不开启自动清理功能。
autopurge.snapRetainCount=10
autopurge.snapRetainCount:指定了需要保留的文件数目。默认是保留3个。

2. 限制snapshot数量

snapCount=3000000
每snapCount次事务日志输出后,触发一次快照(snapshot)。 ZooKeeper会生成一个snapshot文件和事务日志文件。 默认是100000。

3. log和data数据分磁盘存储

dataDir:存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。
dataLogDir:事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能。

4、ZooKeeper的磁盘建议使用SSD

如果数据在TB级别以上,且复制表的数量比较多,超过100个,建议使用SSD磁盘。提升ZooKeeper的响应速度,避免ClickHouse副本间数据同步的延迟。

5 .调整JVM大小

ZooKeeper的JVM内存默认是根据操作系统本身内存大小的一个百分比预先分配的,所以这不是我们所需要的。

在./bin/zkEnv.sh文件中,有如下配置项:
if [ -f “ Z O O C F G D I R / j a v a . e n v " ] t h e n . " ZOOCFGDIR/java.env" ] then . " ZOOCFGDIR/java.env"]then."ZOOCFGDIR/java.env”
fi
我们在./conf/java.env文件中配置JVM的内存,增加如下配置:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
export JVMFLAGS="-Xms10240m -Xmx20480m $JVMFLAGS"
修改完成使用jmap -heap $pid来验证内存修改情况。

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 21474836480 (20480.0MB)
NewSize = 3578789888 (3413.0MB) # 设置年轻代大小
MaxNewSize = 7158104064 (6826.5MB)
OldSize = 7158628352 (6827.0MB) # 设置年老代大小
NewRatio = 2 # 设置年轻代和年老代的比值。2表示年轻代与年老代比值为1:2,年轻代占整个年轻代年老代和的1/3
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

6、其他重要常规配置

tickTime=2000
ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。 默认值2000,单位毫秒。

initLimit=10
Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,Flower在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。
initLimit=30000

syncLimit=5
在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果Leader发出心跳包在syncLimit之后,还没有从Flower那里收到响应,那么就认为这个Flower已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。 建议设置为10。

maxClientCnxns :
单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
建议设置为2000

maxSessionTimeout=60000000
Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围

preAllocSize=131072
预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。单位kb。

最后给出一个合理的参考

配置:

tickTime=2000

initLimit=30000
syncLimit=10

maxClientCnxns=2000
maxSessionTimeout=60000000

dataDir=/opt/zookeeper/{{ cluster['name'] }}/data
dataLogDir=/opt/zookeeper/{{ cluster['name'] }}/logs

autopurge.purgeInterval=1
autopurge.snapRetainCount=10

snapCount=3000000

preAllocSize=131072

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐