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.

Bài viết này sẽ giới thiệu các bước chi tiết về cách giải quyết vấn đề 'unable to load data base on disk' xảy ra trong Druid Database Kafka Zookeeper.

#Author:      Yuancheng Liu
#Created:     2022/10/12
#Version:     v_0.0.1
#Copyright:   Copyright (c) LiuYuancheng

1. Giới thiệu bối cảnh

Apache Druid là một kho dữ liệu phân tán, mã nguồn mở được thiết kế cho phân tích thời gian thực hiệu suất cao. Nó kết hợp các khái niệm từ kho dữ liệu, cơ sở dữ liệu chuỗi thời gian và hệ thống tìm kiếm, trở thành lựa chọn phổ biến cho các nền tảng trực quan hóa dữ liệu quy mô lớn. Trong nhiều triển khai, Apache Kafka được sử dụng làm đường ống nhập liệu luồng cho Druid, cho phép luồng dữ liệu liên tục vào hệ thống.

2. Tổng quan vấn đề

Trong quá trình vận hành, bạn có thể gặp phải một vấn đề nghiêm trọng trong cụm Druid của mình:

ZooKeeper error: “Unable to load database on disk”

Điều này thường xảy ra trong các kịch bản sau:

  • Một lượng lớn dữ liệu luồng được nhập trong một khoảng thời gian ngắn

  • Một hoặc nhiều nút dữ liệu ngoại tuyến trong quá trình nhập liệu

  • Sau khi phục hồi, một hoặc nhiều Apache ZooKeeper pods không khởi động đúng cách

Ngay cả sau khi khởi động lại pods, triển khai lại ZooKeeper hoặc cài đặt lại các thành phần, vấn đề vẫn tiếp diễn. Thông báo lỗi chi tiết của pod sẽ tương tự như sau:

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. Phân tích vấn đề

3.1 Phân tích nguyên nhân gốc rễ

Vấn đề này thường do các tệp nhật ký giao dịch/ảnh chụp nhanh bị hỏng hoặc quá khổ trong ZooKeeper gây ra.

Các yếu tố góp phần chính:

  • Các nút lịch sử của Druid dưới tải nặng yêu cầu siêu dữ liệu phân đoạn lớn từ ZooKeeper

  • Các nhật ký giao dịch hoặc ảnh chụp nhanh bị hỏng được tạo ra trong quá trình lỗi nút

  • ZooKeeper duy trì các ảnh chụp nhanh này để tránh mất dữ liệu

  • Các ảnh chụp nhanh bị hỏng được truyền trở lại các ZooKeeper pods khỏe mạnh hoặc mới tạo

Kết quả là:

  • Các ZooKeeper pods liên tục lỗi trong quá trình khởi động

  • Cụm có thể mất quorum (lỗi ≥50%), dẫn đến gián đoạn dịch vụ hoàn toàn

  • Chỉ cài đặt lại không giải quyết được vấn đề vì dữ liệu bị hỏng được đưa trở lại

3.2 Thách thức trong việc dọn dẹp thủ công

Việc khắc phục vấn đề này theo cách thủ công rất khó khăn vì:

  • Các tệp bị hỏng có thể tồn tại trên nhiều nút lịch sử

  • Việc dọn dẹp trên một nút có thể kích hoạt sao chép sang nút khác

  • Hệ thống liên tục cố gắng bảo toàn và phân phối lại dữ liệu ảnh chụp nhanh

 


4. Giải pháp chi tiết

Để giải quyết vấn đề một cách hiệu quả, cần thực hiện hai hành động:

  1. Xóa các tệp ảnh chụp nhanh ZooKeeper bị hỏng và tham chiếu phiên bản

  2. Tăng kích thước bộ đệm ZooKeeper (Djute.maxbuffer)

4.1 Bước 1: Xóa các ảnh chụp nhanh bị hỏng trong ZooKeeper Pods

  1. Truy cập ZooKeeper CLI:

kubectl exec -it druid-cluster-zk-zookeeper- -- zkCli.sh
 
  1. Khởi động lại ZooKeeper pod bị ảnh hưởng

    • Nếu pod bị kẹt ở trạng thái chờ, hãy khởi động lại và thực hiện dọn dẹp trong quá trình khởi tạo

  2. Xóa các tệp dữ liệu bị hỏng:

rm -r /bitnami/zookeeper/data/version-2
 
  1. Xóa các tệp ảnh chụp nhanh quá khổ:

  • Xác định các tệp ảnh chụp nhanh vượt quá kích thước được báo cáo trong lỗi (ví dụ: 86389682)

  • Xóa các tệp đó theo cách thủ công:

rm snapshot.*
 

✅ Tại thời điểm này, các thư mục dữ liệu ZooKeeper đã sạch.

⚠️ Important: If you skip this step, corrupted snapshots may be reloaded after reinstallation.

4.2 Bước 2: Tăng kích thước bộ đệm ZooKeeper

Cập nhật cấu hình ZooKeeper (zk-values.yaml) để tăng kích thước bộ đệm tối đa:

## Log level for the Zookeeper server. ERROR by default. Have in mind if you set it to INFO or WARN the ReadinessProve will produce a lot of logs
##
logLevel: INFO

## Data log directory. Specifying this option will direct zookeeper to write the transaction log to the dataLogDir rather than the dataDir.
## This allows a dedicated log device to be used, and helps avoid competition between logging and snaphots.
## Example:
## dataLogDir: /bitnami/zookeeper/dataLog
##
dataLogDir: ''

## Default JVMFLAGS for the ZooKeeper process
##
-Djute.maxbuffer=104857600	# update to 100MB which is bigger than the error message '86389682', default is 10MB .
  • Ví dụ: Đặt thành 100MB, lớn hơn kích thước ảnh chụp nhanh bị hỏng (~86MB)

  • Giá trị mặc định thường là 10MB, không đủ trong trường hợp này

4.3 Bước 3: Cài đặt lại ZooKeeper

Gỡ cài đặt triển khai ZooKeeper hiện có:

helm uninstall -n druid druid-cluster-zk
Cài đặt lại với cấu hình đã cập nhật:

helm install -n druid druid-cluster-zk bitnami/zookeeper -f zk-values.yaml
 

Chờ tất cả zookeepers trực tuyến, cơ sở dữ liệu Druid của bạn sẽ hoạt động như bình thường và bạn có thể kiểm tra dữ liệu trong bảng điều khiển Druid của mình. ٩(ˊᗜˋ )و

Hy vọng điều này có thể giúp ích cho bạn. ~(~ ̄▽ ̄)~

--------------------------------------------------------------------------------------------------------------------------

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.