Optimization for ZooKeeper in High Load Scenarios

Zookeeper 架构

Zookeeper为公司Kafka集群和Clickhouse集群提供分布式协调(Distributed Coordination), 一致性保证以及故障恢复功能。平均每个节点需要处理的Transcation在3000次/Sencond以上。
集群信息:

Zookeeper version: 3.8.4
node: 3
Disk IO: 10K IPOS

  • 遇到的问题
    Zookeeper节点的Disk I/O Utilization 一直在升高,已经接近80%, 需要进行优化

  • 事务snapshot log file

-rw-r--r-- 1 ubuntu ubuntu  88M Mar 26 09:00 snapshot.120bededf4
-rw-r--r-- 1 ubuntu ubuntu 88M Mar 26 09:00 snapshot.120bef485e
-rw-r--r-- 1 ubuntu ubuntu 88M Mar 26 09:01 snapshot.120bf015a4
-rw-r--r-- 1 ubuntu ubuntu 87M Mar 26 09:01 snapshot.120bf10f1f
-rw-r--r-- 1 ubuntu ubuntu 87M Mar 26 09:02 snapshot.120bf27122
-rw-r--r-- 1 ubuntu ubuntu 87M Mar 26 09:03 snapshot.120bf33b07
-rw-r--r-- 1 ubuntu ubuntu 86M Mar 26 09:03 snapshot.120bf43603
-rw-r--r-- 1 ubuntu ubuntu 86M Mar 26 09:04 snapshot.120bf57674
-rw-r--r-- 1 ubuntu ubuntu 85M Mar 26 09:05 snapshot.120bf6bfe5
-rw-r--r-- 1 ubuntu ubuntu 85M Mar 26 09:05 snapshot.120bf7ae1f
-rw-r--r-- 1 ubuntu ubuntu 85M Mar 26 09:06 snapshot.120bf8b730
-rw-r--r-- 1 ubuntu ubuntu 84M Mar 26 09:06 snapshot.120bf9bd2c
-rw-r--r-- 1 ubuntu ubuntu 84M Mar 26 09:07 snapshot.120bfa8115
-rw-r--r-- 1 ubuntu ubuntu 83M Mar 26 09:07 snapshot.120bfb9874
-rw-r--r-- 1 ubuntu ubuntu 84M Mar 26 09:08 snapshot.120bfcceeb
-rw-r--r-- 1 ubuntu ubuntu 85M Mar 26 09:09 snapshot.120bfe27d0
-rw-r--r-- 1 ubuntu ubuntu 86M Mar 26 09:09 snapshot.120bff5e88
-rw-r--r-- 1 ubuntu ubuntu 85M Mar 26 09:10 snapshot.120c00bed2

计算单个node事务数/Second:

17 * 100000 / 10 / 60 = 2,833.3 次/S

优化方案

增加Node的Disk挂载,将snapshot file 和 transcation log file写入到不同的盘中,同时优化snapshot file 和 transcation log file的落盘策略

增加 Disk挂载

配置zoo.cfg


#dataLogDir: trancation log
dataDir=/data0/zookeeper-data/

#snapshot log
dataLogDir=/data1/zookeeper-data/txnlog/

关于dataDir与dataLogDir,官方文档的说明

https://zookeeper.apache.org/doc/r3.1.2/zookeeperAdmin.html

优化snapshot file 和 transcation log file的持久化存储策略


#before
# 1kb log
preAllocSize=1024

# snap transaction log auto clean , keep 5 ,delete 1h/times
autopurge.snapRetainCount=3
autopurge.purgeInterval=8
snapCount=1000000

操作

sudo systemctl daemon-reload
sudo systemctl stop zookeeper.service

迁移trancation log file 到指定

#备份
cp -r /data0/zookeeper-data/ /data0/zookeeper-data-back-0327
mkdir -p /data1/zookeeper-data/txnlog/version-2/
mv /data0/zookeeper-data/version-2/log.* /data1/zookeeper-data/txnlog/version-2/

sudo systemctl start zookeeper.service && tail -f /data/zookeeper-bin/logs/zookeeper.log