インメモリと永続化
従来のデータベース(例えばOracleデータベース)ではデータは基本的にディスク(Oracleの場合データファイル)上にあり、キャッシュ及び作業領域は、メインメモリ(DBバッファ等)に確保されています。
データベースが処理を行う場合、データはいったんディスクからメインメモリに読み込まれ、CPUはメモリ上のデータを使用して処理を行います。
もし、データに更新が発生した場合は、変更されたメモリ上のデータはディスクに書き戻されます。
データ変更をディスクへ反映させるところまでを一連のトランザクションに含めると、(メモリに比べて)低速なディスク(レイテンシ10ミリ秒程度)の影響でパフォーマンスが頭打ちになってしまうため、通常は最小の変更情報(Oracleの場合はREDOログ)をディスク(REDOログファイル)に書き込むことでトランザクションの永続性を担保しています。
ストレージをディスクよりも高速なフラッシュメモリ(レイテンシ50~150マイクロ秒)を使用したSSD(Solid State Drive)に替えることでパフォーマンスを向上させることができますが、永続化の基本的な原理は同じです。
一方、データそのものはトランザクションとは非同期にディスクに反映されます。(図1)
つまり、万一サーバに障害が発生したとしても、ディスクからメモリにデータを再読込すれば大半のデータは復旧できますし、一般的なRDBMSにおいては障害直前までのコミット済みデータは安全にリカバリすることができます。
一方、インメモリデータベースでは、キャッシュ及び作業領域の一部はCPUキャッシュへ、データおよび作業領域はメインメモリ上に確保されています。
メインメモリに使用されている半導体DRAM: Dynamic Random Access Memory は書き換え可能な半導体メモリの一種ですが、コンデンサとトランジスタの組み合わせにより電荷を保持することで情報を記憶させる仕組みです。
DRAMのI/Oはレイテンシ120ナノ秒程度で非常に高速なのが特長ですが、電荷が放電してしまう前に記憶保持のための定期的な再書き込み(リフレッシュ)動作が必要なので、万一電源瞬断が発生するとデータが消失してしまうという大きな欠点があります。
これは、全てのデータをメモリ上に持つインメモリデータベースにとって致命的な障害となり得ますので、揮発性メディアであるDRAMのデータを別の不揮発性メディア(ディスク等)にバックアップする永続化の仕組みは必須要件となります。
連載第2回で解説したカラムストアのメインストレージとデルタストレージは原則的に全てメインメモリ上に存在していますが、SAP HANAにおいても基本的にメインメモリ上の情報は不揮発性メディアにバックアップされなければならないのはディスクベースの従来型データベースと同じです。
また、ディスクとメモリの書き込み速度は10万倍以上の違いがあるため、インメモリデータベースの永続化は、必要最小限のディスク出力で行われなければなりません。
永続化は障害対応、災害対策の仕組みにも影響を与えるので、運用面おいても非常に重要です。
連載第1回で、高速なインメモリ・アーキテクチャにこだわるハッソー・プラットナーに対し「インメモリではデータの永続性が担保できない」と猛反対した当時のSAP社経営幹部の逸話を紹介しましたが、今回は実用化されたHANAがどのように永続化を実現しているかを解説したいと思います。