...

WebSphere eXtreme Scale テクニカル・セッション 日本IBMシステムズ・エンジニアリング(ISE) 山口 崇 ()

by user

on
Category: Documents
77

views

Report

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
Fly UP