Steps to solve the Kafka Zookeeper 'Unable to load data base on disk'​ problem

English 简体中文 繁体中文 Tiếng Việt
Summary

Encountering the "Unable to load database on disk" error in Kafka Zookeeper within a Druid cluster, often after high data ingestion and node failures, typically indicates corrupted or oversized ZooKeeper snapshot and transaction log files. The primary solution involves manually clearing corrupted data directories and oversized snapshot files from ZooKeeper pods. Developers must then increase the `Djute.maxbuffer` in the ZooKeeper configuration, setting it to a value larger than the problematic snapshot size, such as 100MB. Finally, uninstall and reinstall ZooKeeper using Helm with the updated configuration to restore cluster functionality.

本文将介绍如何解决 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. 详细解决方案

为了有效解决此问题,需要执行两项操作:

  1. **删除损坏的 ZooKeeper 快照文件和版本引用**

  2. **增加 ZooKeeper 缓冲区大小 (Djute.maxbuffer)**

4.1 步骤 1:清理 ZooKeeper Pod 中的损坏快照

  1. 访问 ZooKeeper CLI:

kubectl exec -it druid-cluster-zk-zookeeper- -- zkCli.sh
 
  1. 重启受影响的 ZooKeeper pod

    • 如果 pod 处于等待状态,请重启它并在初始化期间执行清理

  2. 删除损坏的数据文件:

rm -r /bitnami/zookeeper/data/version-2
 
  1. 删除过大的快照文件:

  • 识别超出错误中报告大小(例如,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.

  RELATED

No related programming articles found. Browse all programming tutorials and articles.

  COMMENTS

0

No comment for this article.