Rocksdb 6.8.0 Background Error 处理

Error ReasonWhen bg_error_ is set
Sync WAL (BackgroundErrorReason::kWriteCallback) Always
Memtable insert failure (BackgroundErrorReason::kMemTable) Always
Memtable flush (BackgroundErrorReason::kFlush) DBOptions::paranoid_checks is true
SstFileManager::IsMaxAllowedSpaceReached() reports max allowed space reached during memtable flush (BackgroundErrorReason::kFlush) Always
SstFileManager::IsMaxAllowedSpaceReached() reports max allowed space reached during compaction (BackgroundErrorReason::kCompaction) Always
DB::CompactFiles (BackgroundErrorReason::kCompaction) DBOptions::paranoid_checks is true
Background compaction (BackgroundErrorReason:::kCompaction) DBOptions::paranoid_checks is true
Write (BackgroundErrorReason::kWriteCallback) DBOptions::paranoid_checks is true

 

错误严重性等级:

  1. Status::Severity::kSoftError- 此严重程度的错误不会阻止写入数据库,但确实意味着数据库处于降级模式。后台压缩和刷新可能无法及时运行。
  2. Status::Severity::kHardError- DB 处于只读模式,但一旦解决错误原因,就可以转换回读写模式。
  3. Status::Severity::kFatalError- DB 处于只读模式。恢复的唯一方法是关闭 DB,纠正错误的根本原因,然后重新打开 DB。
  4. Status::Severity::kUnrecoverableError- 这是最高严重程度,表示数据库损坏。可能可以关闭并重新打开数据库,但数据库的内容可能不再正确。

错误严重性映射关系:

BackgroundErrorReason
Status::Code
Status::SubCode
paranoid_checks
Status::Severity
BackgroundErrorReason::kCompaction
Status::Code::kIOError
Status::SubCode::kNoSpace
true
Status::Severity::kSoftError
BackgroundErrorReason::kCompaction
Status::Code::kIOError
Status::SubCode::kNoSpace
false
Status::Severity::kNoError
BackgroundErrorReason::kCompaction
Status::Code::kIOError
Status::SubCode::kSpaceLimit
true
Status::Severity::kHardError
BackgroundErrorReason::kCompaction
 Status::Code::kCorruption
 
true
Status::Severity::kUnrecoverableError
BackgroundErrorReason::kCompaction
 Status::Code::kCorruption
 
false
Status::Severity::kNoError
BackgroundErrorReason::kCompaction
Status::Code::kIOError
 
true
Status::Severity::kFatalError
BackgroundErrorReason::kCompaction
Status::Code::kIOError
 
false
Status::Severity::kNoError
BackgroundErrorReason::kCompaction
 
 
true
Status::Severity::kFatalError
BackgroundErrorReason::kCompaction
 
 
false
Status::Severity::kNoError
BackgroundErrorReason::kFlush
Status::Code::kIOError
Status::SubCode::kNoSpace
true
Status::Severity::kHardError
BackgroundErrorReason::kFlush
Status::Code::kIOError
Status::SubCode::kNoSpace
false Status::Severity::kNoError
BackgroundErrorReason::kFlush
Status::Code::kIOError
Status::SubCode::kSpaceLimit true
Status::Severity::kHardError
BackgroundErrorReason::kFlush
Status::Code::kCorruption
  true
Status::Severity::kUnrecoverableError
BackgroundErrorReason::kFlush
Status::Code::kCorruption
  false
Status::Severity::kNoError
BackgroundErrorReason::kFlush
Status::Code::kIOError
  true
Status::Severity::kFatalError
BackgroundErrorReason::kFlush
Status::Code::kIOError
  false
Status::Severity::kNoError
BackgroundErrorReason::kFlush
 
  true
Status::Severity::kFatalError
BackgroundErrorReason::kFlush
 
  false
Status::Severity::kNoError
BackgroundErrorReason::kWriteCallback
Status::Code::kIOError
Status::SubCode::kNoSpace
true
Status::Severity::kHardError
BackgroundErrorReason::kWriteCallback
Status::Code::kIOError
Status::SubCode::kNoSpace
false
Status::Severity::kHardError
BackgroundErrorReason::kWriteCallback
Status::Code::kCorruption   true
Status::Severity::kUnrecoverableError
BackgroundErrorReason::kWriteCallback
Status::Code::kCorruption   false
Status::Severity::kNoError
BackgroundErrorReason::kWriteCallback
Status::Code::kIOError   true
Status::Severity::kFatalError
BackgroundErrorReason::kWriteCallback
Status::Code::kIOError   false
Status::Severity::kNoError
BackgroundErrorReason::kWriteCallback
    true
Status::Severity::kFatalError
BackgroundErrorReason::kWriteCallback
    false
Status::Severity::kFatalError
BackgroundErrorReason::kMemTable
   
true
Status::Severity::kFatalError
BackgroundErrorReason::kMemTable
    false
Status::Severity::kFatalError

 

有 3 种方法可以在不关闭数据库的情况下从后台错误中恢复 :

  1. 如果回调EventListener::OnBackgroundError确定错误状态还不足以阻止进一步写入数据库,则可以覆盖错误状态。它可以通过设置bg_error参数来实现这一点。这样做可能会有风险,因为 RocksDB 可能无法保证数据库的一致性。在覆盖错误之前,请检查BackgorundErrorReason和严重程度。
  2. 调用DB::Resume()以手动恢复数据库并将其置于读写模式。此函数将刷新所有列族的内存表、清除错误、清除任何过时的文件并重新启动后台刷新和压缩操作。
  3. 自动从后台错误中恢复。这是通过轮询系统以确保底层错误情况得到解决,然后按照与DB::Resume()恢复写入能力相同的步骤来完成的。通知回调EventListener::OnErrorRecoveryBeginEventListener::OnErrorRecoveryCompleted分别在恢复过程的开始和结束时调用,以通知用户状态。可以通过在DBOptions中设置max_bgerror_resume_count和bgerror_resume_retry_interval来控制重试行为

目前,以下场景支持自动恢复:

  1. 文件系统出现 ENOSPC 错误
  2. IO 错误报告为FileSystem可重试(通常是网络中断等瞬时错误)。当 WAL 未使用时,数据库将继续在内存表中缓冲写入(即数据库保持读写模式)。一旦max_write_buffer_number内存表积累起来,写入最终可能会停滞。
  3. WAL 同步期间出错,仅当未使用 2PC 且 manual_wal_flush 不为真时才会进行恢复(参见#12995)。

自动恢复适用于以下情况 -

  1. max_bgerror_resume_count不为 0
  2. IOStatus是可重试的 I/O 错误。
  3. 如果BackgorundErrorReason与压缩相关,则会自动重新安排新的压缩(它不受控制max_bgerror_resume_count
  4. 如果BackgorundErrorReason与刷新相关(刷新期间写入 SST 文件或写入 Manifest)或与 WAL 相关。

请注意,如果后台错误与压缩有关,或者在 WAL 处于 DISABLED 状态时在刷新或清单写入期间发生,则将bg_error_映射到Status::Severity::kSoftError。在其他情况下,bg_error_将映射到Status::Severity::kHardError

参考:https://github.com/facebook/rocksdb/wiki/Background-Error-Handling

posted @ 2024-09-19 11:34  morningli  阅读(31)  评论(0编辑  收藏  举报