分散キャッシュ Velocity (1)

データキャッシュについて

マイクロソフトの太田です。今回は、CTP3 がリリースされた Project Code Name Velocity というキャッシュについて解説します。1月に行われた TechDays2009 では Velocity セッションとして紹介しましたが、ほとんど情報提供をしてきておりませんので、1回では網羅できません。何回かに分けて、キャッシュの位置付け、Velocityの機能、特徴的な点、等々を説明していきたいと思います。

キャッシュの用途ですが、一般にキャッシュの用途は明確です。

1.オリジナルデータソースよりも位置的に近い、あるいは構造的に簡単であることによるパフォーマンスの向上

2.オリジナルデータソースが使用できない場合の代用

3.オリジナルデータソースの機能の一部を代替することによる負荷分散

 

1 は、キャッシュをたとえばクライアントアプリケーションと同じマシンに置く、あるいは複数のクライアントで使用する場合でもクライアントマシンと同一ネットワーク上に置くということでネットワーク上の距離を短縮することで遅延を少なくするという考え方が一つ。もう一つは、SQL Server のような複雑なクエリをサポートしないことで、データアクセス自体のスピードを向上させるという方法です。単純な操作を行うだけであれば処理自体が簡単になりますからその分だけ高速になります。ADO.NET の非接続型の DataSet もこのようなキャッシュの一例と考えることができます。

2 は外出先のノート PC やモバイル機器のような場合が典型的な例ですが、このような非接続環境により、ネットワークへのアクセスが制限されている場合のデータアクセスに対してキャッシュが代替するという考え方です。この場合、データのフレッシュネス(新鮮さ:データが最新のものではないとしても最新のものに近いかどうか)が問題になります。更新頻度の高いトランザクションデータは、キャッシュによる代替では意味がない場合も多々あります。一方で多くのマスターデータ(製品のリスト)のように、通常あまり頻繁に更新されることのないデータはキャッシュによる代替は有効です。モバイルで使用される SQL Server Compact Edition はこの分類に入るものと考えることができます。

3 は 2 と同様の考え方ですが、データソースが使用できる場合であっても、適宜データソースとキャッシュの間で同期をとりながらフレッシュネスを保ち、かつ1つのデータソースにアクセスが集中することを防ぐという用途です。すでに多くのアプリケーションでもこれらの用途ごとの使用がされています。データグリッドや HPC などにおける参照データの一時格納領域は、この分類に入るでしょう。

現時点では、Velocity をはじめとするキャッシュのターゲットとしては、ASP.NET でのステータスのストアをはじめとする一時的なデータストアが挙げられますが、今後は上記のデータグリッドにおけるキャッシュとして直接アプリケーションからクエリを行うような形式や、クラウドのデータアクセスにおける遅延をカバーするためのキャッシュが重要になると考えられます。

分散キャッシュテクノロジ Velocity

さて、Velocity は現在 CTP3 がリリースされたばかりですが、予定では夏ごろにリリースされる予定です。現状では、次のような特徴を持つものになります。

  • CLR オブジェクト、タプル、XML、バイナリデータ等任意の型のデータをキャッシュ可能な明示的キャッシュ
    • データはキーと値の対(Key-Value-pair)で格納されますが、このときに値としてはプログラム内で使われるオブジェクトをそのまま格納できます。ただし、リモートキャッシュに格納する場合には、キャッシュ内でシリアライズされます。
  • 単純な API によるアクセス
    • キャッシュをアクセスするための API には単純な ADD、PUT、REMOVE といったメソッドが用意されています。
  • スタンドアローンのサービスとしても、アプリケーションに組み込みのローカルキャッシュとしても使用可能
    • Windows サービスとしてキャッシュサーバを設定することもできますし、クライアントマシン内にローカルキャッシュを持つこともできます。
  • ノードの追加により動的にスケールアップ可能
    • 分散キャッシュを容易に構成でき、ノードを追加することで、自動的に負荷分散が行われます。
  • レプリカによる HA 構成
    • 高可用性設定を行うことで、キャッシュオブジェクトは常にレプリカが作成され、セカンダリノードにレプリカが保持されます。プライマリノードの障害時には自動的にセカンダリノードがプライマリに昇格し、他のノードがセカンダリとして参入します。
  • ASP.NET との統合(セッションデータ用のプロバイダ)
  • 制約事項としては、
    • 明示的キャッシュであるために、アプリケーションはキャッシュの存在を意識し、キャッシュ内にデータがあるかないかをチェックするようなコーディングをする必要があります。(Cache-Aside アーキテクチャ)

つまり、メモリ上に一時的な記憶領域を持つサーバを複数のノードで分散配置することで最初に列挙したキャッシュの機能を提供することが Velocity の役割です。

上記の機能に加えて、昨日リリースされた CTP3 では、以下のようなアップデートが行われました。

  • クライアント側のローカルキャッシュとリモートキャッシュとの同期が取りやすくなる、キャッシュ通知機能(Cache Notification)が組み込まれました。ローカルキャッシュ内に保持したオブジェクトが、リモートキャッシュが変更された場合に無効になるという機能です。
  • APIの名前空間が Microsoft.Data.Caching へと変わり、クラス名の先頭が DataCache で統一されました。
  • キャッシュやキャッシュクラスターの構成情報の保持方法が変わりました。これまでの共有フォルダー内の XML ファイルという保持がなくなり SQL Server Compact Edition か SQL Server 2005/2008 のいづれかになりました。構成情報の編集には XML ファイルの編集ではなく、Windows Powershell による管理(Import、Export)に変わりました。

具体的な使用方法等については今後紹介していく予定です。