ディスクのサイレントデータ破損(Silent Data Corruption)とは、ストレージシステムがアプリケーションに対して破損したデータを提供する際に、一切の警告を発しないことを指します。例えば、メディアの損傷によりディスクに不良ブロックが発生し、アプリケーションがそのブロックを読み取ると、誤ったデータを読むことになります。
ディスクのサイレントデータ破損が発生する確率はそれほど高くありませんが、恐ろしいのは誤りが発生しても何の警告もないことです。アプリケーションがデータの正確性を検証していない場合、プロセスのクラッシュやデータ欠落など、奇妙な異常が発生する可能性があります。データベースのようなアプリケーションにとって、システムの安定性は非常に重要であるだけでなく、データの損失は許容できません。データの正確性と完全性こそが、データベースシステムの生命線です。
OceanBaseデータベースにおけるディスクのサイレントデータ破損の防止策
OceanBaseデータベースがディスクに保存するデータには、二つの部分があります。一つ目はRedoLog、すなわちトランザクションログです。RedoLogは再生された後、メモリ内のMemTableを構成します。二つ目はSSTable、すなわちLSM-Tree内の静的データです。MemTableとSSTableは共同で、ユーザーデータの一つのコピーを形成します。
マルチレプリカメカニズム
OceanBaseデータベースは分散データベースとして、マルチレプリカによる災害復旧方式を採用しています。ディスクのサイレントデータ破損が発生する確率はそれほど高くないため、同一のデータブロックにおいて複数のレプリカで同時にサイレントデータ破損が発生する確率は極めて低いです。あるレプリカでディスクのサイレントデータ破損が発生したことを把握できれば、残りの正常なレプリカからデータをコピーしてこの誤りを修復できます。現在、OceanBaseデータベースはレプリカ単位での修復をサポートしており、ディスクのサイレントデータ破損が発生した場合、運用保守担当者はまず誤ったレプリカを削除し、他のマシンから正しいレプリカを補完することができます。
RedoLogの検証メカニズム
各RedoLogのヘッダーには、そのログのチェックサムが記録されています。ネットワーク転送やログ再生の際には、各ログのチェックサムの検証が強制的に実施されます。これにより、三つのレプリカが同期するログが正確かつ一致していることを保証します。もしログ内のデータにサイレントデータ破損が発生した場合、そのログは他のレプリカに同期されることはありません。
SSTableの検証メカニズム
SSTableのデータは、それぞれ長さが固定された2MBのマクロブロックに格納されています。マクロブロックのヘッダーには、そのマクロブロックのチェックサムが記録されています。マクロブロック内部では複数のマイクロブロックに分割されており、マイクロブロックの長さは固定されていませんが、通常は16KBです。マイクロブロックのヘッダーにも、そのマイクロブロックのチェックサムが記録されています。SSTableの読み込みI/Oはマイクロブロックを基本単位とし、書き込みI/Oはマクロブロックを基本単位とします。マイクロブロックを読み取る際には、マイクロブロックヘッダーのチェックサムの検証が強制的に実施され、ユーザーが読み取るマイクロブロックデータが正確であることを保証します。移行やバックアップなど、マクロブロックを複製するシナリオにおいても、ターゲット側でマクロブロックを書き込む前に、マクロブロックのチェックサムの検証が強制的に実施され、書き込むデータが正確であることを保証し、ディスクのサイレントデータ破損の拡大を防ぎます。
データブロックの正確性を読み書き時に検査するだけでなく、ディスクのサイレントデータ破損を早期に検出することも望まれます。OceanBaseデータベースでは、バックグラウンドで巡回検査タスクを開始し、定期的に全てのマクロブロックをスキャンしてそのチェックサムを検査し、ディスクのサイレントデータ破損が検出された場合にはアラートを発報します。
コールドスタンバイメカニズム
マルチレプリカを使用しないデプロイメントシナリオ、または実際に複数のレプリカで同時にディスクのサイレントデータ破損が発生した場合、データを救出する方法は何でしょうか?OceanBaseデータベースはバックアップ・リストア機能を提供しており、データをNFSやOSSなどの外部メディアにバックアップすることができます。ディスクのサイレントデータ破損が発生した後、外部メディアから正しいデータをデータベースに復元することが可能です。