# インメモリデータベース ## 定義 インメモリデータベース(In-Memory Database)とは、主記憶装置(DRAM)をプライマリストレージとして使用し、ディスク I/O のオーバーヘッドなしに数百万 Op/s・マイクロ秒台のレイテンシを提供するデータベースシステムである。代表的な実装には OSS Redis・Memcached・H-Store・VoltDB・Hazelcast などがある。 Redis は 200 以上のコマンドと 10 種のデータ構造(ハッシュテーブル・ソート済みセット・ストリーム・HyperLogLog 等)をサポートし、db-engines.com のランキングで最も人気のあるインメモリ KV ストアとなった(P99 レイテンシ 400 µs 未満)。(Source: [[@2024__SIGMOD__Amazon MemoryDB - A Fast and Durable Memory-First Cloud Database]]) **耐久性のトレードオフ**: インメモリエンジンは単体では障害時のデータ損失リスクを内包する。このトレードオフを解決するアプローチは主に 3 種類: 1. **ローカルログ/スナップショット**: AOF・BGSave(Redis)。ローカルディスクへの書き込みで耐久性を確保するが、マルチノード構成では依然としてフェイルオーバー時のデータ損失リスクが残る 2. **分散ログへの分離**: トランザクションログを外部サービスに分離する([[Amazon MemoryDB]]、[[Amazon Aurora (Database)]])。計算と耐久性を独立スケーリング可能にする 3. **アンチキャッシング**: 「ホット」データをメモリに、「コールド」データをディスクに自動移動する H-Store のアプローチ ## 横断的知見 - **「キャッシュ」として始まり「一次ストア」へ移行したユーザーが多い**: Amazon MemoryDB の開発動機([[@2024__SIGMOD__Amazon MemoryDB - A Fast and Durable Memory-First Cloud Database]])として、ElastiCache for Redis 顧客の多くが Redis を一次データストアとして使い始め、DynamoDB + DynamoDB Streams + Redis 手動再同期という複雑なパイプラインを自前構築していた事実が報告されている。インメモリエンジンが高パフォーマンスゆえにキャッシュの役割を超えて使われていくパターンが確認できる - **耐久性をエンジン外部に分離することで Redis API 互換性とエンタープライズ品質の耐久性が同時に達成できる**: MemoryDB は Redis 複製ストリームをインターセプトしてマルチ AZ トランザクションログへ転送するという侵襲度の低い実装を選択し、OSS Redis の Redo 処理ロジックを変更せずに 11 9s 耐久性を達成した。(Source: [[@2024__SIGMOD__Amazon MemoryDB - A Fast and Durable Memory-First Cloud Database]]) ## 未解決の問い - Redis の水平スケーリング(クラスタモード)はシャード単位でスロットを分割するが、マルチキートランザクションは同一スロット内に限定される。この制約をトランザクションログとどう統合するか? - DRAM コスト vs ディスク性能のトレードオフは NVRAM(不揮発性メモリ)普及でどう変化するか?インメモリエンジンの「耐久性分離」アーキテクチャは NVRAM 環境でも優位か? - オフボックススナップショット方式は顧客クラスタへの影響を排除するが、S3 への書き込みコストと鮮度(freshness)のバランスをどのように最適化するか? ## 関連 - [[ストレージ計算分離]] — 耐久性レイヤーをエンジンから分離するアーキテクチャパターン - [[Write-Ahead Logging (WAL)]] — インメモリエンジンとの統合における書き込み前 vs 書き込み後ろロギングの違い - [[メインメモリデータベース]] — OLTP 向けインメモリエンジンの設計 - [[結果整合性]] — インメモリレプリカ間の整合性モデル - [[Amazon MemoryDB]] — Redis 互換インメモリ DB に耐久性を付与したクラウドサービス ## 出典 - [[@2024__SIGMOD__Amazon MemoryDB - A Fast and Durable Memory-First Cloud Database]](MemoryDB の設計・評価)