2026年租用 Mac Mini 七乘二十四長跑決策矩陣
LMDB 與 RocksDB 批次寫入、壓實視窗、checkpoint 與磁碟水位閾值清單
🧱 租用 Mac Mini跑七乘二十四索引/管線時,LMDB與RocksDB在寫入模型、壓實與備份語意上差異極大。本文給決策矩陣、可執行設定、夜間壓實視窗與磁碟水位聯動策略。延伸:APFS 水位 FAQ、checkpoint 與暫存目錄慣例、批次 CPU/記憶體退避矩陣。
痛點拆解
- 耐久度與吞吐:LMDB 靠單一寫交易序列化;RocksDB 靠 memtable 與多層壓實,尖峰寫入易觸發 write stall。
- 磁碟形狀:RocksDB 會產生大量 SST 與暫存;LMDB 單檔成長但需預先配置 map_size,兩者都要對齊 APFS 剩餘空間曲線。
- 備份語意:線上拷貝目錄不等於一致快照;應用層 checkpoint 與維護窗必須寫進 Runbook,並與監控告警共用閾值。
LMDB:mmap 與單寫者批次
LMDB 以 mmap 與 B+ 樹為核心,讀者快照讀併發友善;寫入須單一寫交易序列化,批次應收斂為單次 txn並縮短持鎖時間。預先配置足夠 map_size 以免 MDB_MAP_FULL。耐久預設較保守;僅在可接受秒級遺失且具備外部日誌時,才評估 MDB_NOSYNC/MDB_NOMETASYNC。
RocksDB:LSM、壓實與 Flush
RocksDB 將寫入先落於 memtable,再刷成 L0 SST,並由背景執行緒做層級壓實。當 L0 檔案數或待壓實位元組堆積,寫入端可能進入延遲或停滯。長跑參數應以「可觀測指標」校準:rocksdb.stats、pending_compaction_bytes、stall 計數與每層檔案數。壓實排程建議與業務離峰對齊,必要時以 限速 換取白天穩定尾延遲。
決策矩陣(摘要)
依讀寫比例、資料可否重建、以及是否能容忍背景壓實 CPU/IO 尖峰來選欄。
| 場景輪廓 | 偏 LMDB | 偏 RocksDB | 維運重心 |
|---|---|---|---|
| 讀多寫少、目錄小 | ✓ 低背景噪音 | 可,但壓實性價比一般較差 | map_size、單寫交易長度 |
| 高寫入、時間範圍查詢 | 單寫者易成瓶頸 | ✓ LSM 吞吐與欄族 | memtable/L0/壓實帶寬 |
| 多程序同寫 | 不適合 | ✓ 單程序內多欄族仍單引擎 | 外部佇列分片 |
| 可重建快取 | ✓ 簡潔檔案形狀 | ✓ 可關閉 WAL 換取速度(有風險) | 遺失視窗與重建 SLA |
應用層 checkpoint(與引擎無關)
長跑批處理應維護冪等進度檔(序號、鍵範圍或偏移、雜湊、格式版本),以「暫存 + rename」原子提交;跨子系統用單一序號關聯。命名可對齊爬取批處理 checkpoint FAQ。RocksDB 可在維護窗呼叫 Flush/Checkpoint API 輔助備份,並與快照策略協調。
磁碟水位閾值(與監控聯動)
與站內共識對齊:剩餘約百分之十五黃燈——縮批次、暫停次要 compaction 實驗、清理暫存;約百分之十紅燈——停止大型匯入、觸發只讀模式或降級寫入;約百分之五緊急——保留 checkpoint 與主庫目錄,刪除非必要日誌。細節與 APFS 行為見磁碟水位 FAQ。另建議監看 inode 與目錄下小檔數量(RocksDB 特別敏感)。
夜間視窗建議(UTC 對齊範例)
- UTC 13:00–17:00(多數東八區業務的離峰):排 RocksDB 全欄族 Flush、major compaction 或備份前基線;前後各留十五分鐘緩衝觀測 stall。
- LMDB:夜窗做離線或單寫靜止後的檔案級備份/map_size 演練;避免與日間大批 txn 重疊。
- 與 CPU 佔用一併排程:參考批次資源矩陣設定佇列深度與退避,避免壓實與推論/轉檔同時搶滿核。
可執行設定起點(請按實測調整)
下列片段為INI 風格示意,實際鍵名依語言綁定與版本為準。
# RocksDB 長跑起點(單機 SSD)
max_background_jobs=6
max_write_buffer_number=4
min_write_buffer_number_to_merge=2
write_buffer_size=67108864
target_file_size_base=67108864
max_bytes_for_level_base=536870912
level0_file_num_compaction_trigger=4
level0_slowdown_writes_trigger=20
level0_stop_writes_trigger=36
compaction_pri=3
bottommost_compression=kZSTD
# 以限速換白天穩定(示例)
rate_limiter_bytes_per_sec=104857600
LMDB(概念旗標,實際以綁定常數為準):
- 生產預設:同步提交;測試吞吐才評估
MDB_NOSYNC。 - 超大值:
MDB_MAPSIZE設為「預估峰值 × 1.5~2」並記錄變更單。 - 寫集大:
MDB_WRITEMAP可降複製成本,需搭配嚴格崩潰復原測試。
簡短 FAQ
- 能線上 rsync 整個 RocksDB 目錄嗎?
- 不建議在寫入活躍時直接拷貝;應使用引擎提供的備份/Checkpoint,或檔案系統快照並理解還原語意。
- LMDB 能否多執行緒寫?
- 不行;需在上層以單寫者或佇列序列化,或改分片多檔。
- 壓實能完全關掉嗎?
- RocksDB 不關壓實最終會無法讀寫;只能調頻率、帶寬與觸發條件,並用夜窗消化債務。
可引用閾值(抄表用)
- APFS 剩餘百分之十五/十/五:黃/紅/緊急。
- RocksDB:L0 檔案數接近 stop_writes_trigger 前必須介入。
- 夜窗緩衝:十五分鐘觀測 + 二十分鐘可執行壓實預算(視資料量調整)。