はじめに
高度でスケーラブルな分散型ソフトウェアを作ろうとする組織にとって、よく選択するのがキャッシュで、キャッシュの主要なソリューションとして、MemcachedとRedisが存在します。
MemcachedはOSSの分散メモリオブジェクトキャッシュシステムです。Memcachedは、データベース呼び出し、API呼び出し、ページレンダリングをした際に使用したデータのためのインメモリKey-Valueストアを提供します。Memcachedを使用した際のメモリ割り当ては柔軟かつ効率的で、ユーザによる需要の移り変わりに関係なくシステムを十分にプロビジョニングすることができます。
近年、Redisは純粋なOSSの形から、よくマーケティングされたOSSとハイブリッドな商用ソリューションへと移行し、脚光を浴びています。Redisはデータベース、キャッシュ、メッセージブローカーとして使用できるデータストアで、さまざまなデータ構造と機能をサポートしています。
どちらもそれなりに成功した便利なツールですが、今回は、Memcachedが優れている点、つまりシンプルさ、信頼性、スケーラビリティに焦点を当てたいと思います。
Memcachedはシンプルです。
Memcachedの真の力は、そのシンプルさにあります。キー/バリュー/オブジェクトのハイパフォーマンスなキャッシング機能を提供することに集中し、それ以外のことはあまり行わないため、軽量で、多くの潜在的な障害点を管理する開発者やチームにとって最適なものとなっています。
一方で、Redisは様々なデータ型(文字列、リスト、セット、ハッシュ、ソートされたセット、ビットマップなど)と機能(ディスク永続化、メッセージブローカー、Luaスクリプト、トランザクション、pub/sub、地理空間サポート)をサポートしています。
しかし、キーバリューオブジェクトをキャッシュするだけなら、最もシンプルなオプションが最適だと思います。
複雑な分散開発とインフラストラクチャの世界では、Memcachedはより緊密な機能セットを提供し、結果としてチームが使用し管理するためのシンプルなツールとなるのです。
Memcachedは信頼できる。
Memcachedの単一のデータ型と必要最低限の機能により、Redisよりも故障モードが少なく、信頼性の高いツールとなっている。キャッシングレイヤーで何か問題が発生した場合、このシンプルさにより、原因を見つけることがより簡単になります。シンプルさと信頼性の具体的な例として、例えばMemcachedとRedisのメモリ割り当ての管理方法が異なります。Redisでは、使用済みメモリの連続したブロックを作成します。データアイテムが追加されると、それらは前のデータアイテムに”連続して”追加されます。アイテムを削除する必要がある場合、このメモリブロックには隙間や穴が残ります。これをフラグメンテーション(断片化)と呼びます。フラグメンテーション(断片化)に対処するため、Redisはメモリ割り当てを「クリーンアップ」するオペレーションを実行します。
一方、Memcachedは、対応するデータアイテムに対して、メモリの個別のブロックまたはチャンクを優先します。チャンクの容量が80バイトでデータ項目が60バイトの場合、20バイトが未使用となります。次のデータ項目が20バイトであったとしても、それは離散的な80バイトのチャンクに格納される。断片化されていないメモリは、効率性の観点からはマイナスになることもあるが、格納されたデータをコンパクトにしたり並べ替えたりする追加のバックグラウンドプロセス(潜在的な障害点)が不要になります。
そして、この信頼性は単に「問題を解決する」だけでよいわけではない。ソフトウェアを開発する多くの企業は、SLA(サービスレベルアグリーメント)と呼ばれる、レイテンシーなどの契約上のパフォーマンス保証を伴う契約を結んでいる。パフォーマンスを発揮しないといけないソフトウェアにおいてインメモリデータストレージは極めて重要な役割を担っているため、チームがSLA違反に陥らないように、実装がシステム・パフォーマンスに及ぼす影響を詳細に予測できるようにすることが重要です。
Memcachedはスケーラブルです。
シンプルさと信頼性は、ソフトウェアをスケールのに強力な武器です。そして、Memcachedは2つのカテゴリ(シンプルさと信頼性)だとかなり優れています。
しかし、Redis6.0から、RedisはI/Oのマルチスレッドをサポートするようになりました。そのため、実装のバージョニングによっては、Redisはこれらの追加インスタンスの管理とプロビジョニングのための別の大規模なレイヤーを必要とする可能性があり、高速なデプロイメントスケジュールに追いつこうとするインフラチームにとって頭痛の種となります。
一方、Memcachedはマルチコアマシンをサポートし、同じマルチコアノード上で複数のスレッドにまたがる並列処理を提供します。これは、Memcachedのインスタンスがスケールアップし、より多くのCPUコアにアクセスできることを意味します。Memcachedの実装では、アプリケーションを動的にスケールアウトすることができます。
どちらのシステムもクラスタソリューションを提供していますが、Memcachedのクラスタ実装はよりシンプルでセットアップが簡単で、メンテナンスの負荷も低くなっています。
まとめ
RedisとMemcachedはどちらもインメモリデータストレージの優れたツールです。しかし、様々なデータ型をサポートする必要がなく、インメモリソリューションが保存しているデータに対して様々な操作を行う必要がないのであれば、Memcachedが輝きます。
Twitter(X)、Netflix、Facebook のような高負荷のトラフィックを捌く組織から信頼されている Memcached は、その最小限の機能セットにおいても、メモリ割り当てやクラスタ管理のような技術的な決定においても、一貫してシンプルさを重視しています。
この記事は Eric O’Rear によって書かれたMemcached vs. Redis: When scalability and reliability matterの日本語訳です。翻訳は、Momento Community Advocateの小板橋 由誉が担当しました。