昨今、インメモリデータベースやインメモリデータグリッドが普及しています。
しかし、これは果たして何を意味するのでしょうか。
メモリは伝統的にストレージよりも高速なことから、”メモリ “への言及は速度を意味するものの、この高速化に対応するためにデータベースの他の側面が犠牲になっているのでしょうか?
本記事では、メモリの種類、スケーラビリティ要因、様々なインメモリデータベースアーキテクチャのパフォーマンスについて解説します。
インメモリデータベースとは
インメモリデータベースとは、データをコンピューターのRAM(ランダムアクセスメモリ)に直接保存するタイプのデータベースです。
通常のデータベースはデータをハードディスクやSSD(ソリッドステートドライブ)に保存しますが、インメモリデータベースでは、これらのディスクベースのストレージを使用せず、データをRAMに保持します。
どのような種類のメモリがあるの?
最近のコンピュータには様々な種類のメモリがあります。
最も高速なデバイスでは、保存されるビットにより多くのトランジスタを必要とする傾向があり、より多くの物理的スペースと製造コストを必要とします。
ランダムアクセスメモリー
ランダムアクセスメモリー(RAM)は、コンピュータの主要な記憶装置の一つで、データを一時的に保存する役割を果たします。
このメモリはコンピュータの処理速度に直接影響を与えるため、システムのパフォーマンスにとって非常に重要です。
RAMは、データにアクセスする際の順番に関係なく任意の順序で読み書きが可能であるため、「ランダムアクセス」と呼ばれます。
この特性により、CPUは必要な情報を迅速に取得して処理することができます 。
SSD(ソリッド・ステート・ドライブ)
ソリッド・ステート・ドライブ(SSD)は、データを保存するための記憶装置です。
従来のハードディスクドライブ(HDD)と異なり、SSDは回転する磁気ディスクを使用せず、半導体を利用してデータを記録します。
この技術により、SSDはHDDに比べて読み書きの速度が非常に速く、動作音がほとんどなく、消費電力も少ないという特徴があります。
また、移動部品がないため、衝撃に強くデータの損失リスクが低減されます。
これらのメリットにより、SSDは現代のコンピュータ、特にノートパソコンやモバイルデバイスに広く採用されています。
一方で、書き込みサイクルには限りがあり、何度も書き込むと「消耗」してしまうというデメリットがあります。
オンメモリとインメモリの違い
「オンメモリ」と「インメモリ」は、どちらもデータのメモリ内での処理に関する概念ですが、文脈によって意味が異なることがあります。
オンメモリ
オンメモリは、システムがデータやプログラムをメモリ上に保持しつつ、通常はディスクなどの永続的なストレージを利用する場合を指すことが多いです。
オンメモリシステムでは、頻繁にアクセスされるデータをメモリにキャッシュすることで、パフォーマンスを向上させますが、データの永続性はディスクストレージに依存しています。
インメモリ
一方、インメモリはデータベースやデータ処理システムがデータを完全にメモリ内に保持し、処理を行います。
この方式では、データの読み書きが非常に高速になりますが、メモリの容量に依存するため、大量のデータを扱う場合には大量のメモリが必要です。
また、データの永続性を確保するために、定期的にデータをディスクにバックアップする仕組みも求められます。
インメモリデータベースのメリット
インメモリデータベースを使うことによって得られる主なメリットは3つあります。
高速アクセス
データをRAMに保存するため、読み書きの速度が非常に高速です。
これにより、リアルタイム処理や高速なデータ分析が可能になります 。
レスポンス性の向上
インメモリデータベースは、ビジネスアプリケーションにおいて、迅速な応答が求められる場面で有利です 。
シンプルな構造
データベースの構造がシンプルになるため、管理がしやすくなります 。
インメモリデータベースのデメリット
一方、インメモリデータベースにはこのようなデメリットもあります。
コスト
RAMはHDDやSSDに比べて高価であるため、大量のデータを扱う場合のコストが高くなります 。
データの揮発性
電源が切れるとデータが失われる可能性があるため、データの永続性を確保するための追加の対策が必要です 。
インメモリデータベースとスケーラビリティの関係
インメモリデータベースのスケーラビリティは、そのアーキテクチャに由来します。
今日のほとんどのインメモリデータベースは、クラスタ内の複数のノードにデータを分散させ、1つのノードが失われた場合でもデータベース全体がダウンしないように弾力性を持たせています。
しかし、これが機能するためには、データの複数のコピーがクラスタに保存されていなければいけません。
すべてではないですが、多くの分散システムはRaftのようなクォーラムベースのコンセンサス・アルゴリズムに依存しており、1つのノードの障害を許容するためには、データのコピーが3つ必要になります。
DRAMはSSDよりも高速ですが、前述した通りかなり高価です。
つまり、適度なデータ量であれば、DRAMに情報を保存するデータベースで十分です。
「適度」とは何か?
例えば、1TBのユニークなデータを保存したいとしましょう。
クォーラムベースのデータベースを使用している場合、データのコピーが3部必要になるので、複製されたデータは3TBになります。
この場合、断片化や圧縮などによるオーバーヘッドは考慮されず、実際には5~6TB近いDRAMが必要になるかもしれません。
したがって、クラスタのメモリコストだけで25,000ドル程度になる可能性があります。
その後、CPU、NIC、電源、ラックスペース、スイッチなどを追加する必要があります。
DIMMはある程度までスケールアップできますが、前述のように、大容量DIMMのコストは指数関数的に増加し、マザーボードごとにサポートされるモジュールの数には物理的な制限があります。
そのため、スケールアウトを必要とするポイントにはかなり早く到達し、結果としてクラスターが大きくなり、ハードウェアコストが増加します。
また、固有データが増えれば増えるほど、コストも上がります。
40TBのユニーク・データがあれば、ハードウェアだけで100万ドル以上のコストがかかるのです。
SSDはインメモリデータベースの拡張に役立つのか
SSDはDRAMに比べてはるかに優れたスケーラビリティを提供します。
特に、CPUのI/Oレーンを共有できる高速NVMeライザーボードを使用することで、密度が高くなり、1台のマシンにより多くのSSDを使用することができます。
しかし、速度が遅く、データベースがSSDの特性を利用するように一から明示的に設計されていない限り、SSDがパフォーマンスの大きなボトルネックになる可能性があります。
SSDをDRAMと組み合わせて使用するように一から設計され、パフォーマンスとスケーラビリティの優れた組み合わせを提供するインメモリデータベースの1つ、Aerospikeを見てみましょう。
読み取りパス
クライアントからレコードを読み込むときの図を考えてみましょう。
図1に示す数字は、読み取りパスにおける以下のポイントを示しています。
1.クライアントアプリケーションは通常、データベースノードとは別のマシンにあるため、データを所有するノードにネットワークホップする必要があります。Aerospikeであれば、コーディネータ・ノードを経由するのではなく、一定のハッシュ・アルゴリズムを使用することで1回のネットワーク・ホップで済みます。
2.そのノードに到達すると、目的の情報を持つ主要なインデックスのサブツリー(「スプリグ」)を特定するためにハッシュテーブルが参照されます。このハッシュテーブルは通常DRAMに存在し、比較的小さなサイズで、ノードあたり数メガバイトです。
3.このスプリグはSSD上にあるデータの場所とそのデータのサイズを見つけるために走査されます。スプリグはバランスの取れた赤黒木であるため、この走査の時間計算量はO(log₂N)です。ここでNはそのスプリグ内のレコード数です。これらのスプリグも通常は迅速な走査のためにDRAMに配置されています。
4.データはSSD上の場所から読み込まれ、クライアントに返されます。
Aerospikeはこの処理を高速化するために他にも最適化を行っていますが、最も顕著なのはSSD上にファイルシステムを持たないことです。
ディスクはrawまたはブロックモードで使用され、ファイルシステムのペナルティなしでドライブ上の任意の場所に直接アクセスすることができます。
書き込みパス
SSDの書き込みは、そのEEPROMの先祖と同様に、ストレージへの書き込み速度が通常速くないため、より複雑です。
また書き込み操作は破壊的でもあるため、SSDの摩耗を引き起こします。
そのため、レコードはできるだけ少ない回数で書き込まれるべきです。
これにより、「書き込み増幅」—単一の書き込みが行われる回数を減らすことができます。
これは、SSDにファイルシステムを持たないことのもう一つのメリットです。
ファイルシステムは特定の条件下でデータを移動させることができ、これによって書き込み増幅がさらに発生します。
ブロックモードの書き込みではこのようなことはありません。
1.クライアントは、書き込まれるデータを所有するノードに対してシングルネットワークホップを実行します。
2.SSDに直接書き込む代わりに、書き込みはDRAM書き込みバッファに書き込まれます。このバッファは小さく、使用される設定に応じて8MB以下です。
3.そのレコードのプライマリインデックスエントリは、挿入の場合は作成され、更新の場合は修正されて、メモリバッファを指すようになります。
4.データはネットワークを介して他のノードに一つ以上複製されます。
5.複製ノードは、情報を自身の書き込みバッファに保存した後、マスターノードに応答します。
6.こうしてマスターとすべての複製がレコードのコピーを持つようになり、クライアントに書き込みが完了したと認識されます。
7.その後のある時点で、書き込みバッファはストレージにフラッシュされます。これは、書き込みバッファが満杯になった場合または1秒が経過した場合のいずれか早い方で発生します。
DRAMとSSDの性能差
DRAMのパフォーマンスはSSDよりも優れていますが、純粋なインメモリとこのソリューションの相対的なパフォーマンスを見てみましょう。
読み込みパスでは、クライアントからデータベースサーバーへのネットワークホップの往復に約100マイクロ秒かかります。
必ずしも有効な仮定ではありませんが、DRAM性能の最良のケースを示します。
つまり、クライアントがDRAMからレコードを読み出す往復時間は約100マイクロ秒かかります。
良質のSSDからの読み取りも約100マイクロ秒なので、100マイクロ秒のネットワークホップを使用すると、このアーキテクチャでの読み取り(メモリからではなく、ストレージから)は、往復で約200マイクロ秒となります。
このアーキテクチャーの良いところは、「キャッシュ・データ」という概念がないため、キャッシュ・ミスがなく、どのレコードを読んでもほぼ同じレイテンシーになることです。
このため、レイテンシは非常に予測しやすく、平坦な線になります。
書き込みでは、このアーキテクチャはメモリに書き込み、SSDへのフラッシュを待ちません。
つまり、書き込みは、DRAMをストレージとして使用するか、SSDをストレージとして使用するかのどちらかで、事実上メモリ速度で行われます。
どちらの場合も、クライアントからマスターへ、マスターからレプリカへと、複数のネットワークホップが発生します。
複数のレプリカがある場合、これらの書き込みは並行して行われるため、総経過時間は同程度になります。
Aerospikeはクォーラムアーキテクチャに基づくものではなく、2つのデータコピーだけで強力な一貫性を保証できます。
これは、クォーラムベースのアーキテクチャに必要な3つのデータコピーに比べ、ハードウェアを大幅に節約することが可能です。
読み出しは、SSD上のストレージの方がDRAMよりも約100マイクロ秒遅く、書き込みは2つのアーキテクチャ間でほぼ同じです。
しかし、DRAMは実際には10数TBに制限されるのに対し、SSDの実装は数ペタバイトのデータまで拡張できます。
DRAMとSSDのコスト差
例として50TBのユニークデータを純粋なDRAMベースのデータベースに保存する場合と、DRAMとSSDを併用するAerospikeのようなデータベースでの保存を比較します。
両方のデータベースでデータの3つのコピーを保存すると仮定すると(Aerospikeの場合には必ずしもそうではありませんが)、保存されるデータ量は約150TBです。
データの断片化、圧縮のためのスペース、メタデータレベルのオーバーヘッドなどがあるため、両方のデータベースにおいて約250TBのストレージが必要と考えるのが妥当です。
純粋なDRAMベースのデータベースの場合、DRAMのコストは約4500ドル x 250で、合計1,125,000ドルになる可能性が高いです。
DRAMの実用的な密度を考慮すると、クラスターサイズは数百のノードになる可能性があり、CPU、NIC、スイッチ、ラックスペース、冷却、電力、管理コスト、メンテナンスコストなどの大きなコストが発生します。
一方、AerospikeのようなSSD最適化データベースでは、各ノードがSSD上に25TBのデータを簡単に保存でき、ノードあたり2 x 12.8TBのドライブを使用します。
ドライブのコストは合計で約5000ドルになるでしょうから、例えば512GBのDRAM、CPU、電源などをフル装備した場合、各ノードのコストは約15000ドルになるでしょう。
このシナリオでは10ノードだけが必要で、クラスターの総コストは約150,000ドルになります。
これはハードウェアコストの85%の削減であり、これはDRAMベースのデータベースのDRAMコストのみを考慮したものであり、SSD最適化ソリューションの完全なコストに対してです。
(注意:ここでの数字はインターネット上で入手可能な小売価格を表しています。異なるベンダーはサポートのレベル、信頼性などに基づいて異なる価格を提供します。これらの数字は、2つのソリューション間のコスト比率を示すものであり、特定のハードウェアのコストを示すものではありません)
スケールとコストに最適化されたインメモリデータベース
DRAMをストレージとして使用するインメモリデータベースは驚異的なパフォーマンスを提供しますが、データ保存の点での拡張性には限界があります。
しかし、インメモリという用語にはSSDも含まれることがあり、Aerospikeのように地盤からSSDの使用に最適化されたデータベースもインメモリデータベースの一種ですが、非常に少ないパフォーマンスコストで大幅な拡張性の向上を提供します。
DRAMとSSDを混合して、Aerospikeが行うように各メモリクラスの特性を最適に活用することは、非常に高速なアクセスとほぼ無制限の拡張性を他のソリューションの一部のコストで提供し、両方の世界のベストを実現します。
このブログは、2024年1月30日のブログ「What is an in-memory database?」の翻訳です。