
本文将介绍如何解决 Druid Database Kafka Zookeeper 中出现的“unable to load data base on disk”问题的详细步骤。
#作者: Yuancheng Liu
#创建日期: 2022/10/12
#版本: v_0.0.1
#版权: 版权所有 (c) LiuYuancheng
1. 背景介绍
Apache Druid 是一个开源的分布式数据存储,专为高性能实时分析而设计。它结合了数据仓库、时序数据库和搜索系统的概念,使其成为大型数据可视化平台的流行选择。在许多部署中,Apache Kafka 被用作 Druid 的流式摄取管道,实现数据持续流入系统。
2. 问题概述
在运行过程中,您的 Druid 集群可能会遇到一个关键问题:
ZooKeeper error: “Unable to load database on disk”
这通常在以下场景中发生:
-
在短时间内摄取大量流数据
-
在数据摄取过程中,一个或多个数据节点离线
-
恢复后,一个或多个 Apache ZooKeeper pod 无法正常启动
即使在重启 pod、重新部署 ZooKeeper 或重新安装组件后,问题仍然存在。详细的 pod 错误消息如下所示:
2022-05-08 14:30:34,798 [myid:5] - INFO [main:ZKAuditProvider@42] - ZooKeeper audit is disabled
2022-05-08 14:30:34,801 [myid:5] - ERROR [main:QuorumPeer@1191] - Unable to load database on disk
java.io.IOException: Unreasonable length = 86389682
at org.apache.jute.BinaryInputArchive.checkLength(BinaryInputArchive.java:166)
at org.apache.jute.BinaryInputArchive.readBuffer(BinaryInputArchive.java:127)
at org.apache.zookeeper.server.persistence.Util.readTxnBytes(Util.java:159)
at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.java:749)
at org.apache.zookeeper.server.persistence.FileTxnSnapLog.fastForwardFromEdits(FileTxnSnapLog.java:361)
at org.apache.zookeeper.server.persistence.FileTxnSnapLog.lambda$restore$0(FileTxnSnapLog.java:267)
at org.apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.java:312)
at org.apache.zookeeper.server.ZKDatabase.loadDataBase(ZKDatabase.java:286)
at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:1145)
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:1130)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:229)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:137)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91)
2022-05-08 14:30:34,803 [myid:5] - ERROR [main:QuorumPeerMain@114] - Unexpected exception, exiting abnormally
java.lang.RuntimeException: Unable to run quorum server
at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:1192)
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:1130)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:229)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:137)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91).
3. 问题分析
3.1 根本原因分析
此问题通常由 ZooKeeper 中**损坏或过大的快照/事务日志文件**引起。
主要影响因素:
-
Druid 历史节点在高负载下从 ZooKeeper 请求大量段元数据
-
节点故障期间生成损坏的快照或事务日志
-
ZooKeeper 持久化这些快照以避免数据丢失
-
损坏的快照**传播回**健康或新创建的 ZooKeeper pod
结果是:
-
ZooKeeper pod 在启动期间反复失败
-
集群可能失去法定人数(≥50% 故障),导致**服务完全中断**
-
仅重新安装无法解决问题,因为损坏的数据会被重新引入
3.2 手动清理的挑战
手动修复此问题很困难,因为:
-
损坏的文件可能存在于多个历史节点上
-
在一个节点上清理可能会触发复制到另一个节点
-
系统不断尝试保留和重新分发快照数据
4. 详细解决方案
为了有效解决此问题,需要执行两项操作:
-
**删除损坏的 ZooKeeper 快照文件和版本引用**
-
**增加 ZooKeeper 缓冲区大小 (
Djute.maxbuffer)**
4.1 步骤 1:清理 ZooKeeper Pod 中的损坏快照
-
访问 ZooKeeper CLI:
kubectl exec -it druid-cluster-zk-zookeeper- -- zkCli.sh
-
重启受影响的 ZooKeeper pod
-
如果 pod 处于等待状态,请重启它并在初始化期间执行清理
-
-
删除损坏的数据文件:
rm -r /bitnami/zookeeper/data/version-2
-
删除过大的快照文件:
-
识别超出错误中报告大小(例如,
86389682)的快照文件 -
手动删除这些文件:
rm snapshot.*
✅ 至此,ZooKeeper 数据目录已清理干净。
⚠️ Important: If you skip this step, corrupted snapshots may be reloaded after reinstallation.
4.2 步骤 2:增加 ZooKeeper 缓冲区大小
更新 ZooKeeper 配置 (zk-values.yaml) 以增加最大缓冲区大小:
## ZooKeeper 服务器的日志级别。默认为 ERROR。请注意,如果将其设置为 INFO 或 WARN,ReadinessProve 将产生大量日志
##
logLevel: INFO
## 数据日志目录。指定此选项将指示 zookeeper 将事务日志写入 dataLogDir 而不是 dataDir。
## 这允许使用专用日志设备,并有助于避免日志记录和快照之间的竞争。
## 示例:
## dataLogDir: /bitnami/zookeeper/dataLog
##
dataLogDir: ''
## ZooKeeper 进程的默认 JVMFLAGS
##
-Djute.maxbuffer=104857600 # 更新为 100MB,大于错误消息 '86389682',默认值为 10MB。
-
示例:设置为 **100MB**,大于损坏快照的大小(约 86MB)
-
默认值通常为 **10MB**,在此情况下不足
4.3 步骤 3:重新安装 ZooKeeper
卸载现有 ZooKeeper 部署:
helm uninstall -n druid druid-cluster-zk
使用更新的配置重新安装:
helm install -n druid druid-cluster-zk bitnami/zookeeper -f zk-values.yaml
等待所有 zookeeper 上线后,您的 druid 数据库将照常工作,您可以在 druid 控制面板中查看数据。 ٩(ˊᗜˋ )و
希望这能帮助到您。 ~(~ ̄▽ ̄)~
--------------------------------------------------------------------------------------------------------------------------
Last edit by LiuYuancheng ([email protected]) at 13/04/2026, if you have any problem, please send me a message.
No comment for this article.