Rocksdb 6.8.0 Background Error 处理
Error Reason | When 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 |
错误严重性等级:
Status::Severity::kSoftError
- 此严重程度的错误不会阻止写入数据库,但确实意味着数据库处于降级模式。后台压缩和刷新可能无法及时运行。Status::Severity::kHardError
- DB 处于只读模式,但一旦解决错误原因,就可以转换回读写模式。Status::Severity::kFatalError
- DB 处于只读模式。恢复的唯一方法是关闭 DB,纠正错误的根本原因,然后重新打开 DB。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 种方法可以在不关闭数据库的情况下从后台错误中恢复 :
- 如果回调
EventListener::OnBackgroundError
确定错误状态还不足以阻止进一步写入数据库,则可以覆盖错误状态。它可以通过设置bg_error
参数来实现这一点。这样做可能会有风险,因为 RocksDB 可能无法保证数据库的一致性。在覆盖错误之前,请检查BackgorundErrorReason和严重程度。 - 调用
DB::Resume()
以手动恢复数据库并将其置于读写模式。此函数将刷新所有列族的内存表、清除错误、清除任何过时的文件并重新启动后台刷新和压缩操作。 - 自动从后台错误中恢复。这是通过轮询系统以确保底层错误情况得到解决,然后按照与
DB::Resume()
恢复写入能力相同的步骤来完成的。通知回调EventListener::OnErrorRecoveryBegin
和EventListener::OnErrorRecoveryCompleted
分别在恢复过程的开始和结束时调用,以通知用户状态。可以通过在DBOptions中设置max_bgerror_resume_count
和bgerror_resume_retry_interval来控制重试行为。
目前,以下场景支持自动恢复:
- 文件系统出现 ENOSPC 错误
- IO 错误报告为
FileSystem
可重试(通常是网络中断等瞬时错误)。当 WAL 未使用时,数据库将继续在内存表中缓冲写入(即数据库保持读写模式)。一旦max_write_buffer_number
内存表积累起来,写入最终可能会停滞。 - WAL 同步期间出错,仅当未使用 2PC 且 manual_wal_flush 不为真时才会进行恢复(参见#12995)。
自动恢复适用于以下情况 -
max_bgerror_resume_count
不为 0- 这
IOStatus
是可重试的 I/O 错误。 - 如果
BackgorundErrorReason
与压缩相关,则会自动重新安排新的压缩(它不受控制max_bgerror_resume_count
) - 如果
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
本文来自博客园,作者:morningli,转载请注明原文链接:https://www.cnblogs.com/morningli/p/18420260