Comments
Description
Transcript
WPF / ObjectGrid 1 ソフトウェア事業 澤出達郎
WPF / ObjectGrid ソフトウェア事業 澤出達郎 V1.1 1 アジェンダ n WPF (WebSphere Partitioning Facility) n ObjectGrid 2 WPF概要 WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 3 WPFとは? リクエストの内容を見て目的の場所に ルーティングする機能 + パーティション管理機能 2つの機能を提供します 4 その目的は? OLTP処理のパフォーマンスの向上 データベースのボトルネックを解消 現在のJ2EEサーバーは、 ”read-mostly” (読み取り主体)の 処理には強い 書き込みが増えてくると DBボトルネックが発生 5 J2EEサーバーのボトルネックとは? WAS クラスター Requests DBへのUpdate / Readが発生 単一のDB DB WLM ラウンドロビン でディスパッチ キャッシュの 有効度が低い ロック待ち 大量のReadアクセス ボトルネックを理由としては以下のような現象が考えられます。 リクエストは、公平にディスパッチされます。それぞれのサーバーでは、キャッシュを保持しますが、 短い時間でデータが更新される場合は、キャッシュの有効度は低くなります。結果としてデータ ベースに対する更新アクセス及び並行して大量のReadアクセスが発生します。これらのアクセスは 整合性を維持するためにトランザクション を持って処理されるため、ロック待ちが発生するようになり ます。データベースは多くの場合、単一のものが使用されており、競合が発生しやすい状況です。 6 どうやってボトルネックを解消するの? キャッシュ 処理 処理リクエスト パーティション“IBM”メモリ内 データベース 多くの処理をキャッシュで処理 データベースの負荷を軽減 効果 No.1 7 何故キャッシュできるの? “IBM”はクラスター 内で唯一の存在 (Singleton) IBM パーティション・ルーター メモリー中にデータ を蓄えても他と不 整合を起こさない EBA 処理要求 Key=“IBM” コンテンツ“IBM”を見て ルーティング OCRL キーが”IBM”の処理要求は、 IBMにしか飛ばない クラスター 8 Singletonで大丈夫なの? IBM EBA EBA IBM OCRL OCRL クラスター HA Manager ! クラスター HA Manager 9 WPFを使用したクラスタリングのイメージ WAS クラスター Requests DB Cache Cache Cache Cache WPF WLM Cache Cache Cache Cache 専用の処理空間 へリクエストを ルーティング HAManager が監視 分割されたDB キャッシュを 活用 DBアクセスの低減 WPF を活用した非対称型クラスタリングの概念図です。リクエストは、Keyに基づいて対応するパー ティション にルーティングされます。個々のパーティションでは、キャッシュや非同期処理が有効に 利用されています。従来に比較してDBアクセス量は減っています。また、DBは、分割されており、 WPF が使い分けを行っています。個々のパーティションは、HAManagerにより監視されており、障 害発生時にはフェールオーバーされます。 10 クラスタリングの新しいパラダイム 非対称型クラスタリング n 対照型クラスタリングは、リスクエスト全体を各マシンに分配 非対称型クラスタリングは、リクエストを分割して処理 n 個々のパーティションはSingletonとなるためHA機能が必要 n 処理要求 公平に分散 Key に基づいて要求を分割 WLM クラスター・メンバーに分散 分割された専用の処理空間へ 処理システム 対照型クラスタリング 非対称型クラスタリング 非対称型クラスタリングは、クラスタリングの新しいパラダイムです。従来の全てのリクエストを公平 に分散して処理する“対照型”に対して非対称型では、リクエストを分割して処理を行います。分割 されたリクエストは専用に処理空間に送られて処理が行われます。個々の処理空間では、論理的 に分離されシングルサーバーであるかのように 処理が行われます 。 非対称型の処理では、個々の空間(パーティション)が単一の存在になるために障害が発生すると その空間に割り当てられたKeyの処理が停止してしまいます。このために個々の空間に対する高可 用性を持たせる必要があります。 11 非対称クラスタリング SeverSide.comより http://www.theserverside.com/news/talks/videos/BillyNewportText/interview.tss 12 WPF適用例 WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 13 WPFの適用例 オンライン証券 (適用前) n 会員から証券銘柄の売買を受け付けるシステム n 複数の銘柄をクラスター全体でサポート n 売り注文、買い注文の突合せによって売買が成立 売り注文 買い注文 買い注文 クラスター WAS 読み取り/更新 DB WAS ボトルネック 売り注文 WAS WAS 頻繁な更新 大量の参照 14 WPFの適用例 オンライン証券 (適用後) n 株の銘柄単位でパーティションを作成 n 各銘柄毎の売買情報をメモリ中にキャッシュ n 非同期処理にてマッチングを実施 売り注文 買い注文 買い注文 売り注文 クラスター 必要に応じて DBに保管 キャッシュ DB キャッシュ キャッシュ キャッシュ 追加、更新時のみ のアクセス 15 WPFの適用例 オンライン証券 非同期Bean*の利用 n メモリ中に蓄えたデータを非同期に処理 n マッチング処理をメモリ内で非同期Beanが処理を行う さらにパフォーマンス向上 パーティション Startup Bean Work Manager 注文 注文 売買成立 Async Bean Async Bean PSSB マッチング処理 A銘柄売 り注文 パーシスタンス DB Entity Bean ¥100 50株 ¥105 100株 ¥98 10株 ¥120 50株 A銘柄買い注 文 ¥100 100株 ¥90 100株 ¥95 10株 ¥110 50株 メッセージ・ キュー アプリケーション・キャッシュ *WAS V6では標準 でサポート、CommonJ WorkManagerとAsynch Beanの2種類が存在 図は、Asynch Beanを使用した例 パーティション内で行われる非同期処理の例になります。この例は、オンライン証券の業務を非同 期化したものです。注文がパーティションに届くとメモリキャッシュを更新し、DBに保管を行います。 DBは、障害発生時のキャッシュの再生に使用されます。メモリ中にキャッシュされた売り注文、買い 注文を非同期Bean を使って定期的にマッチングの処理を行っています。売買が成立した場合は、 メッセージ・キューに結果を送ります。 16 パーティションとは? WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 17 WPF使用システムの具体的なイメージ Partition 001 例. 5枚のブレード・サーバーに 10プロセスのアプリケーション・サーバー その上に500個のパーティション パーティションは、アプリケーション・サーバーのプロセス内に作られる論理的な処理空間です。こ れらは論理的な分割であり、物理的には分離されていません。一つのプロセス内のリソースを共有 しています。一つのアプリケーション・サーバーのプロセス内に複数のパーティション を持つことが 可能です。この例では、5枚のブレードサーバーに2個づつのアプリケーション・サーバーを配置し そこに500個のパーティション を配置しています。 18 パーティションとは? n Content Based ルーティングの宛先 u ルーティングの方法は2種類 l l u 隔離された空間では無い l n 同じアプリケーション・サーバーに存在するパーティションは、同一のメモリ空間に 存在 個々のパーティションは、クラスター内で一つだけ存在 u u n IIOPルーティング HTTPルーティング 一つだけの存在(Singleton)であることが保障されている パーティション名は、クラスター全体で固有 パーティションは、HA Managerにより監視 u 障害時にはPeer failoverによって復元される Work Load Management(WLM)の視点からみるとパーティションとは、リクエストがルーティションさ れる先と言えます。ルーティングには、IIOPを利用するEJBからのルーティングとHTTPを利用した Webベースのものがあります。個々のパーティションはクラスター内で固有であることが 保障されて おり、ある名前を持つパーティションは、クラスター内でひとつしかありません。パーティションは、一 つのJVMの中にあり、物理的には隔離されていません。個々のパーティションは、HAマネージャに より監視されており障害時には正常なサーバーにフェールオーバーされます。 19 パーティションの利点とは? n パーティションは、Singleton u u クラスターにおけるお作法”Stateless”の制約無し 開発者の自由度が高い l キャッシング l Ø メモリ中にデータを蓄えても不整合を生じない 非同期処理 Ø u l n メモリ中の蓄えたデータを遅延処理可能 順序性を持たせた処理が容易 他のクラスターメンバーと同期をとる必要無し データベースの負荷を軽減してボトルネックを解消可能 u キャッシュを利用しデータベースへのアクセス頻度を低減 l 例. update, insert のみアクセス。参照は、キャッシュから。 l 順序性を持たせるためにデータベースで同期をとる必要なし 単一の存在であるパーティションでは、クラスターで存在していた開発者 に対する制約が少なくなり ます。パーティションのメモリ中に何らかのデータを蓄えてメモリを使用した処理を行ったり、リクエス トのタイミングとは別に非同期なサーバー処理を走らせることが可能になります。特定のKeyに対す るリクエストを順序性を持って処理することも容易になります。メモリ中にデータベースの情報を キャッシュすることによりデータベースに対する問い合わせ処理を減らすことができます。また、非 同期処理を活用してバッチ的にまとめてリクエストを処理することも可能になりこれによってもデータ ベースに対するアクセス回数を減らすことができます。 20 パーティションの数は? n Keyの数だけ生成する方法 Keyベース u u u u n 比較的Keyの数が少ない場合 Keyの名前のパーティションを生成、Keyの名前でルーティング Keyの追加に応じてパーティションも動的に追加される 個別のKeyのパーティションをServer間で移動可能なため、ロードバランスに 適している 個定数のパーティションを使用する方法 Hashベース u u u n < 100,000 Keyの数が多い場合に使用 Keyの追加・削除に伴う動的なパーティションの追加・削除は必要なし 個別のKeyのパーティションの移動はできない。共通のHash Keyを持つもの と一緒に移動になる 両方使用するHybridパターンもあり u アプリケーションの中でKeyベース、Hashベースを両方を使用するパターン リクエスト母集団のパーティションへの分割には、2つのアプローチがあります。一つは、Keyベース のパーティション化です。これは、Keyの名前を1対1でパーティションに対応させる方法です。基本 的にKeyの名前でパーティション が生成され、Keyの名前でルーティングが行われます 。Keyが追加 された場合は、動的なパーティションの追加が発生します。この方法は、個別のKeyの単位でパー ティション の移動が可能なため、ロードバランスが行い易いという特徴があります。もう一つの方法と しては、Hashベースのパーティション化あります。これは、Keyが多い場合に適用され、固定数 の パーティション を使用します。Keyは、Hashされ、あるパーティションに割り当てられます。この方法 では、Keyの追加、削除の伴ってのパーティションの追加・削除は必要ありません。パーティション の移動は、共通のHash Keyを持つものが一緒に処理されます。 一つのアプリケーションでKeyベース、Hashベースを両方使用するHybridなアプリケーション も作成 可能です。 21 高可用性は? n HAマネージャによるピア・ フェールオーバー機能提供 u 稼動中の正常ノードに高速でパーティションを再生 n 障害時および移動時には、サービスの停止が発生 u 該当パーティションの処理には瞬断が発生 n アプリケーションがFailOverイベントを受け取り可能 u PSSBにて実装 (ロード時、アンロード時) partitionLoadEvent(String name) * 実装方法 を参照 partitionUnloadEvent(String name) u 従来のクラスターアプリケーションと違う部分 u キャッシュの再生(保管)等の操作を行うことが可能 n ポリシー設定により挙動を制御可能 u フェールバック、Quorum *HAマネージャは、WAS V6 NDで導入されたものと同じテクノロジー パーティションは、Singletonであるため障害発生時や移動時にはそのパーティション上のKeyに対 するサービスの停止が発生します。このためサービスの停止の影響を最小限 に留めるための フェールオーバー機能が重要になります。WPFでは、HAマネージャを利用したフェールオーバー 機能を提供しています。これは、正常なサーバーを選択し、そのサーバー上にパーティション を活 動化するものです。既に稼動中 のサーバーであるため、比較的高速にフェールオーバーが行われ ます。フェールオーバー発生時には、PSSB内のメソッドがコンテナから呼び出されます。ポリシー 設定によりフェールオーバー時の挙動を制御することができます。障害を起こしたサーバーが復帰 したときにパーティション を戻すフェールバック設定、サーバー数の1/2+1が稼動時のみパーティ ションを活動化させるQuorum機能があります。Quorum機能は、ネットワーク障害によるネットワーク の分断時に2重にパーティションが生成されることと防ぐ働きがあります。 22 参考:フェール・オーバー・テスト サーバー・ ダウン n クラスター・ メンバーのサーバーを停止する u 管理コンソールから停止。 所要時間に注目 サーバーCL1 トレース (元サーバー) [05/10/02 [05/10/02 [05/10/02 [05/10/02 0:22:23:585 0:22:23:595 0:22:23:605 0:22:23:615 JST] JST] JST] JST] down 00000043 PartitionedAp > 00000043 PartitionedAp > 00000043 PartitionedAp > 00000043 PartitionedAp > WPF WPF WPF WPF partitionUnloadEvent BAE Entry partitionUnloadEvent IBM Entry partitionUnloadEvent ORCL Entry partitionUnloadEvent MSFT Entry サーバーCL2 トレース (フェールオーバー先サーバー) [05/10/02 [05/10/02 [05/10/02 [05/10/02 0:22:24:306 0:22:24:797 0:22:24:807 0:22:24:817 JST] 0000001b PartitionedAp > JST] 0000001b PartitionedAp > JST] 0000001b PartitionedAp > JST] 0000001b PartitionedAp > WPF WPF WPF WPF partitionLoadEvent ORCL Entry partitionLoadEvent IBM Entry partitionLoadEvent BAE Entry partitionLoadEvent MSFT Entry 短時間(約1秒)で復旧 同一サーバーにて二つのアプリケーション・サーバープロセス間でフェールオーバーを発生させた 例です。UnloadされてからLoadされるまで約1秒で終わっています。 23 実装方法 WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 24 パーティション対応J2EEアプリケーションとは? n 特殊なSession BeanであるPSSBを含んでいることが必須 u u u u Partitioned S tateless S ession Bean パーティションのライフ・サイクルに関係するメソッドを持つ EJB Jarの中に必ず一つ必要 (一つしか持てない) 同じEJB Jarにビジネス・ロジックだけのPRSBも記述可能 l Partitioned Routable Session Bean l PRSBのメソッドもパーティション・ルーターのルーティング対象 ビジネス・ロジックを分離させ、コードの可読性を向上させる l EJB Jar EJB PSSB PRSB PRSB EJB EJB EJB WPF に対応するアプリケーションには、PSSBと呼ばれる特殊なSession Beanを備える必要がありま す。PSSBは、パーティションのライフサイクルに関するメソッドが含まれており、必要に応じてコンテ ナから呼び出されます。このPSSBは、EJB Jarの中に一つしか持つことができません。パーティショ ンへのルーティングを必要とするビジネスロジックは、PRSBとして切り出すことも可能です。PRSBは、 PSSBと同じEJB Jarにパッケージされる必要があります。PRSBの中には、PSSBが必要とする特別な Interfaceは実装する必要はありません。PRSBには、ビジネス・ロジックを分離させコードを読み易く する効果があります。 25 パーティションの生成方法 n アプリケーションの起動時 u PSSB (Partition Stateless Session Bean)の以下のメソッドを使用 l getPartitions() Ø 起動時にコンテナから呼び出されるメソッド Ø n プログラム中で動的に追加 u PartitionManagerの以下のメソッドを使用 l addPartition(pd) Ø n 戻り値は、PartitionDefinitionの配列 引数 pdは、PartitionDefinition オブジェクト パーティションはクラスター・メンバーに自動的に配置される u 配置後移動させることも可能 パーティションは、アプリケーションの起動時にPSSBによって生成されます。PSSBのメソッド getPartitions()の戻り値にパーティションの定義体であるPartitionDefinitionの配列を戻すことによっ てパーティションが生成されます。getPartitions()は、PSSBを含んだアプリケーションの起動時にコ ンテナから呼び出されます。通常はデータベースからキーを取り出すことにより定義体 の配列を作 成します。パーティションは、プログラムの起動中にAPIによって動的に追加することも可能です。 パーティションのサーバーへの配置は自動的に行われます 。ポリシーを設定することによりサー バーを指定することも可能です。また、配置後移動することも可能です。 26 参考:PSSB n PartitionHandlerLocal をLocalインターフェースに実装 u ライフサイクル関連の主なメソッド PartitionDefinition[] getPartitions() クラスター内でアプリケーション が開始される時に呼び出される。このアプリケーショ ンで作成するパーティション のリストを戻す void partitionLoadEvent(String name) クラスター内であるパーティション が活動化された時に呼び出される。パーティション で使用するリソースのセットアップに利用する void partitionUnloadEvent(String name) パーティションが非活動化された時に呼び出される。(他のメンバーに割り振られる 前) リソースのクリーンアップ に利用する Remote インターフェース Bean クラス Home インターフェース Local インターフェース Local Home インターフェース PSSBには、Local インターフェースにWPF が提供するParitionHandlerLocalを実装する必要があり ます。ParitionHandlerLocalの中には、パーティションのライフサイクルに関連するメソッドが含まれ ています。partitionLoadEventは、パーティションが活動化された時に呼び出され、 partitionUnloadEventは非活動化された時に呼び出されます。それぞれ、キャッシュの再生や処理 のリソースのCleanUpに利用できるEventになります。また、パッケージ中には、クライアントからの ルーティング先を決定するための<EJBName>_PartitionKey.javaを含める必要があります。このクラ スの戻り値がルーティング先になります。 27 パーティションの管理 WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 28 パーティション操作方法 wpfadminコマンド及びAPI n wpfadmin u パーティションの管理を行うコマンド l リスト表示、移動、バラつきの均衡化、非活動化、 l パフォーマンス・モニタリング設定 ポリシーの設定 l n API u EJBやWebアプリケーションは、JNDIでPartitionManagerをlookupできる java:comp/websphere/wpf/PartitionManager PartitionDefinition createPartitionDefinition(String pName, String tier) void addPartition(PartitionDefinition name); void removePartition(String name); String[] getPartitions(); 開発者はAPI を通じてパーティション を操作できます。addPartitionは動的なパーティション の追加、 removeParititionは削除を行うことができます。これは、一つのサーバーにて行えば、クラスターメン バーに自動的 に変更が通知されます。 29 wpfadmin コマンドの例 balance n wpfadmin balance u アクティブなサーバー全体にパーティションを均衡化させる Server CL1 Server CL1 P7 P8 P9 Server CL2 P10 Server CL2 P5 wpfadmin balance P6 均衡化 Server CL3 P3 P1 P4 P7 P2 P5 P8 P6 P9 P10 Server CL3 P1 P4 P2 P3 wpfadmin balance コマンドは、特定のサーバー偏ったパーティション をクラスター全体に均衡化しま す。パーティションの配置は、自動的 に決定されます。移動されるパーティションでは一時的な サービスの停止が発生します。 30 wpfadminコマンドの例 move n wpfadmin move u アクティブなサーバー全体にパーティションを均衡化させる Server CL1 Server CL1 P1 Server CL2 Server CL2 wpfadmin move... 移動 Server CL3 P3 P1 P4 P7 P2 P5 P8 P6 P9 P10 Server CL3 P4 P2 P3 P6 P7 P5 P8 P9 P10 wpfadmin moveコマンドでは、管理者が意図したサーバーに特定のパーティションを移動することが できます。移動されるパーティションでは一時的なサービスの停止が発生します。 31 過熱 Hotパーティション問題への対処 n 一つのパーティションに対する負荷が増大して来たときの対 応方法は? A) 負荷が掛かっているパーティションを比較的空いているノードに移動させる B) 負荷が掛かっているパーティションの存在しているノードからその他のパーティ ションを移動させる l l C) 移動は簡易だが、サービスの瞬断が発生 サービスの瞬断は発生するがA よりはインパクトが少ない LPARを使用していればそのノードにCPUを追加 l サービスの停止しない。可能であれば最も望ましい解決方法 P3 P1 P1 : Hot Partition P2 P2 P1 P3 パターン A P2 P1 P3 パターン B + パターン C 一つのパーティション に対する負荷が高まってきた場合にできる対処は3パターンあります。まずは、 直接的に負荷が掛かっているパーティションを軽い負荷のノードに移動させる方法があります。こ の方法は、一つのパーティションを移動するだけであり、手順は簡単ですが、負荷が掛かっている Keyにおいてのサービスの停止が発生します。2つ目は、負荷が掛かっているパーティション の存 在するノードの他のパーティション を移動させる方法。これは、最初の方法よりもサービスの停止の インパクトを小さくできる可能性があります。ただし、移動するパーティションではサービスの停止が 発生します。3番目の方法は、LPARを使用できるH/W上で動いている場合に適用できる方法です。 負荷が掛かっているノードに対してCPUを追加する方法です。これは、サービスの停止が発生しな いため、可能であれば最も望ましいといえます。 32 パフォーマンス監視機能 パーティションの状況を把握可能 n u 管理コンソール l u ランタイム・マップ 大きさ=トランザクション量 直感的に状況把握 wpfadmin コマンドラインからも 統計データ取得可能 以下のコマンドを発行 enableWPFPMI ... PMIを活動化 2. subscribeWPFPMI ... サブスクライブ設定 BAE l 1. 3. getTransactionCount ... 統計情報取得 IBM ORCL MSFT ランタイム・マップ WPFはパーティション を監視する方法を提供しています。管理コンソールからは、ランタイム・マップ 機能を使ってパーティションの状況を見ることができます。上の例では、4つのパーティションの状 況表示しています。それぞれの面積は、トランザクション量を表しています。また、wpfadmin を使用 してコマンドラインからパフォーマンス監視設定および統計情報の取得を行うこともできます。 33 WPF まとめ WPFは、OLTP処理のボトルネックの解消に有効 l パーティションにおいては、アプリケーションによって大胆な キャッシュ戦略をとることが可能 l パーティション内では非同期な処理を行うことが可能 l パーティションは、HAマネージャによって高速にフェールオー バーされる l パーティションを管理するコマンド/API有り l パーティションにはポリシーを設定できる l パーティションのパフォーマンス状況をPMIで監視可能 参考資料 Partitioning Facility User’s guide http://publib.boulder.ibm.com/infocenter/wxdinfo/v6r0/topic/com.ibm.websphere.xd.doc/info/ WPF51/cwpfpartition_pdf.html 34 参考資料 WebSphere Partitioning Facility WPF = WebSphere Partitioning Facility 35 パーティションの操作 ? wpfadmin n 基本操作 u u u u u u u u u u u n listActive listActiveWithGroups countActivePartitionsOnServers countActiveGroupsOnServers list listGroups move balance disablePartition enablePartition setPartitionCount パフォーマンス・モニタリング u u u u u enableWPFPMI subscribeWPFPMI setStatisticsRange setEJBName setPartitionCount n HA Manager Policy u u u u u u u n coreGroupStatus addServerToCoreGroup removeServerFromCoreGroup createPolicy updatePolicy deletePolicy resolvePolicyForGroup パフォーマンス/スケーラビリティ u u u u u u u u updateJMXTimeout updateCoreGroupCoordinators updateHamConfig getTransactionCount getResponseTime getFailedTransactionCount unsubscribeWPFPMI disableWPFPMI 管理者は、wpfadminスクリプトを通じてパーティション の操作をすることができます。基本操作、パ フォーマンス、ポリシー、モニタリング設定、パフォーマンス・データ取得等 のコマンドが準備されて います。 36 wpfadmin コマンドの例 listActive n wpfadmin l listActive アプリケーション・サーバーがホストしている活動パーティションを表示する D:¥WebSphere¥AppServerV6¥profiles¥Dmgr01¥bin>wpfadmin listActive WASX7209I: ノードnasbiCellManager01 のプロセス "dmgr" に、SOAP コネクターを使っ て接続しました。プロセスのタイプは DeploymentManager です。 WASX7303I: 次のオプションはスクリプト環境に渡され、argv 変数に格納される引数とし て使用可能になります: "[listActive]" CWPFC0050I: アプリケーション WPFLab、区画 ORCL: サーバー nasbiCell01¥nasbiNode02¥CLM1 CWPFC0050I: アプリケーション WPFLab、区画 MSFT: サーバー nasbiCell01¥nasbiNode02¥CLM1 CWPFC0050I: アプリケーション WPFLab、区画 IBM: サーバー nasbiCell01¥nasbiNode02¥CLM1 CWPFC0050I: アプリケーション WPFLab、区画 BAE: サーバー nasbiCell01¥nasbiNode02¥CLM1 アプリケーション名 パーティション名 セル名¥ノード名¥サーバー名 wpfadmin listActiveは、活動中のパーティション に関する情報を戻します。この例では4つのパー ティション の情報が戻されています。 37 参考:wpfadminコマンドの例 move 続き n wpfadmin move --p パーティション名 --d セル名¥ノード名 ¥サーバー名 u 指定したパーティションを指定したクラスター・メンバーに移動させる D:¥WebSphere ¥AppServerV6¥profiles¥Dmgr01¥bin>wpfadmin move --p IBM --d nasbiCell01/nasbiNode02/CLM2 WASX7209I: ノードnasbiCellManager01 のプロセス "dmgr" に、SOAP コネクターを使っ て接続しました。プロセスのタイプは DeploymentManager です。 WASX7303I: 次のオプションはスクリプト環境に渡され、argv 変数に格納される引数とし て使用可能になります: "[move, --p, IBM, --d, nasbiCell01/nasbiNode02/CLM2]" CWPFC0065I: Partition を IBM に設定します。 CWPFC0065I: Destination を nasbiCell01/nasbiNode02/CLM2 に設定します。 CWPFC0054I: サーバー nasbiCell01¥nasbiNode02¥CLM1 から サーバーnasbiCell01¥nasbiNode02¥CLM2 への区画 IBM の移動コマンドは正常に実行依頼されました。 実際にwpfadmin move コマンドを発行した例です。サーバー“CLM1”に存在するパーティショ ン”IBM”をサーバー”CLM2”に移動しています。 38 wpfadminコマンドの例 createPolicy nwpfadmin createPolicy xxx.properties uパーティションの挙動を制御する ポリシーを設定可能 l 活動化サーバー l バックアップサーバー l Fail Back l Quorumの有無 uClassに対して設定可能 例. l Class1 Ø Partition01 ? Partition10 Server1で起動 l Class2 Ø Partition11 ? Partition20 Server2で起動 CoreGroupName = DefaultCoreGroup PolicyType = OneOfNPolicy PolicyName = IBMStartupPolicy PolicyDescription = IBM Policy IsAlivePeriodSec = -1 QuorumEnabled = true NumOfMatchCriteria = 3 Name_0 = -gt Value_0 = -p Name_1 = -ps Value_1 = -c Name_2 = -pn Value_2 = IBM Failback = true PreferredOnly = true NumOfPolicyServers = 2 NodeName_0 = AA0739990Node02 ServerName_0 = CLM1 NodeName_1 = AA0739990Node02 ServerName_1 = CLM2 ポリシー設定ファイルの例 パーティションには、その挙動を制御できるポリシーを設定することができます。wpfadmin createPolicyコマンドにてその設定が行えます。ポリシーには、活動化するサーバー、バックアップ・ サーバー、Fail Backの有無、Quorumの有無等を設定可能です。また、パーティション をグループ 化した“Class”に対してまとめてポリシーを設定することも可能です。例えば、Class1 に属するパー ティションは、全てServer1で活動化するといった設定ができます。右のポリシーファイルの設定例 では、パーティション”IBM”をCLM1で活動化する設定が為されています 。 39 参考:プログラミングの流れ 1. PSSB 、PRSBの入ったEJB JARを含むJ2EEアーカイブ (EAR)を作成 l RADを使用可能 l wpf.jarをbuild path に含める必要あり l PSSBは、必須。PRSBは、オプション 2. ExportしたEARに対して以下のコマンドにてWPF用のstubを 追加 l wpfStubUtil コマンドを使用 例. d:¥WebSphere¥AppServerV6¥bin¥wpfStubUtil -ear WPFLab.ear jar WPFLabEJB.jar -class billy/test/PSSB.class -temp temp 3. 2.で生成されたEARをXDのクラスターにDeploy l インストール時にejbの再デプロイを行ってはいけない パーティション対応のアプリケーションの作成の手順になります。Rational Application Developerを 使用して開発が可能です。EJBプロジェクトのbuild pathには、wpf.jarを含める必要があります。 PSSBを作成することが必須になります。作成したEARは、Exportし、wpfStubUtilコマンドを使用して WPF用のstubを追加を行います。Stubが追加されたプログラムは、再デプロイを行わずに(重要)XD のクラスターにインストールします。 40 参考:リクエスト・ ルーティングの仕組み(1) IIOP n EJBリクエストの場合は、Partition Routerがルーティングを行う n ルーティング先の決定は、ユーザー・ロジックにて決定 u <EJBName>_PartitionKey.javaの戻り値がルーティング先パーティション l nullの場合は、通常のWLMルーターを使用 ユーザー・ロジック <EJBName>_PartitionKey.java Server1 fred EJBリクエスト Partition Context is NULL? fred Partition Router Server2 null WLM Router 従来のRouter EJBクライアントからのパーティションへのリクエストルーティングの仕組みになります。 <EJBName>_PartitionKey.javaの戻り値によってルーティング先が決定されます。戻された値を基に PartionRouterが対応するパーティションにリクエストを届けます。nullが戻された場合は、通常の WLMでのルーター が使用されます。 41 参考:リクエスト・ ルーティングの仕組み(2) HTTP n HTTPリクエストの場合は、ODRがルーティングを行う n ODRは、HTTPリクエストを解析しルーティング先を決定する Match Expression : “(user=)(*)$ ” Classify Expression : $2 URL=www.ibm.com/something/user=fred fred ODR Match Expression : “(user=)(*)(rodriguez)$” Classify Expression : $2 URL=www.ibm.com/something/user=adolforodriguez ODR adolfo HTTPでのルーティングの仕組みになります。ルーティングは、ODRによって行われます 。Match Expressionに基づいて宛先が決定されます。上のMatch Expressionでは、userパラメータの値全体、 下の例では、rodriquezが除かれた値がパターンマッチングによって導かれます 。 42 データベース分割への対応 n Proxy型JDBCドライバーを提供 u u n ProxyDataSouce JDBCドライバーは、複数のデータソースへのProxy 分割されたデータベースへの動的なルーティングが可能 ProxyDataSourceを使用したCMP EJBが分割したデータ ベースへのアクセスを実現 u Facade Session Beanにてデータソースを選択しトランザクション内でCMP EJBを使用 DS1 Entity Bean メソッド・コール 1. JNIDI名=DS1 2. createAccount(..) Proxy DS Session Bean DS2 中略 WPFは分割されたデータベースを選択できる仕組み”ProxyDataSource”を提供しています。実 JDBCドライバー化のデータソースに対するProxyとして動作します。ProxyDataSourceを使用する CMP EJBを呼び出すFacade Session Beanにて宛先のデータソースを決定します。 43 参考:問題判別 n サポートされているトレース仕様 u n WPFSTATUS u n パーティションの活動化とWLMの準備状況を表示 HAManager u n WPF,WPFSTATUS,WPFWLM,HAManager, proxyds パーティションの活動化とポリシーの問題発生時に使用 WPFWLM u partitionUnloadEvent, createPartitionDefintion()...のルーティングの問題発 生時時 l n 例. Wpfstubutilを使っているのにまだルーティングに問題あり proxyds u Proxy DataSourceに関連した問題発生時 WPF関連の機能での問題判別を行うために、幾つかのトレース仕様が提供されています 。問題が 疑われる部分に設定しトレース出力を調査します。 44 参考:問題判別(続き) n wpfadminを使用してtrace仕様の設定が可能 n WPFSTATUSを設定した例 D:¥WebSphere ¥AppServerV6¥profiles¥Dmgr01¥bin>wpfadmin setTraceSpec perm WPFSTATUS=all=enabled --c CL1 WASX7209I: ノードnasbiCellManager01 のプロセス "dmgr" に、SOAP コネクターを使っ て接続しました。プロセスのタイプは DeploymentManager です。 WASX7303I: 次のオプションはスクリプト環境に渡され、argv 変数に格納される引数とし て使用可能になります: "[setTraceSpec, perm, WPFSTATUS=all=enabled, --c, CL1]" CWPFC0065I: Cluster を CL1 に設定します。 CWPFC0059I: サーバー CLM1(cells/nasbiCell01/nodes/nasbiNode02/servers/CLM1|serve r.xml#Server_1126574255391) のトレースを WPFSTATUS=all=enabled に設定します。 CWPFC0059I: サーバー CLM2(cells/nasbiCell01/nodes/nasbiNode02/servers/CLM2|serve r.xml#Server_1126574257719) のトレースを WPFSTATUS=all=enabled に設定します。 この例は、wpfadmin setTraceSpec コマンドにてWPFSTATUSのトレース設定を行っています。クラ スターCL1に属する2つのクラスターメンバーにトレースが設定されているのがわかります。permパ ラメータは、この設定を永続化することを示しています。 45 ObjectGrid 46 ObjectGrid キャッシュを利用したデータ・ グリッド DB Message feed Backend ObjectGrid J2SE 1.4 App A J2EE 1.4 App B WAS App C Office Application ObjectGridは、Javaを利用する各種ミドルウェア/アプリケーション のJava Objectレベルでの統合を 実現します。各アプリケーション は、Grid上のデータをキャッシュを通じてアクセスすることになりま す。 47 ObjectGridとは? n Java Objectをキャッシュするためのフレームワーク u u u n データ整合性維持のためのトランザクション処理をサポート u u u n J2EE / J2SE環境をサポート J2EEコンテナとは独立 WebSphere Application Server / XD WPF環境との融合 操作のロールバックが可能 シングル・フェーズ・コミット WASトランザクション処理と協調可能 機能をカスタマイズが容易 u u カスタマイズしないとメモリ・キャッシュ機能のみ カスタムプラグインを作成可能 l n トランザクション、ロック、DBアクセス、無効化 複数マシンでの分散キャッシュを構築可能 ObjectGridは、Java Objectをキャッシュするために必要な各種の機能を提供するフレームワークで す。XD, WAS6.02といったJ2EE環境とJ2SE環境の両方をサポートしています。また、データの整合 性を維持するためのトランザクション 機能も備えています。このトランザクション機能は、シングル・ フェーズ・コミットになります。また、開発者がプラグインと呼ばれるモジュールをカスタマイズするこ とで機能を拡張することができます。カスタマイズは、プラグインを作成することで 行えます。トランザ クション、ロック、DBアクセス、無効化等の処理のプラグインを作成することが可能です。また、JMS を利用して複数サーバー環境で分散キャッシュ処理を行うことも可能です。 ObjectGridのサポート環境についてのInfocenterにおける記述(原文) Restriction: You can use ObjectGrid in a WebSphere Extended Deployment Version 6.0 environment. You can also use ObjectGrid in a Java 2 Platform, Standard Edition (J2SE) Version 1.4.2 or higher environment or in a WebSphere Application Server Version 6.02 or higher environment with additional licensing arrangements. Contact your sales representative for details. 48 ObjectGrid とは?(つづき) n キャッシュ・データをデータベースに保管することが可能 u u n データの関連付けが可能 u n データベース ファイル・システム、他のサーバーにも 無効化に使用可能 データ無効化(Eviction)の方法をカスタマイズ可能 u キャッシュ・データ無効化デーモンEvictor l 時間ベース ( ディフォルト) LRU l LFU l n 複数のロック・ストラテジを選択可能 u u n Optimistic Lock Pessimistic Lock JAAS利用によるセキュリティ機能 キャッシュは、メモリ中に保管されますが、Loaderプラグインを作成することで データベースと協調し た処理を行うことが可能になります。Loaderプラグインにより、キャッシュにデータがinsertされたとき に、データベースに保管を行い、キャッシュ中にデータが存在しないときにデータベースに検索に 行くといった動作を行うことが可能です。また、ObjectGridでは、キャッシュ・データ間に関連付けを 行うことができます。例えば、東京都 に対して渋谷区、新宿区、目黒区 を関連付けることが可能で す。これにより、東京都を削除するタイミングで関連付けられたものも削除すると行ったことが可能 になります。古いキャッシュデータを掃除するためには、Evictorプラグインを使用することができま す。デフォルトでは、時間ベースのものがBuilt-inされていますが、LRU, LFUのものをPlug-inする ことも可能です。また、データベース対するロック・ストラテジは、パフォーマンスを考慮して変更で きるようになっています。Optimistic Lockでは、ロック時間を最小にできます。Optimistic Lockを使 用するためには対応するOptimisticCallbackプラグインを作成する必要があります。セキュリティ機 能としては、JAASを利用することができます。 49 どうやって使うの? n ObjectGridの実体は、Jarファイル2つだけ u n 以下のJarにクラスパスを通すだけで使用可能 l J2SEスタンドアロン使用 Ø $WAS_HOME/optionalLibraries/ObjectGrid/objectgridSA.jar l WXD環境 Ø $WAS_HOME/lib/objectgrid.jar Java標準のMapクラスに似たインタフェース u Mapに存在する以下のメソッドが使用可能です l n put(), get(), insert(), update(), etc キャッシュするObjectはMapのエントリーとして保管 u Key / Valueのペアで保管 u データベースなどの外部のリソースから値をロードすることが可能 l l l 例 Key :“1”, Value :counter Loader プラグインを利用 起動時のPreload機能 ObjectGridの機能は、Jarファイルによって提供されます。スタンドアロンJVMでの使用の場合は、 objectgridSA.jarを使用します。NDに対してXDをインストールするとoptionalLibrariesディレクトリの 下の導入されます。XD環境の場合は、libディレクトリの下のobjectgrid.jarを利用します。 ObjectGridのインスタンスは、その中にJavaのMapオブジェクトに似たMapを複数個、保管できます。 このMapはBackingMapとして定義します。このBacingMapをObjectGridのセッション中にObjectMap として取り出して操作を行うことになります。このMapに関しては、put(),get(),insert(),update()といっ たJava Mapのメソッドを使用することができます。キャッシュしたいJava Objectはこれらのメソッドを 使用してkeyとのペアで保管します。アプリケーションの起動時 にLoaderプラグインを使用して キャッシュ・データをデータベース等からPreloadすることも可能です。 50 ObjectGrid 構成方法 n ObjectGridインスタンスはXMLによって構成することが可能 u u n BackingMapの定義 使用するプラグインと対応するJavaクラスを定義 作成したXMLファイルは、以下の様に起動時プログラムでロー ドする url = new URL("file:org/sawa/objgrid/objectgrid-definition.xml"); ObjectGrid ivObjectGrid = objectGridManager.createObjectGrid("clusterObjectGrid", url, true, true); n ObjectGridは、プログラム中でAPIを使用してもXMLと同様の 定義を行うことができる ObjectGridの構成は、XMLファイルによって行うことができます。XMLファイルの中でBackingMap の定義と設定、使用するプラグインの指定とクラス名を記述します。作成したXML ファイルは、プロ グラムの初期化処理の部分のObjectGridインスタンスの作成時にURLを指定することでロードされ ます。また、ObjectGridでは、プログラム中にAPI を使用してXML と同様な定義を行うことも可能で す。XMLによる指定とAPI による指定は同時に使用することができます。 51 カスタマイズの方法は? プラグイン n Loader Plug-in u u u n OptimisticCallback Plug-in u u n Optimistic ロック採用時に必要となるプラグイン データのシーケンス番号/バージョン管理を担当 TransactionCallback Plug-in u u u n データベース等の外部記憶とのやり取りを行うプラグイン Backing Mapに一つだけ関連付けられて定義される 起動時のデータのPreload機能 トランザクションに関するイベントを処理するプラグイン begin / commit / rollback での必要処理を実行 外部トランザクションとの連携 Evictor Plug-in u u u 条件に応じてBackingMap内のエントリーの無効化を行うプラグイン TTL(Time to Live)プラグインは、”Built-in”済 (ディフォルト 状態は disable) LRU (Least Recently Used) / LFU (Least Frequently Used)プラグイン 同梱 ObjectGridの機能を拡張するためには、プラグインを使用します。主なプラグインはこれらのものに なります。それぞれは、Interfaceは提供されていますが、実装は、開発者 が行うことになります。た だし、サンプル・コードが充実しているため、それらを参考にコーディングすることができます。 52 ObjectGridの動作フロー Servlet init() StartupBean Start() 初期化 フェーズ ObjectGridの生成 XML Plug-in Evictor BackingMapの生成 データのPreload セッションのbegin DB Loader TransactionCallBack アプリケーション ObjectMapの取得 Mapからオブジェクトをget Loader Mapへオブジェクトinsert OptimisticCallBack セッションのcommit Loader TransactionCallBack XD環境でObjectGridの動作フロー の例になります。 初期化を行うタイミングとしては、Webコンテナでは、Servlet のinit()、EJBコンテナでは、 StartupBeanのStart()が利用可能です。 ObjectGridのインスタンスの生成の過程においてBackingMapの生成、データのPreloadを行います。 データのPreloadはLoaderプラグインがデータベースから行います。アプリケーション・ロジックにお いては、最初にセッションをbegin()します。そのときにTransactionCallBackプラグインが呼ばれトラ ンザクションの開始に必要な処理を行います。その後にObjectMapを取得します。引き続き取得し たMapからObjectのget、insertを行います。getでは、メモリ中にデータが存在せずにLoaderプラグ イン経由でデータベースからデータの取得を行っています。Insertにおいては、OptimisticCallBack プラグインでのSerial Versionの管理が行われます 。commitでは、Loaderプラグインでのデータ ベースへの書き込みとTransactionCallBackプラグインでのcommitに必要な処理が行われています。 また、Evictorプラグインは定期的にキャッシュからの古いデータの清掃を行っています。 53 ObjectGrid トポロジー WPFとの組み合わせ n WPFを利用しCluster全体でのキャッシュ機能を提供 u WPF PartitionLoadEventでキャッシュの生成/Preload u 複数JVMに跨る効率の良いキャッシュ l l l パーティションの移動も可能 WPFによってContent Baseでルーティング キャッシュのレプリケーション不要 各パーティション 固有 のキャッシュ・データ P3 P4 P5 P2 WPFWLM WebSphere XD ノード P6 P7 P9 P8 P10 DS1 Object Grid P1 Object Grid WebSphere XD ノード DS2 WPFとObjectGrid を組み合わせることにより、Cluster全体でキャッシュを持たせることが 容易になり ます。WPFは、特定のKey のリクエストは特定のパーティションに届けるためにキャッシュ間でのレプ リケーションの不要にできます。PartitionLoadEventにてキャッシュの生成/Preloadを行うことにより、 パーティションの移動にも対応できるようになります。クラスター全体の資源を重複なく有効に利用 したキャッシュになります。 54 ObjectGrid トポロジー 分散キャッシュの構築例 JMS Listener Loaders ObjectGrid App Optimistic Lock Tx Listener JMS pub/sub bus Database JMS Listener Loaders ObjectGrid App Tx Listener ObjectGridにて複数マシンにわたるキャッシュを構築する場合の構成例です。データベースとは、 OptimisticLockを使用してデータの整合性 が図られています 。OptimisticLockでは、書き込みのタ イミングだけロックを取得します。もし、書き込み時に他のトランザクション がデータを変更しているこ とを検知した場合には、Exceptionを発生させます。これによりStale(最新でない)なデータの書き込 みを防いでいます 。サーバー間では、JMSのPub/Subを使用して通信を行っています。サーバー間 でのデータの無効化 の処理を同期を取りながら行っています。(WebSphere Application Serverだ けでの使用の場合は、IBM提供のプラグイン・モジュールを使用して外部JMSプロバイダー を使用 せずにサーバー間でイベントを伝播することが 可能になります。この機能はディフォルトでは活動 化されていません) 55 ObjectGrid まとめ ObjectGridは、WXDで提供される高パフォーマンスなJava Objectキャッシュ・テクノロジー l J2EE環境及びJ2SE環境をサポート l XMLファイル及びAPIで構成可能 l ユーザーJavaクラスでカスタマイズ可能 l データベースをデータ保管先に使用可能 l WPFと組み合わせてCluster Wideなキャッシュを作成可能 l 分散キャッシュを構築可能 参考資料:ObjectGrid programming model guide ftp://ftp.software.ibm.com/software/webserver/appserv/library/v60/objectgrid_guide.pdf 56 参考資料 Object Grid WPF = WebSphere Partitioning Facility 57 参考:ObjectGrid トポロジー n スケールアウト構成 Object共有 WAS/Non-WASサーブレット・コンテナにてObjectGridを使 用してObject共有 u u Servlet Filterを利用することにより、Session Objectの共有も可能 コンテナ機能を利用しないセッション共有 Servlet Filter ODR Servlet Filter Servlet Filter Object Grid 他のApplication Server Object Grid Tomcat, Geronimo Object Grid WebSphere WAS以外のノードも含めてJava Objectの共有を行っている例になります。Session Objectの共有を 行う場合にはServlet Filterを使用して処理を行うことが可能です。 58 参考:ObjectGrid構成 APIの例 n API ObjectGrid objectGrid = objectGridManager.createObjectGrid("someGrid"); BackingMap backingMap = objectGrid.getMap("someMap"); // override default of read/write backingMap.setReadOnly(true); // override default of allowing Null values backingMap.setNullValuesSupported(false); // override default (prime numbers work best) backingMap.setNumberOfBuckets(251); // override defualt (prime numbers work best) backingMap.setNumberOfLockBuckets(251); n 対応するXML <objectGrids> <objectGrid name="someGrid"> <backingMap name="someMap" readOnly="true" nullValuesSupported="false" numberOfBuckets="251" numberOfLockBuckets="251" /> </objectGrid> </objectGrids> XMLと同等の定義をAPI で行った例になります。 59 参考:ObjectGrid 定義ファイルの例 前半 <?xml version="1.0" encoding="UTF-8"?> <objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd" xmlns="http://ibm.com/ws/objectgrid/config" > ObjectGridの <objectGrids> <objectGrid name="clusterObjectGrid"> インスタンス定義 <bean id=" TransactionCallback" className ="org.sawa.objgrid.HeapTransactionCallback" /> BackingMap <backingMap name="counters" readOnly ="false" の定義 pluginCollectionRef="counters" preloadMode ="false" lockStrategy=“ OPTIMISTIC” copyMode="COPY_ON_READ_AND_COMMIT" /> </objectGrid> </objectGrids> : 実際のObjectGridの定義ファイルの例になります。”clusterObjectGrid”という ObjectGridインスタン スと“counters”というMapとその属性を定義しています。ロックストラテジは、“Optimistic”、 copyModeは、“COPY_ON_READ_AND_COMMIT”を指定しています。copyModeはBackingMapの Objectを処理するときにREADとCOMMITのタイミングでCOPYを行うことを示しています。 60 参考:ObjectGrid 定義ファイルの例 後半 BackingMap “counters”用の プラグイン : <backingMapPluginCollections > <backingMapPluginCollection id="counters"> Loader プラグイン <bean id=“Loader” className ="org.sawa.objgrid.HeapCacheLoader" /> <bean id="OptimisticCallback" OptimisticCallback プラグイン className="org.sawa.objgrid.CounterOptimisticCallback" /> </backingMapPluginCollection > </backingMapPluginCollections > </objectGridConfig > プラグインによりMap の機能を拡張 & カスタマイズ 前頁のXMLの続きになります。”counters”Mapにて使用するプラグインの定義になります。Loader プラグインとOptimisticCallBackプラグインを指定しています。Loaderプラグインは、データベースと のインターフェース、OptimisticCallBackプラグインでは、Optimisticロックを行うに必要なデータの Serial バージョンの管理を行っています。 61 62