【WiredTiger 内核】与 PG / InnoDB / RocksDB 机制对照

💡 原文中文,约2700字,阅读约需7分钟。
📝

内容提要

本文对比PostgreSQL、InnoDB、RocksDB和WiredTiger四种存储引擎,从缓存、脏页、WAL、MVCC落点、旧版本回收及故障形态等维度列出机制对照表,强调机制与代价而非性能排名。指出WiredTiger区分内存与磁盘页,HS存储旧版本,并提醒避免跨引擎类比运维参数,为选型提供参考。

🔎

延伸解读

机制对照的价值在于排除错误类比

文章强调对照表用于排除错误类比,如“HS 就是 undo”“cacheSize 等于 shared_buffers”。这些类比看似合理,但底层机制不同:HS 存储的是文档级旧版本,而 undo 是行级变更记录;cacheSize 与 shared_buffers 在缓存粒度、脏页处理上均有差异。理解这些差异,可避免在运维中直接套用其他引擎的参数或经验。

MVCC 落点决定空间与回收行为

四种引擎的 MVCC 落点各异:PG 在堆内保存新旧元组,InnoDB 用 undo 旁路,WiredTiger 将旧版本存入 History Store,RocksDB 则在 SST 中保留多版本键。这直接影响旧版本回收机制:PG 依赖 VACUUM,InnoDB 靠 purge,WT 依赖 HS tombstone 与窗口,RocksDB 靠 compaction。选型时需考虑更新模式与空间增长。

故障形态各有侧重,排障入口不同

文章指出各引擎典型故障形态:PG 表膨胀、InnoDB undo history 过长、RocksDB 写停顿与 L0 堆积、WiredTiger HS 膨胀与 dirty eviction 尖刺。排障时需针对引擎特性定位,例如 WT 关注 HS 与脏驱逐,RocksDB 关注 L0 层数。了解这些差异有助于快速诊断问题。

Q&A

WiredTiger 与 PostgreSQL、InnoDB、RocksDB 在缓存机制上有何不同?

WiredTiger 显式区分内存页和磁盘页,脏页离开缓存时需进行 reconcile 并可能写入 History Store;PostgreSQL 和 InnoDB 的缓冲池中页面格式接近磁盘页,差异较小;RocksDB 前台写入走 MemTable,持久化形态为 SST,与页式 reconcile 不同。

WiredTiger 如何实现持久性?

WiredTiger 通过 checkpoint 固定一致点,journal 覆盖间隙,并使用 RTS(Read Timestamp)处理时间戳不稳定侧,确保持久性。

四种存储引擎的 MVCC 旧版本存储位置分别在哪里?

PostgreSQL 将新旧元组都放在堆表中,旧版本通过 VACUUM 回收;InnoDB 将旧版本存储在 Undo 中;WiredTiger 将旧版本存储在 History Store(HS.wt)中;RocksDB 等 LSM 引擎将多版本键存储在 SST 中,通过 Compaction 回收。

WiredTiger 的 History Store 与 InnoDB 的 Undo 有何区别?

WiredTiger 的 History Store 存储旧版本,而 InnoDB 的 Undo 也存储旧版本,但两者在实现和空间模型上不同。文章指出不能简单类比,例如 HS 与 undo 在小字段高频更新下的空间曲线需实测,且 HS 存储整值,与“改一个字段”的直觉不对齐。

WiredTiger 的典型故障形态是什么?

WiredTiger 的典型故障形态包括 History Store 膨胀和 dirty eviction 尖刺。

为什么不能将 WiredTiger 的 cacheSize 直接等同于 PostgreSQL 的 shared_buffers?

因为不同存储引擎的缓存机制和代价不同,WiredTiger 区分内存页和磁盘页,脏页写出需 reconcile 并可能写 HS,而 PostgreSQL 的缓冲池页面接近磁盘页。跨引擎类比运维参数会导致错误,应避免照搬数值。

🏷️

标签

➡️

继续阅读