WebSphere eXtreme Scale テクニカル・セッション 日本IBMシステムズ・エンジニアリング(ISE) 山口 崇 ()
by user
Comments
Transcript
WebSphere eXtreme Scale テクニカル・セッション 日本IBMシステムズ・エンジニアリング(ISE) 山口 崇 ()
® WebSphere eXtreme Scale テクニカル・セッション 日本IBMシステムズ・エンジニアリング(ISE) 山口 崇 ([email protected]) © 2009 IBM Corporation IBM Software Group | WebSphere software 目次 1. Key-Valueデータ・ストア 2. WXSの適用ユースケース 3. WXS事例紹介 4. WXS技術解説(アプリケーション編) 5. WXS技術解説(インフラ編) 2 IBM Software Group | WebSphere software §1. Key-Valueデータ・ストア 3 IBM Software Group | WebSphere software Key-Value型データ・ストア RDB Key-Value型データ・ストア Key VALUE 100000 AAA, 03-000, [email protected] 100010 BBB, 03-010, [email protected] 100020 CCC, 03-020, [email protected] 100030 100040 EMPNO NAME PHONE MAIL 100000 AAA 03-000.. [email protected] 100010 BBB 03-010.. [email protected] 100020 CCC 03-020.. [email protected] 100030 DDD 03-030.. [email protected] 100040 EEE 03-040.. [email protected] DDD, 03-030, [email protected] EEE, 03-040, [email protected] put, get, remove … SELECT, INSERT, UPDATE, DELETE key指定による高速なアクセス SQLによる複雑な条件指定でのアクセス スケール・アウトによる処理性能向上 スケール・アップによる処理性能向上 4 IBM Software Group | WebSphere software Key-Value型データ・ストアの例 ベンダー製品 IBM : WXS Oracle : Coherence GemStone : GemFire Web企業自社開発技術 Amazon : Dynamo オープン・ソース・プロジェクト Project Voldemort Kai mixi : Tokyo Cabinet / Tyrant 楽天 : ROMA 国産 5 IBM Software Group | WebSphere software クラウド・コンピューティング環境でのデータ配置の課題 データ アプリケーション スケールアウトで処理能力の拡張が可能 スケールアウトで処理能力の拡張が可能 なアプリケーション・レイヤーに対し、 なアプリケーション・レイヤーに対し、 データ・レイヤーがボトルネックとなりうる データ・レイヤーがボトルネックとなりうる RDB データ アプリケーション 6 IBM Software Group | WebSphere software Key-Value型データ・ストアの適用 データ アプリケーション Key-Value型データ・ストア データ・レイヤーもスケール・アウト データ・レイヤーもスケール・アウト できるため、拡張が容易 できるため、拡張が容易 データ アプリケーション 7 IBM Software Group | WebSphere software WXS ObjectGridとは Key-Value型データ・ストア/分散キャッシュ – JVMのメモリー上で稼動する、高速データ・ストア – データ・アクセス形態に応じた複数のAPIを提供 – データに対してトランザクショナブルなアクセスが可能 – DB連携プラグイン機構の提供 – キャッシュの無効化、イベント・ベース消しこみ機能を提供 可用性・拡張性 – データのコピーを別プロセス上に保管(レプリカ) – データを区分化し複数サーバーへ配置(パーティション) – データ配置の制御・通知を行うプロセスを提供(カタログ・サーバー) – MapReduce的な分散プロセシングAPIを提供(データ・グリッド機能) 8 IBM Software Group | WebSphere software §2. WXSの適用ユースケース 9 IBM Software Group | WebSphere software DB参照の高速化 システム背景・課題 – DB参照の高速化・DBに対する負荷軽減 ソリューション – DBのデータを前段に配置したWXS ObjectGridに全件ロード • WXSキャッシュから応答を返すことで高速応答 • ただしデータ更新はWXS→DBまで同期的に実行されるため低速 Application Application DB Application BEFORE WXS Server DB Application AFTER 10 IBM Software Group | WebSphere software DB更新の高速化 システム背景・課題 – DB更新処理の高速化 ソリューション – 前段WXS ObjectGridへの更新操作を非同期にDBに反映 • 更新時の応答性能向上、DBへの負荷軽減 • DB障害時にもサービス継続が可能 Application WXS Server Application DB Application BEFORE WXS Server DB Application AFTER 11 IBM Software Group | WebSphere software O/Rマッピング(JPA)の高速化 システム背景・課題 – Java Persistence API (JPA)でのデータ・アクセスのパフォーマンス向上 ソリューション – JPAのサイド・キャッシュとしてWXS ObjectGridを使用 • プログラミング不要でWXS機能を活用 • JavaEE標準のAPIを使用するためベンダー依存を回避 Application JPA Application JPA DB Application JPA BEFORE WXS Server DB Application JPA AFTER 12 IBM Software Group | WebSphere software データの使い分け システム背景・課題 – スケーラビリティのあるアーキテクチャーへの転換 • データのRDB集中による弊害を抑止 ソリューション – Key-Valueデータストアへのデータの切り出し • スケールする必要のあるアプリケーション • 厳密なトランザクション処理を必要としないアプリケーション • エンティティ数が少なく、トランザクション数が多いアプリケーション – RDBの否定ではなく、データの適材適所な配置 Application A Application A WXS Server DB Application B BEFORE Application B DB AFTER 13 IBM Software Group | WebSphere software セッション・オブジェクトの可用性向上 システム背景・課題 – 障害時のセッション・オブジェクト損失が許されない • セッション・オブジェクトのメモリー間複製はベスト・エフォート ソリューション – セッション・オブジェクトの保管先としてWXS ObjectGridを使用 • 管理コンソールからの設定のみで利用可能(Servletフィルターを使用)、アプリ ケーションの修正不要 – 注:保障型レプリケーションのため、処理負荷は高い(=相対的に遅い) Application Session Application Session WXS Application Session Application Session WXS BEFORE Session Sharing (DRS) AFTER Session Sharing (ObjectGrid) 14 IBM Software Group | WebSphere software 超大量トランザクション処理 システム背景・課題 – 大量の計算処理の効率化 • 大量のデータに対し同一処理を繰り返すような処理 ソリューション – データを保持するWXS ObjectGridプロセス上で処理を並列実行 • MapReduce的処理形態 – トランザクション量が増えた場合にあっても、拡張性を確保可能 Application Application DB Application BEFORE Application AFTER WXS Server WXS Server WXS Server WXS Server WXS Server WXS Server DB 15 IBM Software Group | WebSphere software §2. WXS事例紹介 16 IBM Software Group | WebSphere software 事例1:オークション・サイト お客様要件・課題 1. スケーラビリティを重視したインターネット・オークション・サイト 性能要件 項目 数値 ピーク時の目標応答時間 1,000 ミリ秒 目標平均応答時間 500 ミリ秒 同時入札件数 100 件 / 秒 近い将来、5~10倍 の規模になる可能性 キャパシティ要件 項目 数値 同時出展数 20,000 件 加盟店数 30,000 件 2. サービス無停止でのアプリケーション更新 17 IBM Software Group | WebSphere software 事例1:ソリューション 使用コンポーネント スケーラビリティを重視したインターネット・オークション・サイト スケーラブルな分散キャッシュ – WebSphere eXtreme Scale (WXS) • ObjectGrid, DataGrid Agent – Agent Framework (SW Asset) サービス無停止でのアプリケーション更新 ロールアウト – WebSphere Virtual Enterprise (WVE) • アプリケーション・バージョニング(ロールアウト) 18 IBM Software Group | WebSphere software 事例1:パフォーマンスとスケーラビリティの向上 パフォーマンス WXS Server側でロジックの実行 – オークションデータのアプリケーションサーバでのキャッシュ – オークションのロジックからローカルキャッシュへのアクセス スケーラビリティ 出展IDをキーとしたパーティショニング ReduceGridAgent API 入札 Front web WXS OG Client AS NA callAgent CS WXS OG Server AS OG AS OG 出展IDをキーとした ルーティング WXS OG Server NA AS OG AS OG NA 19 IBM Software Group | WebSphere software 事例1:結果 270入札/秒を達成 – キャッシュOFF時に比べて4倍以上の性能 性能要件 項目 数値 ピーク時の目標応答時間 1,000 ミリ秒 目標平均応答時間 500 ミリ秒 同時入札件数 100 件 / 秒 結果 項目 数値 ピーク時の応答時間実測値 180 ミリ秒 平均応答時間実測値 20 ミリ秒 同時入札件数 270 件 / 秒 キャッシュOFFの場合 61 件 / 秒 ロールアウト機能により、サービス無停止でのアプリケーションの更新が実現 20 IBM Software Group | WebSphere software 事例2:通信業 プロジェクト概要 お客様の業種: 通信業 プロジェクトの目的 NGN(次世代ネットワーク)の本格的サービス化に向けてNGN上で稼動する通 信制御用サーバー(SIP* AS)の可用性とパフォーマンスを検証すること 検証項目 z 通信制御プログラム(SIPサーブレット)の機能テスト z HA環境下でのパフォーマンス・テスト z ネットワーク障害テスト z 上記検証項目の他社SIP ASとの比較 * SIP: Session Initiation Protocol 21 IBM Software Group | WebSphere software 事例2:NGNにおけるシステム要件:キャリア・グレード NGN 既存電話網(回線交換ネットワーク) SIPサーバー 中継交換機 SIP 交換機 SIP ・・・ ・・・ SIPサーバー SIP SIPサーバー 交換機 SIP SIP ・・・ ・・・ z キャリア・グレード: 通信事業者が提供するシステムのサービス・レベル z 既存電話網はプロプライエタリな交換機によって高信頼性/高性能/耐障害性が確保されている z NGNにおけるシステムでもキャリア・グレードの維持が要件 ⇒ SIPサーバーに対し、交換機並みの高信頼性/高性能/耐障害性が要求される 22 IBM Software Group | WebSphere software 事例2:ObjectGridセッション・パーシスタンス機能 ObjectGrid = 分散オンメモリー・データストア z メモリー上のデータに高速アクセス(put/get) z レプリカへの自動複製処理 z 障害時、レプリカをプライマリーに自動昇格 セッション・パーシスタンス機能を標準で装備 (HTTPセッション/SIPセッション) OGによるセッション・パーシスタンスへの対応にソースコード変更の必要なし z HTTPセッション・パーシスタンス ⇒ サーブレット・フィルターが処理 z SIPセッション・パーシスタンス ⇒ SIPコンテナーが処理 レプリカへの自動複製 高速なデータアクセス OG primary-1 セッションID SIP Servlet HTTP Servlet セッション 情報 OG replica-2 OG replica-1 OG primary-2 ソースコード変更の必要なし 23 IBM Software Group | WebSphere software 事例2:セッション複製プロトコルの違い ND: メモリー間複製(DRS) 複製元 複製先 XD: WXS ObjectGridによるセッション複製 複製元 複製先 セッション複製 セッション複製 OG OG 確認応答 「ベスト・エフォート型」 「保証型」 z “ベスト・エフォート型ではキャリア・グレードとは呼べない” (お客様) z 複製グループ・メンバー間の変更通知に対してコールバックが規定されている (SAForum AIS*) 保証型であるWXS ObjectGridによるセッション複製を採用 * Service Availability Forum, “Application Interface Specification Release 5”: 通信業界システムの可用性要件を定義した標準 http://www.saforum.org/specification/AIS_Information/ 24 IBM Software Group | WebSphere software 事例2:パフォーマンス・テスト結果 構成2(B/Eサーバーあり) 構成1(B/Eサーバーなし) 270% Better 36% Better 400 300 CPS per Node CPS per Node 200 100 0 WebSphere XD 他社SIP AS 100 90 80 70 60 50 40 30 20 10 0 WebSphere XD 他社SIP AS z バックエンド・サーバーのない構成1では他社より 36% 高いパフォーマンスを達成 z バックエンド・サーバーのある構成2では他社より 270% 高いパフォーマンスを達成 z バックエンド・サーバーとの送受信がある場合、セッション複製の回数は1コールに対し2倍にな ることからセッション複製のパフォーマンスが大きく影響したものと考えられる 25 IBM Software Group | WebSphere software §3. WXS適用シナリオ(アプリケーション編) データ・アクセス手法、キャッシュの整合性維持 26 IBM Software Group | WebSphere software ここでは個別の機能をばらばらと解説するのではなく、 一つのDBアクセス・アプリケーションを想定し、 それをWXS (ObjectGrid) 化すると、どんな機能の選択肢があり、 何を検討する必要があるか、という流れで解説します。 27 IBM Software Group | WebSphere software データ・アクセス・アプリケーションのWXS化 – 仮想アプリケーション:市民マラソンのランナー情報サイト • • • • J2EEアプリケーション・サーバーで稼動するJDBCアプリ 一時的(7時間)に大量集中するトランザクションを捌く必要がある 3万人のランナーの5km毎のラップタイムの情報の挿入が行われる 10万人超の観戦者が携帯等でランナーID、名前を元に経過情報を頻繁に参照 テーブルはランナーの登録情 報の親表と、5kmおきのラップ タイムを記録する子表 どのランナーが何キロ地点を 何時に通過したかを参照 RUNNER表 RID NAME CLASS STATUS 100001 太田 智之 FULL RUNNING 100002 亀田 実希 FULL RETIRED 200001 岩品 友徳 10KM RUNNING LAPTIME表 LID RID LOCATION TIME 100011 100001 00 KM 09:00:00 100012 100002 05 KM 09:50:23 28 IBM Software Group | WebSphere software データ・アクセス・アプリケーションのWXS化 – システム構成 • 参照は4台のクラスター上のアプリケーションでデータベースにアクセス • ラップタイムはランナーの靴に装着したチップが5kmごとのチェックポイントを通 過するタイミングでDBに直接更新 ピーク時には数千req/secのリ クエストが集中 PC Cluster AS Application JDBC 3万人のランナーの靴に 装着したチップから5km おきのラップタイムがDB にINSERTされる AS Application JDBC LB DB AS Application JDBC 携帯 AS Application JDBC 4台クラスターのASでデータ ベースを参照するJDBCアプリ ケーションを稼動 29 IBM Software Group | WebSphere software ステップ1:データをWXSへ配置 – ObjectGrid (WXS)サーバーをDBに換えるために必要な作業 • ObjectGridの定義:DBテーブルに相当する「オブジェクト」の定義方法 • コードの変更:データ・アクセスロジックをJDBCからObjectGrid APIに変更 アプリケーションのAPIはJDBCから ObjectGridのAPIに変更が必要 Cluster PC AS Application OG AS Application OG データベースのデータをJava のオブジェクトとしてサーバー に保管し、アプリケーションか らの参照・更新を可能とする AS OG Server LB AS Application OG 携帯 AS Application DB OG データベース、テーブルの DDLに相当するような定義 は、objectGrid.xmlという XMLファイルの配置で行う 30 IBM Software Group | WebSphere software ステップ1:データをWXSへ配置 ObjectGridの定義 – objectGrid.xmlを対象サーバーに配置 • Java SE JVMの場合:JVM引数の引数としてXMLを指定 • Java EE JVMの場合:META-INFにobjectGrid.xmlをパックしたearをデプロイ objectGrid.xmlサンプル WXSsolidObjectGridという名 WXSsolidObjectGridという名 前でObjectGridを定義 前でObjectGridを定義 <?xml <?xml version="1.0" version="1.0" encoding="UTF-8"?> encoding="UTF-8"?> <objectGridConfig <objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/objectgrid/config xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd" ../objectGrid.xsd" xmlns="http://ibm.com/ws/objectgrid/config"> xmlns="http://ibm.com/ws/objectgrid/config"> <objectGrids> <objectGrids> WXSsolidObjectGrid <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" /> /> RunnerMap <backingMap name="LaptimeMap" /> <backingMap name="LaptimeMap" /> </objectGrid> </objectGrid> LaptimeMap </objectGrids> </objectGrids> </objectGridConfig> </objectGridConfig> RunnerMapとLaptimeMapと RunnerMapとLaptimeMapと いうBackingMapを定義 いうBackingMapを定義 ざっくり言えばObjectGridがデータベース に相当し、BackingMapがテーブルに相当 31 IBM Software Group | WebSphere software ステップ1:データをWXSへ配置 コードの変更 – JDBCのオリジナルコード JDBCアクセス String String sql1 sql1 == "select "select rid,name,class,status rid,name,class,status from from wxssolid.runner wxssolid.runner where where rid rid == ?"; ?"; try try {{ conn conn == ds.getConnection(); ds.getConnection(); PreparedStatement PreparedStatement pstmt1 pstmt1 == conn.prepareStatement(sql1); conn.prepareStatement(sql1); pstmt1.setString(1, pstmt1.setString(1, id); id); ResultSet rs1 = pstmt1.executeQuery(); ResultSet rs1 = pstmt1.executeQuery(); SQLを定義し、データソースの接続を getConnection()で取得 PreparedStatement::executeQueryでSQL実行、 ResultSetから結果を取得 という一般的なJDBCアプリの流れ while while (rs1.next()){ (rs1.next()){ name name == rs1.getString(2); rs1.getString(2); class_ class_ == rs1.getString(3); rs1.getString(3); status status == rs1.getString(4); rs1.getString(4); }} … … }} 32 IBM Software Group | WebSphere software ステップ1:データをWXSへ配置 コードの変更 WXSsolidObjectGrid – ObjectMap APIでのデータ・アクセス Session::getMapで Session::getMapで ObjectMapを取得 ObjectMapを取得 ObjectMapアクセス try try {{ Session Session sess sess == ogom.getSession(); ogom.getSession(); ObjectMap ObjectMap runnerMap runnerMap == sess.getMap("RunnerMap"); sess.getMap("RunnerMap"); sess.begin(); sess.begin(); Runner Runner runner runner == (Runner)runnerMap.get(id); (Runner)runnerMap.get(id); setName(runner.getName()); setName(runner.getName()); setClass_(runner.getClass_()); setClass_(runner.getClass_()); setStatus(runner.getStatus()); setStatus(runner.getStatus()); … … }} キーを指定し、Valueクラスを取得 キーを指定し、Valueクラスを取得 Valueクラスから値を取得 Valueクラスから値を取得 ObjectMapはあくまでMapなので、KeyとValueを保持するのみ テーブルの複数カラム情報を保持・参照する場合、Valueに複数 プロパティを持ったクラス(Valueクラス)を格納する RunnerMap Key VALUE 100001 太田, FULL, REGISTERED 100002 亀田, FULL, REGISTERED : : Valueクラス、RunnerC public class RunnerC implements Serializable { private String rid; private String name; private String class_l; private String status; … } 33 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス – キー以外の条件でのクエリーを実行するために、以下のオプションがある • Object Query:ObjectMapのValueクラスに対するクエリーの実装 • EntityManager:O/Rマップ形式のEntityManagerによるオブジェクト定義 • JPA L2キャッシュ:Java EE標準のJPAにObjectGridをL2キャッシュとして適用 WXSsolidObjectGrid RunnerMap Key VALUE 100001 太田, FULL, REGISTERED 100002 亀田, FULL, REGISTERED : : 名前で検索したい 名前で検索したい 34 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス Object Query – Valueクラスに対し、クエリーを実行するインターフェースを提供 • objectGrid.xmlにクエリーで使うMap名とクラス構造(クエリー・スキーマ)を指定 • プログラムからはObjectQueryクラスのメソッドでクエリー実行 WXSsolidObjectGrid JPQLと同等のクエリー、fromに指定する オブジェクトがObjectMapとなる RunnerMap select r from RunnerMap r where r.name = ?1 Key VALUE 100001 太田, FULL, REGISTERED 100002 亀田, FULL, REGISTERED : : Valueクラス内部のプロパティをwhere条件に指定するため、 Valueクラスがどのような構造を持っているか、という情報を 「クエリー・スキーマ」として定義しておく必要がある 検索条件に指定するプロパティに対しては、 索引を作成しておくことが推奨される 35 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス (参考)Object Query定義とクライアント・コード Valueクラス、RunnerC objectGrid.xml public class RunnerC implements Serializable { private String rid; private String name; private String class_l; private String status; … } <objectGrids> <objectGrids> <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" /> /> <querySchema> <querySchema> <mapSchemas> <mapSchemas> クライアント・コード <mapSchema <mapSchema mapName="RunnerMap" mapName="RunnerMap" valueClass="yam.classes.RunnerC" valueClass="yam.classes.RunnerC" ObjectQuery ObjectQuery query query == sess.createObjectQuery( sess.createObjectQuery( primaryKeyField="rid" primaryKeyField="rid" accessType="FIELD"/> accessType="FIELD"/> "SELECT "SELECT rr from from RunnerMap RunnerMap rwhere rwhere r.name r.name == ?1“ ?1“ ); ); </mapSchemas> </mapSchemas> query.setParameter(1, query.setParameter(1, name); name); </querySchema> </querySchema> … … sess.begin(); sess.begin(); クエリー・スキーマとしてRunnerMapを クエリー・スキーマとしてRunnerMapを Iterator Iterator itr itr == query.getResultIterator(); query.getResultIterator(); マップ・スキーマに、Valueクラスとして マップ・スキーマに、Valueクラスとして while(itr.hasNext()){ while(itr.hasNext()){ RunnerCと主キーのフィールドを定義 RunnerCと主キーのフィールドを定義 runnerC runnerC == (RunnerC)result.next(); (RunnerC)result.next(); … … ObjectQueryを準備し、変数にパラメーターを指定、 ObjectQueryを準備し、変数にパラメーターを指定、 }} ObjectQuery::getResultIterator()で結果を取得 ObjectQuery::getResultIterator()で結果を取得 36 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス EntityManager API – JPAライクな特殊なマップをObjectMapとは別に定義 • 表構造はJPA類似のアノテーションを使用したEntityクラスを準備 • objectGrid.xmlに加え、entity.xmlという構成ファイルが追加で必要 • クライアントコードはEntityManagerという別インターフェースでアクセス JPQLと同等のクエリー、fromに指定する オブジェクトがEntityManagerのEntityとなる WXSsolidObjectGrid RunnerMap Key 100001 : select r from RunnerEntity r where r.name = ?1 VALUE WXSsolidObjectGridEM 太田, FULL, REGISTERED RunnerEntity rid : name class_ status 100001 太田 FULL REGIS TERED 100002 亀田 FULL REGIS TERED ObjectMapと別に、RunnerEntityという BackingMapを定義 構造が複雑になる分、ObjectMapよりパ フォーマンスが劣化 37 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス (参考)EntityManager API定義とクライアント・コード クライアント・コード RunnerEntity @Entity @Entity public public class class RunnerEntity RunnerEntity implements implements Serializable Serializable {{ @Id @Id public public String String id; id; public public String String name; name; public String class_; public String class_; public public String String status; status; @OneToMany(targetEntity=LaptimeEntity.class) @OneToMany(targetEntity=LaptimeEntity.class) public public Set<LaptimeEntity> Set<LaptimeEntity> laptimeEntities; laptimeEntities; … … Entity定義もアノテーションを使用 したJPA的な定義クラスを作成 objectGrid.xml <objectGrid <objectGrid name="WXSsolidObjectGridEM" name="WXSsolidObjectGridEM" entityMetadataXMLFile="entity.xml"> entityMetadataXMLFile="entity.xml"> <backingMap <backingMap name="RunnerEntity" name="RunnerEntity" /> /> <backingMap name="LaptimeEntity" <backingMap name="LaptimeEntity" /> /> </objectGrid> </objectGrid> … … O/Rマッピング・コード的なAPIを使用 String String query query == "select "select rr from from RunnerEntity RunnerEntity rr where where r.name r.name == ?1"; ?1"; try try {{ Session Session sess sess == ogem.getSession(); ogem.getSession(); EntityManager em EntityManager em == sess.getEntityManager(); sess.getEntityManager(); EntityTransaction EntityTransaction et et == em.getTransaction(); em.getTransaction(); et.begin(); et.begin(); Query Query query query == em.createQuery(query); em.createQuery(query); query.setParameter(1, query.setParameter(1, name); name); Iterator<RunnerEntity> Iterator<RunnerEntity> runnerEntities runnerEntities == query.getResultIterator(); query.getResultIterator(); while while (runnerEntities.hasNext()){ (runnerEntities.hasNext()){ RunnerEntity RunnerEntity runnerEntity runnerEntity == (RunnerEntity)runnerEntities.next(); (RunnerEntity)runnerEntities.next(); … … entity.xml <?xml <?xml version="1.0" version="1.0" encoding="UTF-8"?> encoding="UTF-8"?> <entity-mappings xmlns="http://ibm.com/ws/projector/config/emd" <entity-mappings xmlns="http://ibm.com/ws/projector/config/emd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/projector/config/emd xsi:schemaLocation="http://ibm.com/ws/projector/config/emd ./emd.xsd"> ./emd.xsd"> <entity class-name="yam.entities.RunnerEntity“ <entity class-name="yam.entities.RunnerEntity“ name="RunnerEntity"/> name="RunnerEntity"/> <entity <entity class-name="yam.entities.LaptimeEntity“ class-name="yam.entities.LaptimeEntity“ name="LaptimeEntity"/> name="LaptimeEntity"/> </entity-mappings> </entity-mappings> 38 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス JPA L2キャッシュ – Java Persistence API (JPA)の2次キャッシュとしてObjectGridを構成 • IBM独自APIを使用せずにpersitence.xml定義でObjectGridを利用可能 • O/Rマッピングのデータ・アクセスをプログラミング・レスで高速化 クライアントコードは JPAでデータ・アクセス PC Cluster AS Application クエリーはJPQL JPA select r from RunnerJPA r where r.name = ?1 AS Application JPA LB DB AS Application JPA AS Application JPA 一度参照されたデータは自動的にObjectGrid にキャッシュされ、後続の参照時に使用される 携帯 AS OG Server 39 IBM Software Group | WebSphere software ステップ2:キー経由以外のアクセス (参考) JPA L2キャッシュ定義とクライアント・コード persistence.xml <persistence-unit <persistence-unit name="WXSsolidWSWeb"> name="WXSsolidWSWeb"> <jta-data-source>jdbc/TESTDB</jta-data-source> <jta-data-source>jdbc/TESTDB</jta-data-source> <class>yam.entities.RunnerJPA</class> <class>yam.entities.RunnerJPA</class> <properties> <properties> <property <property name="openjpa.DataCache" name="openjpa.DataCache" value="com.ibm.websphere.objectgrid.openjpa.ObjectGridDataCache value="com.ibm.websphere.objectgrid.openjpa.ObjectGridDataCache (ObjectGridName=WXSsolidObjectGridJPA, (ObjectGridName=WXSsolidObjectGridJPA, ObjectGridType=EMBEDDED_PARTITION, ObjectGridType=EMBEDDED_PARTITION, NumberOfPartitions=1, NumberOfPartitions=1, ReplicaMode=NONE)"/> ReplicaMode=NONE)"/> <property <property name="openjpa.QueryCache" name="openjpa.QueryCache" value="com.ibm.websphere.objectgrid.openjpa.ObjectGridQueryCache()"/> value="com.ibm.websphere.objectgrid.openjpa.ObjectGridQueryCache()"/> <property <property name="openjpa.RemoteCommitProvider" name="openjpa.RemoteCommitProvider" value="sjvm"/> value="sjvm"/> </properties> </properties> </persistence-unit> </persistence-unit> 編集するべきはJPA定義ファイルの persistence.xmlのみ objectGrid.xmlは定義する必要なし L2キャッシュ定義のために必要 なクラスは製品が提供 クライアント・コード Query Query query query == em.createQuery("select em.createQuery("select rr from from Runner Runner where where r.name r.name == ?1"); ?1"); query.setParameter(1, id); query.setParameter(1, id); List<Runner> List<Runner> runners runners == query.getResultList(); query.getResultList(); 通常のJPAデータ・ アクセス・コード int int count count == 1; 1; while while (count (count << runners.size()){ runners.size()){ RunnerJPA runnerJpa RunnerJPA runnerJpa == runners.get(count); runners.get(count); … … 40 IBM Software Group | WebSphere software ステップ3:データベースとの連携 – データベースと連携させるための作業 • Loader/TxCallback:データ連携のためのLoaderプラグインを実装 • JPA Loader:プログラミング・レスでのデータ連携 • 非同期Loader:更新トランザクションの高速化 Cluster PC 参照時にデータベースからデータを取得しキャッシュ 更新時にObjectGridを更新した内容をデータベースに反映 AS Application OG AS Application OG AS OG Server LB AS Application DB OG 起動時にデータベースのデータを 全件読み込むという設定も可能 携帯 AS Application OG 41 IBM Software Group | WebSphere software ステップ3:データベースとの連携 Loader/TransactionCallbackプラグイン → ユーザーが作成する必要あり – Loader:ObjectGridに対する操作をSQLに変換し、テーブルのデータ取 得・更新を行う – TransactionCallback:Loaderと組み合わせ、トランザクション制御を行う OG Server WXSsolidObjectGrid get RunnerMap Key update DB 100001 getをSELECTに、update やsetをUPDATEに変換 VALUE 太田, FULL, REGISTERED Loader RID NAME CLASS STATUS 100001 太田 智之 FULL RUNNING 100002 亀田 実希 FULL RETIRED 200001 岩品 友徳 10KM RUNNING select … from RUNNER where … TransactionCallback OGトランザクションを、データベース・トランザクション やJTAトランザクションとしてバックエンドに反映 update RUNNER set status = … where … 個々のObjectMapや EntityManagerごとに Loaderを作成する必要 42 IBM Software Group | WebSphere software ステップ3:データベースとの連携 (参考)Loader/TrsansactionCallback定義とコード例 objectGrid.xml <objectGrids> <objectGrids> TransactionCallback定義 TransactionCallback定義 <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" pluginCollectionRef=“RunnerMapPlugins" pluginCollectionRef=“RunnerMapPlugins" /> /> <bean <bean id="TransactionCallback“ id="TransactionCallback“ className="yam.loaders.WXSsolidTransactionCallback" className="yam.loaders.WXSsolidTransactionCallback" /> /> </objectGrid> </objectGrid> </objectGrids> </objectGrids> <backingMapPluginCollections> <backingMapPluginCollections> <backingMapPluginCollection <backingMapPluginCollection id=“RunnerMapPlugins"> id=“RunnerMapPlugins"> <bean <bean id="Loader" id="Loader" className=“yam.loaders.RunnerMapLoader"> className=“yam.loaders.RunnerMapLoader"> <property <property name="dataBaseName" name="dataBaseName" type="java.lang.String" type="java.lang.String" value="testdb" value="testdb" /> /> <property <property name="isolationLevel" name="isolationLevel" type="java.lang.String" type="java.lang.String" value="read value="read committed" committed" /> /> </bean> </bean> </backingMapPluginCollection> </backingMapPluginCollection> Loader定義 Loader定義 </backingMapPluginCollections> </backingMapPluginCollections> RunnerMapLoader get時に呼ばれるSELECT 部分の抽出コード public public List List get(TxID get(TxID txid, txid, List List keyList, keyList, boolean boolean forUpdate) forUpdate) throws throws LoaderException{ LoaderException{ Connection Connection conn conn == (Connection)txid.getSlot(tcs.getConnectionSlot()); (Connection)txid.getSlot(tcs.getConnectionSlot()); try{ try{ int int size size == keyList.size(); keyList.size(); ArrayList ArrayList valueList valueList == new new ArrayList(size); ArrayList(size); for(int i = 0; i< size; ++i){ for(int i = 0; i< size; ++i){ Object Object key key == keyList.get(i); keyList.get(i); String String sql1 sql1 == "select "select rid,name,class,status rid,name,class,status from runner where rid from runner where rid == ?"; ?"; PreparedStatement PreparedStatement pstmt1 pstmt1 == conn.prepareStatement(sql1); conn.prepareStatement(sql1); pstmt1.setString(1, pstmt1.setString(1, (String)key); (String)key); ResultSet ResultSet rs1 rs1 == pstmt1.executeQuery(); pstmt1.executeQuery(); while while (rs1.next()){ (rs1.next()){ name name == rs1.getString(2); rs1.getString(2); class_ class_ == rs1.getString(3); rs1.getString(3); status status == rs1.getString(4); rs1.getString(4); }} 43 IBM Software Group | WebSphere software ステップ3:データベースとの連携 JPA Loader → JPAを介してデータ・アクセス – JAP Entityの定義があれば、プログラミング・レスでLoader定義が可能 • すぐに使用可能なObjectMap用とEntityManager用のLoaderおよび TransactionCallbackプラグインを製品が提供 OG Server WXSsolidObjectGrid get RunnerMap Key update いずれも 製品提供 DB 100001 VALUE 太田, FULL, REGISTERED JPALoader / JPAEntityLoader RID NAME CLASS STATUS 100001 太田 智之 FULL RUNNING 100002 亀田 実希 FULL RETIRED 200001 岩品 友徳 10KM RUNNING get select RunnerJPA JPATxCallback persist 対象テーブル用のJPAを 作成・ポイントするだけで、 Loaderのコーディングが 不要 update 44 IBM Software Group | WebSphere software ステップ3:データベースとの連携 (参考)JPALoader定義 objectGrid.xml ビルトインのLoader、TransactionCallbackとともに、 BackingMap用のJPAクラスを指定 <objectGrids> <objectGrids> TransactionCallback定義 TransactionCallback定義 <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" pluginCollectionRef=“RunnerMapPlugins" pluginCollectionRef=“RunnerMapPlugins" /> /> <bean <bean id="TransactionCallback" id="TransactionCallback" className="com.ibm.websphere.objectgrid.jpa.JPATxCallback"> className="com.ibm.websphere.objectgrid.jpa.JPATxCallback"> <property <property name="persistenceUnitName" name="persistenceUnitName" type="java.lang.String" type="java.lang.String" value="WXSsolidWSWeb" value="WXSsolidWSWeb" /> /> </bean> </bean> </objectGrid> </objectGrid> </objectGrids> </objectGrids> Loader定義 Loader定義 <backingMapPluginCollections> <backingMapPluginCollections> <backingMapPluginCollection <backingMapPluginCollection id=“RunnerMapPlugins"> id=“RunnerMapPlugins"> <bean <bean id="Loader" id="Loader" className="com.ibm.websphere.objectgrid.jpa.JPALoader"> className="com.ibm.websphere.objectgrid.jpa.JPALoader"> <property <property name="entityClassName" name="entityClassName" type="java.lang.String" type="java.lang.String" value="yam.entities.RunnerJPA"/> value="yam.entities.RunnerJPA"/> </bean> </bean> </backingMapPluginCollection> </backingMapPluginCollection> </backingMapPluginCollections> </backingMapPluginCollections> 45 IBM Software Group | WebSphere software ステップ3:データベースとの連携 非同期Loader – 更新処理の高速化 • 同期Loaderはキャッシュの参照は早くなるが、更新のレスポンスが遅い • Loaderを非同期にすることで、更新処理のレスポンスも改善できる • DB停止時にも前段ObjectGridのみで処理が可能という可用性向上の側面も 同期Loader AS Application OG DB レスポンスはデータベースまでの処理時間 非同期Loader AS Application AS OG Server OG AS OG Server DB 仮にデータベース が停止していても、 サービスの継続 が可能 レスポンスはOGサーバーまでの処理時間 46 IBM Software Group | WebSphere software ステップ3:データベースとの連携 (参考)非同期Loader定義 – objectGrid.xmlの現行ローダー定義に非同期定義を加えるのみ objectGrid.xml queue map DB ログ・ エレメント数 <objectGrids> <objectGrids> <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" writeBehind="T300;C900" writeBehind="T300;C900" pluginCollectionRef="RunnerMapPlugins" pluginCollectionRef="RunnerMapPlugins" /> /> <bean <bean id="TransactionCallback" id="TransactionCallback" className="yam.loaders.WXSsolidTransactionCallback" className="yam.loaders.WXSsolidTransactionCallback" /> /> </objectGrid> </objectGrid> </objectGrids> </objectGrids> Loader 経過時間 Tには最終反映時刻からの経過時間を秒数で指定(デフォルト300) Tには最終反映時刻からの経過時間を秒数で指定(デフォルト300) Cにはキューマップに保管するログ・エレメント数を指定(デフォルト1000) Cにはキューマップに保管するログ・エレメント数を指定(デフォルト1000) (どちらかを省略した場合はデフォルト値が暗黙的に適用) (どちらかを省略した場合はデフォルト値が暗黙的に適用) 指定した経過時間が過ぎるか、キュー・マップ内 のログ・エレメント数が超過するかのいずれかの 条件でLoaderが発動し、DBへ更新の反映を行う 47 IBM Software Group | WebSphere software ステップ4:トランザクショナブルなアクセス データ・ストアに対するトランザクションの維持とパフォーマンスのバランス – Lock Stretegy:OPTIMISTIC/PESSIMISTIC/NONEで排他制御を設定 • 更新の頻度が少なければパフォーマンスの良いOPTIMISTICに OPTIMISTIC begin WXSsolidObjectGrid update status=“FINISHED” commit begin RunnerMap Key VALUE 100002 亀田, FULL, REGISTERED update status=“RETIRED” commit OptimisticCollisionException PESSIMISTIC begin update status=“FINISHED” commit トランザクションAのコミットまで トランザクションBは待たされる WXSsolidObjectGrid RunnerMap Key VALUE 100002 亀田, FULL, REGISTERED begin update status=“RETIRED” commit トランザクション B トランザクション A wait トランザクション B トランザクション A 更新値がトランザクション開始時点から変更されていたら commit時に例外 48 IBM Software Group | WebSphere software ステップ4:トランザクショナブルなアクセス (参考)Lock Strategy定義 objectGrid.xml <objectGrids> <objectGrids> <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" lockStrategy="OPTIMISTIC" lockStrategy="OPTIMISTIC" <backingMap name="LaptimeMap" lockStrategy="OPTIMISTIC" <backingMap name="LaptimeMap" lockStrategy="OPTIMISTIC" </objectGrid> </objectGrid> </objectGrids> </objectGrids> /> /> /> /> BackingMapの単位でlockStrategy パラメーターを指定する 49 IBM Software Group | WebSphere software ステップ5:不整合を避けるための消しこみ キャッシュとDB、キャッシュ間などで更新による不整合発生の可能性 – Evictor:時間ベースやLRU、LFUでの消しこみ – Event Listener:更新イベント発生に基づく消しこみ ObjectGridサーバーとは 別経路からのデータ更新 Cluster AS Application PC AS Application OG OG status = “RUNNING” status = “RUNNING” AS OG Server LB AS Application DB OG 携帯 AS Application status = “FINISHED” OG オリジナルデータを更新された場合、 キャッシュデータは消しこむ 次に参照された際に再ロードを行う 50 IBM Software Group | WebSphere software ステップ5:不整合を避けるための消しこみ Evictor – TTL (Time To Live) / LRU (Least Recently Used) / LFU (Least Frequently Used) / Memory Based TTL 作成時間または最終アクセス 時間からの指定経過時間で TTL Evictor 消しこみ LRU 最近使用されたものを保存 作成順にキューに入り、使用されると再度入 りなおし、キューの先端から消しこみ LRU Evictor 09:00 09:07 09:09 09:12 09:23 09:31 09:43 09:50 11 05 09 07 03 01 09:02 09:08 09:10 09:21 09:28 09:40 09:47 14 06 12 10 08 04 LFU もっとも頻繁に使用されたものを保存 作成順にキューに入り、使用されるとカウンターを更 新、カウンター値が少ないものから消しこみ LFU Evictor 09 1 07 4 05 2 03 2 01 5 10 2 08 1 06 3 04 3 02 1 Memory Based 02 Memory Based Evictor 上記3オプションに追加で、ヒープの 使用率が指定値を超えるとEvictor起動 80 % ! 51 IBM Software Group | WebSphere software ステップ5:不整合を避けるための消しこみ (参考)Evictor定義 objectGrid.xml TTL <objectGrids> <objectGrids> <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap“ name="RunnerMap“ ttlEvictorType="CREATION_TIME" ttlEvictorType="CREATION_TIME" timeToLive="60" timeToLive="60" evictionTriggers="MEMORY_USAGE_THRESHOLD/> evictionTriggers="MEMORY_USAGE_THRESHOLD/> </objectGrid> </objectGrid> </objectGrids> </objectGrids> 作成時間から60秒のTTLに、 作成時間から60秒のTTLに、 Memory Memory Basedのトリガーを追加 Basedのトリガーを追加 LRUでキューの数、最大サイズ、 LRUでキューの数、最大サイズ、 スリープ時間を指定 スリープ時間を指定 objectGrid.xml LRU <objectGrids> <objectGrids> <objectGrid <objectGrid name="WXSsolidObjectGrid"> name="WXSsolidObjectGrid"> <backingMap <backingMap name="RunnerMap" name="RunnerMap" pluginCollectionRef="RunnerMapPlugins" pluginCollectionRef="RunnerMapPlugins" /> /> </objectGrid> </objectGrid> </objectGrids> </objectGrids> <backingMapPluginCollection <backingMapPluginCollection id="RunnerMapPlugins"> id="RunnerMapPlugins"> <bean <bean id="Evictor" id="Evictor" className= className= "com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor"> "com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor"> <property <property name="maxSize" name="maxSize" type="int" type="int" value="2“ value="2“ description="set description="set max max size size for for each each LRU LRU queue" queue" /> /> <property <property name="sleepTime" name="sleepTime" type="int" type="int" value="10" value="10" description="evictor thread sleep time" description="evictor thread sleep time" /> /> <property <property name="numberOfLRUQueues" name="numberOfLRUQueues" type="int" type="int" value="3" value="3" description="set description="set number number of of LRU LRU queues" queues" /> /> </bean> </bean> </backingMapPluginCollection> </backingMapPluginCollection> 52 IBM Software Group | WebSphere software ステップ5:不整合を避けるための消しこみ Event Listener – 変更イベントを検知し、ObjectGrid情報の消しこみ(更新)を行うプラグイン • JMSObjectGridEventListener:JMS Pub/Subの仕組みで変更を配布する製品 提供プラグイン Cluster AS Application PC AS Application OG OG status = “RUNNING” status = “FINISHED” status = “RUNNING” AS OG Server LB AS Application OG DB Event Listener 特定のキーに対する変更が行 われたことをトピックに登録 携帯 AS Application OG JMS Topic サブスクライブしていたプロセスが 変更を受領し、消しこみを行う 53 IBM Software Group | WebSphere software ステップ5:不整合を避けるための消しこみ (参考)Event Listener定義 – ObjectGrid、BackingMapそれぞれのレベルで定義が可能 • ObjectGridEventListener / MapEventListener – SIBus、MQなどのJMSトピック自体の構成が別途必要 objectGrid.xml <objectGrids> <objectGrid name="WXSsolidObjectGrid"> <bean id="ObjectGridEventListener" className="com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener"> <property name="invalidationModel" type="java.lang.String" value="CLIENT_SERVER_MODEL" description="" /> <property name="invalidationStrategy" type="java.lang.String" value=“INVALIDATE" description="" /> <property name="mapsToPublish" type="java.lang.String" value="RunnerMap;LaptimeMap" description="" /> <property name="jms_topicConnectionFactoryJndiName" type="java.lang.String" value="jms/Sdog_el_TopicCF" description="" /> <property name="jms_topicJndiName" type="java.lang.String" value="jms/Sdog_el_Topic" description="" /> <property name="jms_topicName" type="java.lang.String" value="SDOG_EL_Topic" description="" /> <property name="jms_userid" type="java.lang.String" value="" description="" /> <property name="jms_password" type="java.lang.String" value="" description="" /> </bean> <backingMap name="RunnerMap" /> <backingMap name="LaptimeMap" /> </objectGrid> </objectGrids> 54 IBM Software Group | WebSphere software WXS適用シナリオ(アプリケーション編):まとめ ステップ1:データをWXSへ配置 – ObjectGridの定義、コードの変更 ステップ2:キー経由以外のアクセス – Object Query、EntityManager、JPA L2キャッシュの使用 ステップ3:データベースとの連携 – Loader/TxCallback、JPA Loader、非同期Loader ステップ4:トランザクショナブルなアクセス – Lock Strategy (OPTIMISTIC/PESSIMISTIC/NONE) ステップ5:不整合を避けるための消しこみ – Evictor (TTL/LRU/LFU/Memory Based)、Event Listener 55 IBM Software Group | WebSphere software §4. WXS適用シナリオ(インフラ編) スケールアウト/耐障害設計 56 IBM Software Group | WebSphere software アプリケーション編と同じ流れで、 耐障害設計やスケーラビリティ構成など インフラに関連する定義項目の解説を行います。 57 IBM Software Group | WebSphere software ステップ6:耐障害性向上(レプリカ) レプリカの定義方法、種類 – objectGridDeployment.xml:レプリカなどの配置定義用XML • 同期レプリカ:同一トランザクションでマスター更新を反映するレプリカ • 非同期レプリカ:更新非同期反映によりパフォーマンス劣化を抑止したレプリカ Cluster AS Application PC 同一のデータを複数のプロセス にレプリケーション OG OG AS Server AS Application OG OG AS Server LB AS Application DB OG OG AS Server 携帯 AS Application OG 障害時にデータの損失を無くし、 サービスの継続提供が可能に 58 IBM Software Group | WebSphere software ステップ6:耐障害性向上(レプリカ) – 同期レプリカと非同期レプリカ • 耐障害性重視 → 同期レプリカ • パフォーマンス重視 → 非同期レプリカ 非同期レプリカ 同期レプリカ プライマリ プライマリ 更新要求は必ずプライマリに 更新要求は必ずプライマリに OG AS Server OG AS Server レプリカ 更新は同一トランザクション内で反映 レプリカ更新失敗の場合、オリジナルの トランザクションも失敗 OG AS Server レプリカ オリジナルのトランザクションは成功し、レプリカ の更新が失敗する可能性あり 障害のタイミングによっては更新の損失もある OG AS Server ※ 一つのプライマリに対し、「同期1、非同期2」といった組み合わせの定義も可能 59 IBM Software Group | WebSphere software ステップ6:耐障害性向上(レプリカ) – 障害時の挙動 • WAS HAマネージャーの仕組みで障害を即時検知 • プライマリの障害に対しては、レプリカがプライマリに昇格、追加で必要な数レプ リカを作成 元プライマリ プライマリ OG AS Server OG AS Server レプリカがプライマリに昇格し、別途必要な数の レプリカを新規に作成、データのコピーを行う プライマリがダウンするとWAS HAマネージャー と同一の仕組みで他のプロセスで検知 プライマリ レプリカ レプリカ OG Server OG AS Server OG AS Server 60 IBM Software Group | WebSphere software ステップ6:耐障害性向上(レプリカ) – (参考)レプリカ定義 • objectGridDeployment.xml:配置構成用ファイル – objectGrid.xmlと組み合わせて使用 objectGridDeployment.xml <?xml version="1.0" encoding="UTF-8"?> <deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy ../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy"> <objectgridDeployment objectgridName="WXSsolidObjectGrid"> <mapSet name="mapSet1" numberOfPartitions="1" minSyncReplicas="0" maxSyncReplicas="0" maxAsyncReplicas="0" numInitialContainers="1"> <map ref="RunnerMap" /> <map ref="LaptimeMap" /> </mapSet> </objectgridDeployment> minSyncReplicas:同期レプリカ最小数 minSyncReplicas:同期レプリカ最小数 </deploymentPolicy> maxSyncReplicas:同期レプリカ最大数 maxSyncReplicas:同期レプリカ最大数 maxAsyncReplicas:非同期レプリカ最大数 maxAsyncReplicas:非同期レプリカ最大数 numInitialContainers:サービス開始に必要なJVM数 numInitialContainers:サービス開始に必要なJVM数 61 IBM Software Group | WebSphere software ステップ7:スケーラビリティ向上(パーティション) パーティションの適用方針、適用方法、高速データ・グリッド処理の実現 – パーティショニング:スケーラビリティの実現 • カタログ・サーバー:データ配置を制御・案内するサーバー 欲しいデータがどこにあるかは カタログ・サーバーから取得 Cluster AS Application PC Catalog Server OG OG AS Server AS Application OG OG AS Server LB AS Application OG OG AS Server 携帯 AS Application カタログ・サーバーはデフォルト でDMに配置されるが変更・複 数起動も可能 OG DB データを区分配置 =パーティショニング OGサーバーJVMが追加されると、 パーティションは自動的にリバランス されて再配置される 62 IBM Software Group | WebSphere software ステップ7:スケーラビリティ向上(パーティション) – (参考)パーティションの定義 • レプリカと同様、ObjectGridDeployment.xmlに記載 objectGridDeployment.xml <?xml version="1.0" encoding="UTF-8"?> <deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy ../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy"> <objectgridDeployment objectgridName="WXSsolidObjectGrid"> <mapSet name="mapSet1" numberOfPartitions="10" minSyncReplicas="0" maxSyncReplicas="0" numberOfPartitions:全体で保持するパーティション数 numberOfPartitions:全体で保持するパーティション数 maxAsyncReplicas="0" numInitialContainers="1"> z z レプリカはパーティション単位になされる レプリカはパーティション単位になされる <map ref="RunnerMap" /> z z パーティション数は現行JVM数だけでなく、将来的な パーティション数は現行JVM数だけでなく、将来的な <map ref="LaptimeMap" /> JVM数に配慮する </mapSet> JVM数に配慮する </objectgridDeployment> z z 一般的に、1JVMに10以下のパーティション数とする 一般的に、1JVMに10以下のパーティション数とする </deploymentPolicy> OG AS Server OG AS Server OG AS Server 2JVMで2パーティションだと、3つめ のJVMが増えてもスケールしない OG AS Server OG AS Server OG AS Server 2JVMで10パーティションであれば、 最大10JVMまでスケールできる 63 IBM Software Group | WebSphere software ステップ7:スケーラビリティ向上(パーティション) – DataGrid API • パーティション環境で大量データに対する並列処理実行のためのAPI • データをアプリケーションに → データがあるJVMでアプリケーション処理を実行 Catalog Server 全データをクライアント側に取得し、 計算処理を行うと時間がかかる AS Application OG OG AS Server DataGrid Application OG AS Server DB DataGrid Application OG AS Server DataGrid Application 個々のプロセスで行われた計算結果を集約す るだけであれば、クライアント側の負荷は低い データがあるプロセス内にてパーティション分の計算処理を並 列実行することで、「負荷のスケールアウト」が可能に 64 IBM Software Group | WebSphere software WXS適用シナリオ(インフラ編):まとめ ステップ6:耐障害性向上(レプリカ) – objectGridDeployment.xmlの定義 – 同期・非同期レプリカの選択、レプリカ数の設定 – 障害時挙動の理解 ステップ7:スケーラビリティ向上(パーティション) – objectGridDeployment.xmlの定義 – パーティション数の設定 – カタログ・サーバーによるデータ配置情報の取得 – DataGrid APIによる大量データの並列処理実行の実現 65 IBM Software Group | WebSphere software §5. おわりに 66 IBM Software Group | WebSphere software まとめ WXSはスケーラビリティが求められるクラウド時代に威力を発揮するKeyValue型データ・ストア DBアクセスの高速化/高可用性セッション・オブジェクト/大量トランザク ション処理などに適用可能 オークション・サイトでの大量トランザクション処理グリッド、NGN向け高信頼 性セッション・オブジェクトの事例を紹介 WXSアプリケーション構築では、アクセスAPIの選択、DB連携手法、キャッ シュの消しこみ運用などを考慮 WXSインフラ構築では、レプリケーション、パーティショニング、カタログ・サー バーなどを可用性、パフォーマンス、スケーラビリティ要件に応じ構成 67