oracle coherence勉強会
Post on 10-May-2015
9.481 Views
Preview:
TRANSCRIPT
ORACLE COHERENCE 勉強会
@making
Contents 概要説明
Oracle Coherence とは分散キャッシュを用いたアーキテクチャ例キャッシュの仕組み
ハンズオンCoherence インストールOracle Coherence にアクセスCoherence API を使用して Java からアクセスJava Beans のキャッシュキャッシュデータの検索・集計処理CohQL (Coherence Query Language)
概要説明
Oracle Coherence とは インメモリデータグリッド
複数サーバに渡る分散キャッシュ キャッシュ以外の機能
○ クエリ機能○ イベントリスナ機能○ データ処理のパラレル実行機能
Java ベース 実体は Java クラスライブラリ
○ coherence.jar があれば動く クライアントは Java/C++/.NET
利用目的 スケーラブルなシステム構築 DB ボトルネックの解消
類似製品 IBM WebSphere eXtreme Scale (IBM) Gemstone Gemfire (SpringSource) EhCache (Teracotta)
クライアント
Coherence データグリッド
データベースWEB
サービス
分散キャッシュ 複数の JVM でクラスタ形成
データを分散して配置 透過的なデータアクセス
クライアント
A B C
JVM
A
JVM
B
JVM
C
Map 型インタフェース java.util.Map を継承した key/value イン
タフェース
NamedCache cache =
CacheFactory.getCache("person"); Person p1 = (Person) cache.get(key1); cache.put(key2, p2);
データグリッドを用いる場合の基本的なアーキテクチャ 従来型 データグリッド
クライアント
AP サーバ AP サーバ
データベース永続化データ
個別データ
共通データ
個別データ
共通データ
クライアント
AP サーバ AP サーバ
データベース永続化データ
個別データ 個別データ
キャッシュサーバ キャッシュサーバ キャッシュサーバ
共通データ
基本的な適用パターン例1. 大量のマスタデータのキャッシュする2. 大量の HTTP セッションを扱う
パターン 1 :大量のマスタデータのキャッシュ 従来
AP サーバマスタデータ
データ読み込み
データベース
AP サーバマスタデータ
データ読み込み
起動時に全部読み込む
パターン 1 :大量のマスタデータのキャッシュ データグリッド
AP サーバマスタデータ
データ読み込み
データベース
AP サーバマスタデータ
データ読み込み
キャッシュサーバ キャッシュサーバマスタデータ
データ読み込み
必要な時に読み込む
起動時に全部読み込む
パターン 1 :大量のマスタデータのキャッシュ データグリッド
AP サーバマスタデータ
データ読み込み
データベース
AP サーバマスタデータ
データ読み込み
キャッシュサーバ キャッシュサーバマスタデータ
データ読み込みデータが増えたら…
キャッシュサーバ
パターン 1 :大量のマスタデータのキャッシュ データグリッド
AP サーバマスタデータ
データ読み込み
データベース
AP サーバマスタデータ
データ読み込み
キャッシュサーバ キャッシュサーバマスタデータ
データ読み込み
スケールアウトで容量増加
パターン 2 :大量の HTTP セッション
従来
メモリはスケールしない セッションレプリケーションがネックであ
まりスケールしない
AP サーバ
セッション管理
AP サーバ
セッション管理
レプリケーション
スケール小
パターン 2 :大量の HTTP セッション
データグリッド
AP サーバ AP サーバ
キャッシュサーバ キャッシュサーバマスタデータ
スケール大
パターン 2 :大量の HTTP セッション
データグリッド
AP サーバ AP サーバ
キャッシュサーバ キャッシュサーバ キャッシュサーバマスタデータ
スケール大
パターン 2 :大量の HTTP セッション
データグリッド
AP サーバ AP サーバ
キャッシュサーバ キャッシュサーバ キャッシュサーバマスタデータフェールオーバ
スケール大
Coherence が提供するキャッシュ方式
レプリケーションキャッシュ全てのキャッシュアイテムが全ノードに複製される
パーティションキャッシュ複数のノードに分散してキャッシュする
ニアキャッシュ ( 次回 )二層混成キャッシュ ( フロント:ローカルキャッ
シュ、バック:パーティションキャッシュ )
以降「 IT アーキテクト Vol.22 」の内容を改編して説明
レプリケーションキャッシュ 全てのキャッシュアイテムがグリッド内
のすべてのノードに複製される→ 書き込み性能は設定次第 ( レプリケーションの同期をとるか、非同期にするか ) アプリケーションと同一のプロセス内に
キャッシュ領域を作成→ 読み込みは遅延時間 0 なので速い
レプリケーションキャッシュの読み込み
キャッシュノード 1
アプリケーション
A B
C D
キャッシュノード 2
アプリケーション
A B
C D
キャッシュノード 3
アプリケーション
A B
C D
読み取りはプロセス内で完結
レプリケーションキャッシュの書き込み
キャッシュノード 1
アプリケーション
A B
C D
キャッシュノード 2
アプリケーション
A B
C D
キャッシュノード 3
アプリケーション
A B
C D
書き込みは他のノードへレプリケート
パーティションキャッシュ 各ノードに分散して保存 通常アプリケーションと別プロセス内に
キャッシュ領域を作成する 読み込みはあるノードからネットワーク経由
で行う 書き込みはプライマリデータとバックアップ
データをそれぞれ別のノードにネットワーク経由で行うバックアップ数は変更可能であるが 1 が推奨値
パーティションキャッシュの読み込み
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A
B
CD
A
B
C D
読み取りは 1 往復のネットワークアクセス
パーティションキャッシュの書き込み
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A
B
CD
A
B
C D
書き込みは 2 往復のネットワークアクセス
パーティションキャッシュのリカバリ
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A
B
CD
A
B
C D
パーティションキャッシュのリカバリ
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
B
C
A
B
D
パーティションキャッシュのリカバリ
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
B
C
A
B
D
A D
バックアップがプライマリに昇格
パーティションキャッシュのリカバリ
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
B
CBA D
バックアップがプライマリに昇格
パーティションキャッシュのリカバリ
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
B
C
D
B
A
A D
C
プライマリからバックアップを作成
パーティションキャッシュのリカバリ
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
B
C
D
B
A
A D
C
パーティションキャッシュのノード追加
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A
B
CD
A
B
C D
キャッシュノード 4
P
B
パーティションキャッシュのノード追加
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A
B
CD
A
B
C D
キャッシュノード 4
P
B
D
B
再パーティショニング
パーティションキャッシュのノード追加
キャッシュノード 1
アプリケーション アプリケーション
キャッシュノード 2 キャッシュノード 3
P
B
P
B
P
B
P… プライマリデータ、 B… バックアップデータ
A C
A
B
C D
キャッシュノード 4
P
B
D
B
キャッシュ容量を追加できる
レプリケーションキャッシュとパーティションキャッシュの比較方式 書き込み 読み込み データサイズ 耐障害性
レプリケーション
全ノードに書き込む( 同期 / 非同期でレイテンシが変わる )
遅延時間 0 1 プロセスに割り当て可能な最大量( 2
~ 4GB )
高い ( 落ちたノードを無視するのみ )
パーティション
(1+ バックアップ数 ) 往復のネットワークアクセス
1 往復のネットワークアクセス
ノードの追加によって容量を拡張可能
バックアップからプライマリへ昇格し、新たなバックアップを別ノードに作成
ハンズオンではパーティションキャッシュを使用します
ハンズオン
資材 coherence-handson フォルダで
mvn eclipse:eclipse○ 要 maven 設定 (proxy, Eclipse のクラスパス変
数 M2_REPO)Eclipse からインポート
別テキストをベースに進める
Oracle Coherence インストール
http://www.oracle.com/technetwork/middleware/coherence/downloads/index.html
「 Oracle Coherence for Java Version 3.6.1 」をクリックしてダウンロードして展開
展開したディレクトリを環境変数COHERENCE_HOME に設定
JAVA_HOME が未設定の場合は設定
キャッシュサーバー起動 %coherence_home%\bin\cache-
server.bat を実行
クラスタのメンバ情報
プライベートクラスタ作成 同一ネットワーク上で Coherence サーバを立ち
上げると、デフォルト設定で同じマルチキャストアドレスとポートを使用するので、同一クラスタに参加してしまう
( 回避策 1) マルチキャストアドレス / ポートを変更-Dtangosol.coherence.clusteraddress=224.0.0.7-Dtangosol.coherence.clusterport=33333
( 回避策 2)TTL を 0 にする-Dtangosol.coherence.ttl=0
↑の JVM 起動オプションを cache-server.batやcoherence.bat の java_opts に設定
設定ファイルで設定することも可能
今回は TTL=0 の設定を設定ファイルに記述 クラスパス上に tangosol-coherence-
override.xml を作成し、%coherence_home%\lib 上に置く。
cache-server.bat と coherence.bat のjavaコマンドの -cpを“%coherence_home%\lib;%coherence_home%\lib\coherence.jar” に変更
設定内容 tangosol-coherence-override.xml に以下
の設定を記述
<coherence> <cluster-config> <multicast-listener> <!-- TTL の設定 --> <time-to-live>0</time-to-live> <!-- 既存のクラスタの確認をあきらめ新しいクラスタを開始するまでの時間 --> <join-timeout-milliseconds>1000</join-timeout-milliseconds> </multicast-listener> </cluster-config></coherence>
キャッシュサーバーをもう一度起動
設定ファイルが上書きされていることを確認
TTL=0 になっていることを確認
コマンドラインからデータグリッドにアクセス coherence.bat を実行
Map (?): cache test
Map (test): put 1 OneMap (test): get 1OneMap (test): put 2 TwoMap (test): list1 = One2 = Two
cache キャッシュに名前をつけて作成put キーと値のペアをキャッシュに
格納する。常にそのキーに対する直前の値が返却される。
get キャッシュからキーに対応する値を取得する。
list キャッシュの内容を表示するremove キャッシュからキーに対応する
値を削除する。
Java からデータグリッドにアクセス 新規の NamedCache を作成
java.util.Map を拡張しているので操作がわかりやすい
作成した NamedCache へオブジェ y九との put と get
簡単なサンプルpackage handson.coherence.lab3; import com.tangosol.net.CacheFactory;import com.tangosol.net.NamedCache; public class MyFirstSample { public static void main(String[] args) { NamedCache cache = CacheFactory.getCache("mycache"); cache.put("Name", "Taro Yamada"); System.out.println("Value in cache is " + cache.get("Name")); } }
Java Beans のキャッシュ 2種類の方式
java.io.Serializable インタフェースを実装する方法
Portable Object Format(POF) を実装する方法
POF は C++/.NET 間でも利用可能な上、高速かつ低容量なシリアライゼーション機構ただし、実装がやや面倒かつ、 POF 構成ファ
イルへの登録が必要
Serializable と POF の比較例
シリアライズ時間(ms)
デシリアライズ時間 (ms)
サイズ (byte)
Java Serializable 2360 10078 867
POF 547 1234 186
Coherence を使う場合、 POF を用いるのが推奨されている
java.util.Serializable を実装する方法 hashCode/equals を実装すること
Eclipse で Alt+Shift+S -> H デフォルトコンストラクタを作成するこ
と
POF を実装する方法 com.tangosol.io.pof.PortableObject を実装するjava.util.Serializable の条件に加えてreadExternal(PofReader),
writeExternal(PofWriter) を実装 @Override public void readExternal(PofReader reader) throws IOException { id = reader.readInt(0); surname = reader.readString(1); firstname = reader.readString(2); address = reader.readString(3); age = reader.readInt(4); gender = reader.readString(5); }
@Override public void writeExternal(PofWriter writer) throws IOException { writer.writeInt(0, id); writer.writeString(1, surname); writer.writeString(2, firstname); writer.writeString(3, address); writer.writeInt(4, age); writer.writeString(5, gender); }
POF 構成ファイルの設定 間に合いませんでした m(_ _)m
口頭で説明します
検索集計処理 間に合いませんでした m(_ _)m
口頭で説明します
CohQL
間に合いませんでした m(_ _)m口頭で説明します
次回予定 キャッシュの構造 ( キャッシュトポロジ、
バッキングマップ ) キャッシュデータの更新検知 エントリプロセッサによる複数キャッシュ
データ同時並行処理 複合キーとデータアフィニティ インボケーションサービスによる非同期処
理 Spring連携 永続化層の実装 (JPA/SpringJDBC連携 )
参考書籍 IT アーキテクト Vol.22 Oracle Coherence入門 ( アスキー・メ
ディアワークス )
top related