【ITニュース解説】Resilience of MongoDB's WiredTiger Storage Engine to Disk Failure Compared to PostgreSQL and Oracle

2025年09月09日に「Dev.to」が公開したITニュース「Resilience of MongoDB's WiredTiger Storage Engine to Disk Failure Compared to PostgreSQL and Oracle」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

MongoDBのストレージエンジンWiredTigerはディスク障害に高い耐性を持つ。データブロックへのポインタにチェックサムを埋め込むことで、ブロックが不正に入れ替わっても即座に検知。PostgreSQLなどでは見逃される破損も防ぐことができる。

ITニュース解説

データベースシステムにおいて、保存されたデータが正確かつ安全に保たれること、すなわち「データの耐久性」は最も重要な要件の一つである。ハードディスクの物理的な故障やソフトウェアのバグなど、様々な原因でデータが破損する可能性がある。このような事態を防ぎ、万が一発生した場合でもそれを検知する仕組みは、データベースの信頼性を支える根幹技術と言える。ここでは、MongoDBが採用するストレージエンジン「WiredTiger」が、ディスク障害に対してどれほど高い耐性を持つのかを、広く利用されているPostgreSQLと比較しながら解説する。

データベースは、データを「ブロック」あるいは「ページ」と呼ばれる固定サイズの単位で管理し、ディスクに書き込んでいる。データ破損を検知するための一般的な仕組みが「チェックサム」である。これは、ブロックに書き込まれるデータ全体から特定の計算式で算出された短い値(一種の指紋のようなもの)であり、ブロックのヘッダ部分にデータと一緒に保存される。データベースがディスクからブロックを読み出す際に、再度同じ計算式でチェックサムを算出し、ブロックのヘッダに保存されている値と一致するかを比較する。もし値が異なれば、データが何らかの原因で壊れていると判断し、エラーを返すことで、破損したデータをアプリケーションに渡してしまう事態を防ぐことができる。

まず、PostgreSQLにおけるデータ破損の検知能力を見てみよう。近年のPostgreSQLではチェックサム機能が標準で有効になっており、データの信頼性を高めている。実験では、あるテーブルのデータを更新し、その変更がディスク上のデータブロックに書き込まれたことを確認する。次に、ディスクの異常な動作を擬似的に再現するため、更新後の新しいデータブロックが保存されているディスク上の領域に、特殊なコマンドを使って更新前の古いデータブロックを強制的に上書きする。これは「Lost Write(失われた書き込み)」と呼ばれる深刻な障害の一種を模したものである。この状態でデータを読み出すと、PostgreSQLはエラーを検知することなく、更新前の古いデータを返してしまう。なぜなら、上書きされた古いブロックも、それ自体は過去に正常に書き込まれた有効なブロックであり、ブロック内部のデータとヘッダのチェックサムは一致しているからだ。つまり、PostgreSQLのチェックサムは、ブロック「内部」のデータが壊れていることは検知できるが、ブロックそのものが「本来あるべきものとは違う、しかし形式上は有効なブロック」にすり替わってしまったことまでは検知できない。

次に、MongoDBのWiredTigerで同様の実験を行うと、全く異なる結果が得られる。PostgreSQLと同じように、更新後の新しいデータブロックを更新前の古いブロックで上書きし、データを読み出そうとすると、WiredTigerは即座に「チェックサムエラー」を検出し、処理を中断する。これにより、誤ったデータが返されることを防ぐことができる。この差は、WiredTigerのデータ保護の仕組みに起因する。

WiredTigerは、データを効率的に検索するためのB-Treeというデータ構造を採用している。この構造の中で、あるデータブロックの場所を指し示すポインタ情報(アドレスクッキーと呼ばれる)には、単にディスク上の位置情報だけでなく、指し示す先のブロックが持つべきチェックサムの値があらかじめ埋め込まれている。データを読み出す際、WiredTigerはまずポインタを辿って目的のデータブロックにアクセスする。そして、読み込んだブロックのヘッダに記録されているチェックサムと、ポインタ自身が保持している「期待されるチェックサムの値」とを比較する。もし両者が一致しなければ、たとえ読み込んだブロック自体のチェックサムが正常であったとしても、「期待していたブロックとは違うものがここにある」と判断し、データ破損としてエラーを返すのである。この仕組みにより、WiredTigerはブロック内部の破損だけでなく、Lost Writeのようなブロックのすり替わりも確実に検知できる、より堅牢なデータ保護機能を実現している。

さらに、WiredTigerはデータを更新する際に、既存のブロックを直接上書きせず、新しい内容を別の場所に書き込んでからポインタを切り替える「Copy-on-Write(コピーオンライト)」という方式を採用している。これにより、書き込み処理の途中で障害が発生しても、元のデータが破壊されるリスクが大幅に低減される。

このように、MongoDBのWiredTigerは、ポインタにチェックサム情報を含めるという独創的なアプローチにより、他の多くのデータベースよりも高いレベルのデータ保護を実現している。データベースの信頼性は、こうしたストレージエンジン内部の緻密な設計によって支えられている。システムエンジニアを目指す上で、普段利用しているデータベースが内部でどのようにしてデータの完全性を保証しているのかを理解することは、堅牢なシステムを構築するための重要な知識となる。