多くのウェブサイトやアプリケーションで、データの保存にはデータベースが利用されます。データベースからのデータの読み書きは、アプリケーションのレイテンシに大きな影響を与える可能性があります。利用者は通常、高速で応答性の高いアプリケーションを期待するもので、また、検索エンジン最適化(SEO)においても、ウェブサイトが高速であればあるほどプラスの結果がもたらされるため、レイテンシをできる限り低減することが重要です。

データベースへの書き込みは、一般的にメモリに保持されるものではなく(ディスクにデータを書き込むことになるため)待ち時間が発生します。また、データベースで圧縮や暗号化を行うのが一般的で、データの読み書きの際にはその分の遅延が生まれます。このような課題を克服するために、インメモリデータベースを使用すると、ディスクの代わりにRAMを使ってデータを高速に保存・取得することができます。

この記事では、インメモリデータベースの仕組み、一般的な選択肢、標準的なデータベースと比較した場合のトレードオフについてご説明します。

インメモリデータベースとは

インメモリデータベースは、データの保存にハードディスクドライブ(HDD)やソリッドステートドライブ(SSD)の代わりにRAMを使用するものです。データの読み取りと書き込みの待ち時間を劇的に削減することができます。レイテンシの短縮には、主に2つの理由があります。第一に、メモリからのデータアクセスはディスクからのアクセスよりも高速であること、第二に、メモリにデータを格納するために使用されるデータ構造は、ディスクストレージよりも単純であることです。そのため、データの読み書きの際のCPUオーバーヘッドが小さくなります。

低レイテンシというメリットがありますが、サーバーに障害が発生した場合メモリに保存されたデータが失われるというリスクも介在します。ディスクストレージとは異なり、メモリは電源喪失時にも内容を保持しないため、耐障害性と速度はトレードオフの関係にあると言えます。

インメモリデータベースは、リーダーボードやリアルタイムでの分析など、高速なデータ処理を必要とする用途に向いています。また、通常ディスクベースのデータベースに保存するデータをキャッシュして、ディスクへの読み書きの回数を減らしレイテンシを最小化するという使い方もできます。

待ち時間の短縮は、ウェブサイトにとって非常に重要です。ウェブサイトのレスポンスが良いと、利用者がサイトに滞在する可能性が高くなります。Googleをはじめとする検索エンジンは、サイトの読み込み速度をSEO評価指標の一つとして利用しています。つまり、サイト高速化は検索結果での上位表示、ユーザーによるサイトの回遊を促します。

インメモリデータベースの仕組み

インメモリデータベースでは、データがRAMに保存されるため、機械的な可動部を用いディスクにアクセスするHDDに比べて、レイテンシがはるかに低くなります。HDDではその後、データを読み取り、ストレージデバイスとコンピュータ間のインターフェースを介しデータを転送する必要があります。さらに、SSDと比較しても、メモリチップとCPUインターフェースの性能の高さを武器に、RAMは最大で30倍高速です。いくつかのベンチマークテストでは、MySQLと人気の高いインメモリデータベースであるRedisをキャッシュ層として使用することで、スタンドアロンのMySQLデータベースを使用した場合と比較して、クエリのレイテンシが最大25%減少することが示されています。

「MySQLのみ」と「MySQLとRedis」を使用した場合のベンチマーク
「MySQLのみ」と「MySQLとRedis」を使用した場合のベンチマーク(画像参照元:DZone

インメモリデータベースが高速である理由はもう1つあります。インメモリデータベースが使用するデータ構造を最適化することで、検索を高速化できます。例えば、リレーショナルデータベースでは、インデックスにB木を用いることが多く、大きなデータブロックのディスクへの読み書きをサポートしながら、高速な検索を可能にしています。インメモリデータベースでは、データブロックをディスクに書き込む必要がないため、より高性能なデータ構造を選択でき、レイテンシをさらに低減できます。インメモリデータベースでは、データベース層で変換や解析を行わず、データをそのまま保存して使用するのが一般的です。このため、読み込みと書き込みの両方が高速化され、待ち時間の短縮につながります。

インメモリデータベースが普及した背景には、技術的な進歩があります。まず、この20年でRAMのギガバイト(GB)あたりの価格が大幅に低下し、データ保存にメモリを使用することがより手頃になりました。また、インメモリデータベースのソリューションやマネージドクラウドサービスの改善により、主なデメリットが緩和されています。

さらに、Redisなどのインメモリデータベースは、データをメモリからディスクにスナップショットとして反映することで、サーバーに障害が発生してもデータを復元できるようになっています。クラウドサービスでは、地理的な複製が可能なため、問題が発生してもフェイルオーバーして、アプリケーションのダウンを防ぐことができます。このように、コスト削減と信頼性の向上により、インメモリデータベースは最新のアプリケーションやウェブサイトにとってより便利な選択肢となっています。

インメモリデータベースのメリットとデメリット

インメモリデータベースの主なメリットは以下の通りです。

  • パフォーマンスの向上が期待できる
  • データの保存方法が簡単なため拡張が容易
  • アプリケーションの信頼性を引き上げることができる

インメモリデータベースは通常、複雑なリレーショナルモデルに格納するものではなく、非構造化または半構造化としてデータの格納を行います。非構造化データは、複数のノードに存在するデータを結合するためのネットワークデータ転送のオーバーヘッドが不要であるため、データベースのスケーリングがより簡単になります。

RAMに保存されるデータの揮発性を鑑みると、アプリケーションの信頼性を向上させることは直感に反するように思えるかもしれません。とは言え実際には、インメモリデータベースをキャッシュ層として使用すれば、リクエストのピーク時にプライマリデータベースにかかる負担を軽減することができます。インメモリデータベースよりも従来型のデータベースを拡張する方がコストがかかることが多いため、頻繁に発生するリクエストの高速化を考えた時、キャッシュ層の利用はコスト削減にも効果的です。そして、中央のデータベースはデータの長期保存に使用することができます。

インメモリデータベースの主なデメリットは以下の通りです。

  • 唯一のデータベースとして使用する場合にはコストが増加する
  • ストレージサイズに制限がある
  • セキュリティ機能が少ない

インメモリデータベースは一般に、暗号化などのセキュリティ関連機能を持ち合わせていません。なぜなら、暗号化キーも含め、すべてがメモリ上になければならないからです。メモリにアクセスできる悪意のあるエンティティは、理論上、暗号化キーにもアクセスできるため、データの暗号化は効果的とは言えません。

インメモリデータベースは、従来のデータベースと併用することでコスト削減に効果を発揮します。しかし、インメモリーデータベースを単独で使用すると、特に大量のデータを保存する場合は、ディスクストレージに対してメモリの価格が高いため、コストが高くつくことが多いです。また、大容量のデータをメモリに保存する場合、メモリが高価になり、複数のサーバーが必要になるため、このコストによって保存できるデータ量が制限されるかもしれません。

インメモリデータベースがデフォルトになっていない理由

インメモリデータベースの普及を阻んでいる最大の欠点は、コストです。RAMの価格は大幅に低下していますが、それでもHDDやSSDに比べると1GBあたりの価格ははるかに高いと言わざるを得ません。このため、膨大なデータを扱う大規模なアプリケーションでは、インメモリデータベースは高価になってしまいます。

RAMの価格が下がり続ければ、インメモリデータベースがデフォルトとなり、ディスクベースのデータベースは特殊な状況でのみ使用される時代が来るかもしれません。

インメモリデータベースの使用例

インメモリデータベースの最も一般的な用途の1つは、キャッシュです。インメモリデータベースは、従来のデータベースと組み合わせて、キャッシュ層として使用することができます。インメモリデータベースは頻繁にアクセスされるデータを保存し、ディスクベースのデータベースで繰り返されるコストのかかるルックアップを防ぎ、より高速なユーザーエクスペリエンスを実現することができます。

インメモリデータベースは、非常に動的なサイト(例えば、ECサイトやフォーラム、コメントの活発なブログなど)で有用です。ECサイトでは、ユーザー体験をパーソナライズし、商品の在庫状況をリアルタイムに表示することが求められます。ブログやフォーラムでは、何百、何千ものユーザーが同時に投稿やコメントをすることがあります。つまり、サイトは高い書き込みスループットを処理し、最新のコンテンツやコメントを素早くユーザーに提供する必要があるのです。インメモリデータベースは、ユーザーが作成したコンテンツを保存する際の待ち時間を短縮し、最新かつパーソナライズされた体験を提供することができます。

また、インメモリデータベースは、ゲームのリーダーボードにも向いています。リアルタイムにデータを更新・取得し、効率的にデータをソートして、ゲームの進行に合わせて最新情報を表示することができます。

また、リアルタイムの分析にも利用できます。データベースにデータを流し、最新バージョンのデータに対してクエリを実行することで、リアルタイムのダッシュボード、リスク分析、機械学習モデルなどに利用することが可能です。

インメモリデータベースの例

インメモリデータベースと一口に言っても、多くの選択肢があります。代表的なものが例えば、RedisMemgraphHazelcastなどです。中でもRedisは広く使われており、多くのクラウドプラットフォームでマネージドサービスとして提供されています。Memgraphはストリーミングデータのグラフ計算をすべてメモリ上で行うことができ、HazelcastはRedisと同様の機能を持つものの、キャッシュのパターンが少し異なります。

Redisは一般的に、ウェブサイトとアプリケーションの間のキャッシュ層として機能し、コストのかかるデータベースの読み込みを防ぐことでパフォーマンス向上を後押しします。このパフォーマンスの向上は、例えばKinstaのRedisアドオンを使うなどしてWordPressサイトで実施可能です。他にも、KinstaではAPMもご用意しています。これを使うことで、Redisクエリのパフォーマンス面での問題についてトラブルシューティングを行うことができます。

Kinstaを利用するウェブサイトでは、デフォルトでキャッシュが有効になります。とは言え、それに加え、データベースへのリクエストが頻繁に発生するサイトでは、Redisの活用に価値が見出せるでしょう。データベースのレイテンシは、ウェブサイトの速度を低下させる大きな要因の1つです。Redisはこの負担を軽減しサイト高速化に効果を発揮します。

まとめ

データベースのレイテンシは、サイトやアプリケーションの全体的な読み込み遅延につながります。ハードディスクからの読み込み、ハードディスクへの書き込みはレイテンシを増加させる原因のひとつです。インメモリデータベースでは、データがRAMに保存されるため、データベースのレイテンシを低減することができます。SSDを使用する場合と比べても、高速なメモリチップとインターフェースにより、RAMの方が高速になります。さらに、インメモリデータベースが使用するデータ構造を最適化することで、より素早い検索を実現することができます。

インメモリデータベースは、ウェブサイトと従来のデータベースの間のキャッシュ層として使用すると、ウェブサイトやアプリケーションの高速化に有用です。これは、メモリがディスクよりも高速にアクセスできるためで、このオーバーヘッドの減少がウェブサイトの読み込み時間の短縮につながり、SEOの面での改善も期待できます。

Redisは人気のインメモリデータベースの1つです。Kinstaではアドオンを使用してWordPressサイトに簡単にRedisを追加することができます。KinstaのホスティングをRedisアドオンとあわせて是非ともお試しください。

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.