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