プライマリリージョン - Microsoft

T3-307
マイクロソフト株式会社
アプリケーションプラットフォーム製品部
太田佳伸
Velocityとは
概要
用語
機能
構成情報
使用方法
アーキテクチャの概要
動作詳細
コンポーネント
まとめ
今後の方向性
キャッシュとクラウド
明示的インメモリ分散アプリケーションキャッシュ
任意のデータ型をキャッシュ可能
複数のマシン上のメモリを統合し、キャッシュとし
て使用するというイメージ
異なるプロセス、異なる
マシンからの同一オブ
ジェクトへのアクセス
一元的なキャッシュ
クライアントの視点か
らは、1つの大きな
キャッシュへアクセス
キャッシュレイヤでは、
複数のキャッシュノード
へデータを分散配置
をキャッシュ可能
単純な API によるアクセス
スタンドアローンのサービスとしても、アプリケーション
に組み込みのローカルキャッシュとしても使用可能
ノードの追加により動的にスケールアップ可能
レプリカによる HA 構成
自動的な負荷分散
ASP.NET との統合(セッションデータ用のプロバイダ)
汎用的なクライアント開発言語のサポート(例, PHP, C#,
C++, etc.)
V1:
Cache-Aside アーキテクチャの考慮が必要 (Explicit Caching)
オリジナルデータソースとの自動同期はノンサポート
高速
>
低速
1.同一アプリケーション
による同一データの再利用
2.A. 異種アプリケーション
による同一データの再利用
2.B. ローディングアプリによる
事前のデータ準備(自動同期)
ローカルアクセスによる
パフォーマンス向上
オリジナルデータが使用
できない場合の代用
キャッシュが使用するメモリはアプリケー
ションと同一空間か否か?
ローカル
キャッシュ
メモリ
空間
アプリケーション
キャッシュサービス
メモリ
空間
アプリケーション
キャッシュサービス
リモート
キャッシュ
データ?
N
Y
アプリ
データ?
オリジナル
データソース
キャッシュ
透過的
N
キャッシュ
Y
オリジナル
データソース
アプリ
明示的
明示的キャッシュ
アプリケーションがキャッシュの存在を意識する必要が
ある
Cache-Aside パターン
データ?
N
Y
データ?
Y
N
オリジナル
データソース
キャッシュクラスター
アプリケーション
分散キャッシュ
キャッシュクラスターとして構成され、クラスター内で
データが分散配置される(パーティションetc)
レプリケーション
P
S
オリジナル
データソース
アプリ
P
S
キャッシュ
 キャッシュクラスター内でデータが分散配置さ
れ、各ノードで同一データのレプリカを持つ
ユーザ
ローカル
アプリケー
ション層
/Web 層
…
Application
Velocity Client
Local Cache
Application
Velocity Client
Local Cache
Application
Database
キャッシュ層
Server 2
Cloud
Velocity Service
Server 1
Velocity Service
Velocity Service
Velocity Client
Local Cache
Server 3
データ層
アプリケーション要件
データソースの散在
ローカル、RDB、フェデレート、クラウド
可用性、スケーラビリティ、パフォーマンス
データグリッド
ロジックとデータの分散化、ロジックとデータの距離
MDMをはじめとするデータスチュワードシップを考慮
した統合
メモリを含むハードウェアコストの低下
スケーラビリティと可用性を問われるMCアプリケーション
は、ほとんどの場合、中間層に分散キャッシュを実装
構成要素
使用法
アーキテクチャ
クラスターポート
デフォルト22234
クラスター内の他のホストとの間
でハートビートのやり取りを行う
アービトレーションポート
デフォルト22235
アプリケーション
API
キャッシュホストの障害時に、障
害が起きていることを確認・調整
するためのポート
Velocity
キャッシュ
ホストサービス
キャッシュポート
デフォルト22233
ローカル
キャッシュ
キャッシュホストとアプリケー
ション間でデータのやり取りを行
う
Windows ファイヤウォールの例
外が必要
DistributedCache.exe
Powershell
管理ツール
共有クラスター構成情報
共有フォルダー、SQL Server
クラスター構成情報を保持
クラスター起動時に各ホストが参照
共有
クラスター
構成情報
Velocity
キャッシュ
ホストサービス
Windows サービスとして実行
他のサーバとの混在は可
キャッシュホスト構成ファイル
DistributedCache.exe.config




XML Based File
• 共有フォルダ
SQL Server Compact Data
Provider
• 共有フォルダ
SQL Client Data Provider
• 接続文字列
格納される情報
動的グローバルパーティショニングマップ(GPM)
リージョン(パーティション)とホストとのマッピングテーブル
Velocity の構成情報とポリシー情報
ポリシーはグローバルに適用される
Velocity
サービスホストの
一つはGPMを持つ
Server 2
Velocity Service
Global Partition
Manager
Velocity Service
Server 1
Velocity Service
格納場所: 共有フォルダまたは SQL Server
Configuration Store
名前付きキャッシュのポリシー、GPM
Server 3
クライアント app.config
キャッシュホスト構成ファイル
キャッシュクラスター構成オプション
Velocity
Velocity
Velocity
キャッシュ
キャッシュ
キャッシュ
ホストサー
ホストサー
ホストサー
ビス
ビス
ビス
名前付き
キャッシュ
リー
ジョン
名前付きキャッシュ
デフォルトキャッシュ名:“default”
生成削除には管理コマンドを使用
リー
ジョン
リージョン (オプション)
リージョン内のオブジェクトの検索が可能
タグを使用
リージョンごとにタグはインデックス付けされている
名前付き
キャッシュ
クラスター稼働時に作成・削除が可能
リージョンを指定した場合、オブジェクトは分散配置されない。
オブジェクト
任意の System.Object クラスのインスタンス
オブジェクトは KeyValuePair<Key, Value>
Key Payload
Tags
121 xxxx “Toy” “Child”
A[“苗字”]=“太田”
キャッシュアイテム
キャッシュクラスターによって各オブジェクトに次のような情報が関
連付けられる
キー、タグ、バージョン番号、キャッシュ(リージョン)
キャッシュアクセスと API
リージョンとタグ検索機能
キャッシュタイプ(クライアント構成)
同時性制御(楽観的、悲観的排他制御)
期限切れと強制排出 (Eviction)
管理監視機能(Powershell)
キャッシュクライアントプログラム
名前空間:System.Data.Caching
必要なアセンブリ
CacheBaseLibrary.dll, ClientLibrary.dll, FabricCommon.dll,
CASBase.dll
CacheBaseLibrary.dll と ClientLibrary.dll を参照設定に追加
CacheFactory クラスから Cache オブジェクトを生成
Cache オブジェクトに対して、次のようなメソッドが提供される
Add
Put
Get
Remove
Item プロパティ
キャッシュクライアント構成情報は App.config または
コード内に記述
CREATE & UPDATE
Add
Put
• 同一キーを持つオブ
• 同一キーを持つオブ
ジェクトがある場合
ジェクトは更新され
には例外が発生
る
アイテム
• 配列形式
• オブジェクトは更新
using System.Data.Caching;
CacheFactory CacheCluster1 = new CacheFactory();
Cache Cache1 = CacheCluster1.GetCache("Cache1");
Cache1.Add("cachedStringKey1","This will be stored in cache");
Cache1.Put("cachedStringKey2", "This will be stored in cache");
Cache1["cachedStringKey3“] = "This will be stored in cache");
オブジェクトの操作
READ & DELETE
Get
アイテム
Remove
• 指定したキーを持つ
• 指定したキーを持つ
• 指定したキーを持
オブジェクトがない
オブジェクトがない
つオブジェクトの
場合にはNULLが返
場合にはNULLが返
削除
る
る
アイテム
• 配列形式の表現
• 値としてNULLを指
定することでオブ
ジェクトを削除
using System.Data.Caching;
CacheFactory CacheCluster1 = new CacheFactory();
Cache Cache1 = CacheCluster1.GetCache("Cache1");
string StringValue1 = (string) Cache1.Get("cachedKey1");
string StringValue2 = (string) Cache1["cachedKey2"];
Cache1.Remove("cachedStringKey1");
Cache1["cachedStringKey2"] = null;
リージョン
オブジェクトの配置を特定のホストに限定すること
によりキャッシュ内を検索可能にする機能
作成・削除はAPIから行う
// リージョン作成
強制排出を有効にするか否か
Cache cache1;
Boolean returnValue = cache1. CreateRegion (“region1”, true);
// リージョンクリアー・削除
public void ClearRegion ( string region )
public Bool RemoveRegion ( string region )
タグ検索
リージョン内のテキスト検索機能
// タグ定義とタグ付き追加処理
Tag hotItem = new Tag("hotItem");
Tag discItem = new Tag("discountItem");
catalog.Put(“toyRegion”, “toy-101”, new Toy(“Puzzle”), new Tag[]{hotItem});
catalog.Put(“toyRegion”, “toy-102”, new Toy(“Bridge”), new Tag[]{hotItem,discItem});
// タグ指定検索
List<KeyValuePair<string, object>> toys = catalog.GetAnyMatchingTag("toyRegion", hotItem);
クライアント構成
ローカルキャッシュ
オブジェクトをシリアライズせずにローカルに保持
する方式のキャッシュ
ルーティング
キャッシュクライアント内部にルーティングテーブ
ルを保持し、クライアントが直接適切なホストに接
続する
設定箇所
ローカルキャッシュとルーティングを有効にする場合
App.config
<dcacheClient deployment=“routing">
<localCache isEnabled =“true” sync=“TTLBased” ttlValue="300"/>
プログラム
コード
CacheFactory mycacheFactory = new CacheFactory(servers,
true, //routing
true); //local
Time
Client1
Client2
T0
CacheItem item =
catalog.GetCacheItem(“PlayerRegion”,
”Zune”);
CacheItem item =
catalog.GetCacheItem(“PlayerRegion”,
”Zune”);
T1
((ZuneObject)item.Object).inventory --;
((ZuneObject)item.Object).inventory--;
catalog.Put(“PlayerRegion”, “Zune”,
item.Object, item.Version);
T2
T3
catalog.Put(“PlayerRegion”, “Zune”,
item.Object, item.Version);
Client1がキャッシュを更新;
バージョン不一致で更新失敗
Optimistic
クライアントは
ロックせずに
データ取得
アプリケーション内の
更新処理
Client2がキャッシュを更新;
バージョン一致で更新成功
これによりバージョンも更新
キャシュ内オブジェクト取得時にロックを取得しない
取得時のバージョンと更新時のバージョンの比較
クライアントはオブジェクトのバージョンを取得し、更新後のオブ
ジェクトを送るときにバージョンも一緒に送付する
キャッシュホストは、送られたバージョンと現在のキャッシュ内オブ
ジェクトのバージョンが同一の場合にのみ更新を適用
更新を行う場合には、バージョンも更新される
Client1:
GetAndLock ("k1")
Client2:
GetAndLock ("k1")
GetAndLock はロック
ハンドルを取得
Pessimistic
他のGetAndLockは
失敗する
Client3:
Get("k1")
K1
通常のGetは
成功
クライアントはデータ取得時にロックハンドル取得
(GetAndLock)
ロックが解放されるまでは、他の操作 (GetAndLock) は拒否される
オブジェクトをロックすると、ロックハンドルが返される.
ロックを解放する前にクライアントに障害が発生した場合には、タイムアウト
により解放
ロックされているオブジェクトが期限切れになることはない。既に期限が切れ
ている場合、ロックが解除された途端に期限切れになる
通常のGetはブロックされずにデータを取得可能
更新時にはロックを解放する (PutAndUnlock)
更新せずにロックを解放することも可能(UnLock)
メソッド
同時性制御
説明
Get
NA
Get は排他制御の対象とはならない。オブジェクトが存在す
る限り取得する。オブジェクトがロックされていても、最新
バージョンを取得する。
GetCacheItem
NA
すべての CacheItemオブジェクトとタグやバージョン等の
関連情報を返す
GetIfVersionMismatch
NA
既存のオブジェクトが更新されている場合に限り取得する
Add
NA
Add は追加であり、同一キーのオブジェクトが存在する場合
にはFail
Put
optimistic
(Optional)
オプションでバージョンを指定した場合、バージョンが同じ
場合に限り更新する
Remove
optimistic
(Optional)
オプションでバージョンを指定した場合、バージョンが同じ
場合に限り削除する
GetAndLock
Pessimistic
オブジェクトを取得し、ロックをかける 。他の
GetAndLockは例外を発生する。他のGet呼び出しに対する
排他制御はない
PutAndUnlock
Pessimistic
GetAndLockで取得したオブジェクトを更新し、ロックを解
除する.
Unlock
Pessimistic
明示的にオブジェクトのロックを解除する
キャッシュ内からデータが消去される場合
クラスターまたはサービスの再起動
しきい値やメモリ残量に応じた強制排出
期限切れ
キャッシュ作成時に TTL を指定
New-Cache -CacheName myCacheName -TTL 8 (min)
New-Cache -CacheName myCacheName -NotExpirable
強制排出(Eviction)
LowWaterMark < Data < HighWaterMark の場合
期限切れしたオブジェクトのみを削除
Data> HighWaterMark の場合
LRUをベースに期限切れしていないオブジェクトも削除
メモリ残量が15%以下になった場合
HWMを超えた場合と同様
5%のメモリを確保する
Cache-Asideパターンを考慮する必要がある
クラスター管理
Start-CacheCluster 、Stop-CacheCluster 、Restart-CacheCluster
ホスト管理
Get-CacheConfig、Set-CacheConfig
Start-CacheHost、Stop-CacheHost
Get-CacheStatistics、Get-Cache、 Get-CacheHost 、Get-CacheRegion
キャッシュ管理
New-Cache、Remove-Cache
Get-Cache、Get-CacheConfig、Set-CacheConfig、Get-CacheStatistics、
Get-CacheRegion
コマンドの例
キャッシュの作成
new-cache -CacheName NC1 -Secondaries 1 -TTL 15 -Eviction LRU
キャッシュ情報の
取得と結果の例
get-cacheconfig -CacheName NC1
CacheName : NC1
Secondaries : 1
TTL
: 15 mins
IsExpirable : True
Type
: Partitioned
EvictionType : LRU
キャッシュの作成
API によるプログラム
キャッシュの動作
ローカルキャッシュ
高可用性構成
レプリケーション(Not in V1)
フェールオーバー時の動作
コンポーネント
ローカルコンポーネント
分散コンポーネント
ローカルキャッシュはローカルであることと、シリアライ
ズされていないという2点でパフォーマンスに貢献
クライアント通知機能でクライアントとプライマリの同期
Put(K2, v2)
Get(K2)
Velocity クライアント
ローカルキャッシュ
Velocity クライアント
ローカルキャッシュ
K2, V2
ルーティング層
ルーティング層
Cache1
Cache2
Cache3
プライマリリージョン
プライマリリージョン
プライマリリージョン
K1, V1
K2, V2
K3, V3
• Put (K2, V2) on Cache1
– Cache2 は変更のレプリカをセカンダリ Cache1 と Cache3 へ送信
– Cache1 または Cache3 からの ACK を待ち、クライアントに応答
– すべてのノードからの ACK を待つ必要はない(クォーラムベース)
• Get (K2) on Cache3
– Cache3 は K2 のプライマリ Cache2 へリクエストをルーティング
Put(K2, v2)
Get(K2)
Velocity クライアント
ルーティング層
Velocity クライアント
ルーティング層
Cache1
Cache2
Cache3
プライマリリージョン
プライマリリージョン
プライマリリージョン
K1, V1
K2, V2
セカンダリリージョン
K3, V3
K2,V2
セカンダリリージョン
K3, V3
K1, V1
K3, V3
セカンダリリージョン
K2, V2
K1, V1
• Put (K2, V2) on Cache1
– Cache2 はローカルの処理を行い、Cache1に応答を返す
– その後、Cache2 は非同期処理ですべてのホストにレプリカを送信
• Get on cache3
– Cache 3 はローカルキャッシュからデータを取得し、結果を返す
Get(K2)
Put(K2, v2)
Cache1
Cache2
Cache3
レプリカリージョン
レプリカリージョン
ルーティング層
レプリカリージョン
K2, V2
K2, V2
K2, V2
K3, V3
K1, V1
K3, V3
K1, V1
K3, V3
K1, V1
Cache4
Primary for
(K4,V4)
K4, V4
Partition
Manager
Global
Partition Map
Secondary for
K3, V3
ルーティング
テーブル
再構成
エージェント
K1, V1
Cache1
K1, V1
レプリケーション
エージェント
Cache2
Cache3
Primary for (K2,V2)
Primary for (K3,V3)
K3, V3
K2,
V2
ローカルパーティ
ションマップ
Secondary for
K3, V3
1. Cache3: Cache2の障害を検知し、GPMである
Cache4に通知
2. Cache4: Cache2が持っているプライマリパー
ティション(K2を含む)に対するセカンダリを探
し、その中から新しいプライマリを選出
3.Cache4: Cache1を新プライマリとして決定、
Cache1とCache3に通知、GPMを更新
4. Cache1: 他のセカンダリであるCache3に対して
最新データの確認
5.Cache1: K2に対するプライマリに昇格、再構成
を実行
K2, V2
Secondary for
K3, V3
Secondary for
K1, V1
K2, V2
K4, V4
クライアント
キャッシュ API
フェデレートクエリプロセッサ
ディスパッチ管理
キャッシュAPI
& サービス
分散
オブジェクト
マネージャ
ツール統合
管理監視
キャッシュモニター
ローカルキャッシュ
キャッシュ API
キャッシュサービス
分散コンポーネント
Common Availability Substrate
ルーティングテーブル
ディスパッチマネージャ
分散マネージャ
パーティションマネージャ
(LPM、GPM)
レプリケーション
エージェント
ローカルストアコンポーネント
オブジェクト
マネージャ
クエリ処理
インメモリデータ
マネージャ
クライアント通知機能
再構成エージェント
ポリシー管理
リージョン管理
DM API
ハッシュ, B-ツリー
Fabric
障害検知
データ転送
高信頼性
メッセー
ジング
分散オブジェクトマネージャ
リクエストがローカルホストにある
か、リモートホストにあるかの切り
分け
プライマリノードへのリクエスト転
送
CASとのインターフェースによりHA
やレプリケーションを実現
インメモリデータマネージャ
メモリベースのローカルデータ管理
データ構造、ハッシュテーブル操作、
レコードアクセス、
タグ、タグベースアクセス
同時性制御
バージョニング
期限切れ、強制排出
オブジェクトマネージャ
データマネージャが管理するデー
タ形式のオブジェクトをオブジェ
クトとして抽象化し、管理するア
ブストラクションレイヤー
オブジェクトはデータマネージャ
で管理される形に変換される
リージョン管理、アイテム管理
(オブジェクト+メタデータ)、
キャッシュポリシー
メモリサイズとEvictionの管理
データマネージャへのローカル
LINQクエリ
クライアントへの通知機能
パーティションマネージャ
パーティションマップの維持
管理
クラスター内のノード障害の
通知はPMが受け取り、再編成
を開始
パーティションマップ
パーティションとノードとの
マッピング(ハッシュ)テー
ブル
グローバルパーティション
マップ:すべての名前付き
キャッシュに対するパーティ
ションマップ
ローカルパーティションマッ
プ:ノードごとのパーティ
ションのリスト
再構成エージェント
再構成が必要になる4つのケー
スとその対応
プライマリの障害
プライマリの排除
セカンダリのプライマリへの
昇格 (
セカンダリの障害による排除
パフォーマンスの問題から単
純に排除
プライマリの障害回復による
復帰
セカンダリとして参加
セカンダリの新規追加
データを事前に復旧するため
にビルドフェーズを経て、
データ転送による妨害をする
ことがなくなった時点で参入
Fabric
レプリケーションエージェント
2重リング構造による障害検知
障害時のノードリーダー選出
メッセージ転送
メッセージルーティングテーブル
の管理
高可用性のためのレプリケーショ
ン機能
単一マスターを基にした、プライ
マリ-セカンダリ構成
Write オペレーションは常にプラ
イマリ
プライマリから、複数のセカンダ
リで構成されるWRITEクォーラ
ムにオペレーションを送信
200
180
210
174
218
151
225
r7
250
135
r6
r-6
120
r5
103
98
83
76
17
r-5
r4
90
2
30
r-4
64
50
46
40
方向性
クラウドにおける役割
他のテクノロジとの関連
スケジュール
Webシナリオ
エンタープライズ
Software+Servi
/ HPC シナリオ
cesシナリオ
データベースアクセス
データグリッドとし
クラウドストレージ
遅延の短縮化
てのキャッシュ
に対するアプリケー
スケーラビリティと可用
LINQ で容易に、直接
ションキャッシュ
性の向上
クエリが可能
SQL Data Service、
アクティビティデータの
データとコンピュー
Windows Azure Storage
繰り返し利用
ティングの同一カ所への
Serviceとの統合
IIS/ASP.Net アプリ
配置(HPCサーバへの統
今後のデータサービス
ケの状態データの格納
合)
(BI、ストリーミング、
プリフェッチによるレ
永続性
レポーティング)
ファレンスデータの参照効
様々なクライアントか
REST および SOA のア
率化
らのアクセスをサポート
クセス
クラウドの遅延に対してキャッシュや同期とい
う機能が重要
参考
Sync Framework、Huron、Astoria Offline
3つの展開パターン
クラウドでホストされるアプリケーション
オンプレミスアプリケーション
サービスとして
Windows Azure
Windows Azure
サービスロール
Windows Azure
サービスロール
サービスロール
Velocity
Velocity
クライアント
Velocity
クライアント
クライアント
Velocity キャッシュ
Storage / SDS
ASP.NET
アプリケーション
アプリケーション
アプリケーション
Velocity
クライアント
Velocity
クライアント
Velocity
クライアント
Velocity キャッシュ
Storage/SSDS
ASP.NET
アプリケーション アプリケーション
Velocity
クライアント
Velocity
クライアント
アプリケーション
Velocity
クライアント
Velocity キャッシュサービス
Storage/SSDS
データ関連テクノロジとの関連
ASP.NET キャッシュ
ADO.NET DataSet
任意のオブジェクトを格納でき
る単純なキャッシュ
結果セットに対するキャッシュ
Get/Put/Delete APIs
単純クエリ
リッチなイベント処理
SQL Data Services
大規模分散インフラ
スケールアウト
フェールオーバー
レプリケーション
分散ハッシュテーブル
データ
マネー
ジャ
ページキャッシュ基本機
能
Get/Put/Delete API
SQL Server CE
ストレージエンジン
ISAM APIs
小さなフットプリント
コンポーネント化された
組み込みDB
SQL Server
エンタープライズデー
タベース
リッチなデータベース機
能
通知機能
ブローカー機能
CTP1
TechEd 2008
CTP2
PDC 2008
CTP3
Mix 2009
RTM
分散パーティション
キャッシュサービス
リージョンとタグ検索
ローカルキャッシュ
ASP.Net 統合
可用性
構成オプション
Powershell
Bulk Access APIs
セキュリティ
Read-Through
Write-Behind
イベント通知
Mid 2009
パフォーマンス
可用性
スケーラビリティ
Velocity
Http://msdn.microsoft.com/data