正常运行中Tikv节点突然报错宕机且无法拉起

【TiDB 使用环境】生产环境
【TiDB 版本】v4.0.8
【操作系统】centos 7
【部署方式】机器部署nvme盘
报错信息如下:
[2025/05/07 18:01:46.230 +08:00] [FATAL] [lib.rs:483] [“rocksdb background error. db: kv, reason: compaction, error: Corruption: block checksum mismatch: expected 3877266098, got 393113608 in /tidb1/tikv-20171/data/db/24011866.sst offset 3600964 size 10457”] [backtrace=“stack backtrace:\n 0: tikv_util::set_panic_hook::{{closure}}\n at components/tikv_util/src/lib.rs:482\n 1: std::panicking::rust_panic_with_hook\n at src/libstd/panicking.rs:475\n 2: rust_begin_unwind\n at src/libstd/panicking.rs:375\n 3: std::panicking::begin_panic_fmt\n at src/libstd/panicking.rs:326\n 4: <engine_rocks::event_listener::RocksEventListener as rocksdb::event_listener::EventListener>::on_background_error\n at components/engine_rocks/src/event_listener.rs:66\n 5: rocksdb::event_listener::on_background_error\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/src/event_listener.rs:254\n 6: _ZN24crocksdb_eventlistener_t17OnBackgroundErrorEN7rocksdb21BackgroundErrorReasonEPNS0_6StatusE\n at crocksdb/c.cc:2140\n 7: _ZN7rocksdb12EventHelpers23NotifyOnBackgroundErrorERKSt6vectorISt10shared_ptrINS_13EventListenerEESaIS4_EENS_21BackgroundErrorReasonEPNS_6StatusEPNS_17InstrumentedMutexEPb\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/db/event_helpers.cc:53\n 8: _ZN7rocksdb12ErrorHandler10SetBGErrorERKNS_6StatusENS_21BackgroundErrorReasonE\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/db/error_handler.cc:220\n 9: _ZN7rocksdb6DBImpl20BackgroundCompactionEPbPNS_10JobContextEPNS_9LogBufferEPNS0_19PrepickedCompactionENS_3Env8PriorityE\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/db/db_impl/db_impl_compaction_flush.cc:2797\n 10: _ZN7rocksdb6DBImpl24BackgroundCallCompactionEPNS0_19PrepickedCompactionENS_3Env8PriorityE\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/db/db_impl/db_impl_compaction_flush.cc:2317\n 11: _ZN7rocksdb6DBImpl16BGWorkCompactionEPv\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/db/db_impl/db_impl_compaction_flush.cc:2092\n 12: _ZN7rocksdb14ThreadPoolImpl4Impl8BGThreadEm\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/util/threadpool_imp.cc:266\n 13: _ZN7rocksdb14ThreadPoolImpl4Impl15BGThreadWrapperEPv\n at /rust/git/checkouts/rust-rocksdb-a9a28e74c6ead8ef/cf9871d/librocksdb_sys/rocksdb/util/threadpool_imp.cc:307\n 14: execute_native_thread_routine\n 15: start_thread\n 16: __clone\n”] [location=components/engine_rocks/src/event_listener.rs:66] [thread_name=]

查看磁盘和系统无报错, 是触发了什么bug吗

 block checksum mismatch: expected 3877266098, got 393113608 in /tidb1/tikv-20171/data/db/24011866.sst offset 3600964 size 10457

这个意思是指 rocksdb 检测内存中的 checksum 和本地文件 sst checksum 对不上。认为文件损坏了(或者说数据异常)。

修复方法你试试缩容这个节点然后扩容 tikv 节点来解决。

我遇到过一次类似情况是系统内存刷盘 内核 bug。。。。

sst 文件损坏了,这个tikv起不来了。幸好有3副本,缩掉重建就可以。
不过,如果你头铁,就非得要修好,也有办法:

  1. 用ldb工具,查这个sst对应的 cf、属于哪一层,对应的key的范围。
  2. 查这个范围对应的region,其中 不同的 cf 的 key 又有不同的前缀,
  3. 用 ldb 工具,unsafe 移除这个sst
  4. 用 tikv-ctl 工具,unsafe 移除对应的region的peer。

再启动就行了。这一片损失的数据就相当于删掉了。
以上是理论,我没这么修过。

1 个赞

是版本问题吗

数据量不大的话,扩容缩容最快

我是扩缩容解决的, 但是最近这个有点频繁, 一周两次了 :frowning_face:

服务器该换了。tidb 版本也升级下,新版本有 sst 文件损坏自我修复。

https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file/#background-error-recovery-window-从-v610-版本开始引入