oracle coherence勉強会

55
ORACLE COHERENCE 勉勉勉 @making

Upload: toshiaki-maki

Post on 10-May-2015

9.479 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Oracle Coherence勉強会

ORACLE COHERENCE 勉強会

@making

Page 2: Oracle Coherence勉強会

Contents 概要説明

Oracle Coherence とは分散キャッシュを用いたアーキテクチャ例キャッシュの仕組み

ハンズオンCoherence インストールOracle Coherence にアクセスCoherence API を使用して Java からアクセスJava Beans のキャッシュキャッシュデータの検索・集計処理CohQL (Coherence Query Language)

Page 3: Oracle Coherence勉強会

概要説明

Page 4: Oracle Coherence勉強会

Oracle Coherence とは インメモリデータグリッド

複数サーバに渡る分散キャッシュ キャッシュ以外の機能

○ クエリ機能○ イベントリスナ機能○ データ処理のパラレル実行機能

Java ベース 実体は Java クラスライブラリ

○ coherence.jar があれば動く クライアントは Java/C++/.NET

利用目的 スケーラブルなシステム構築 DB ボトルネックの解消

類似製品 IBM WebSphere eXtreme Scale (IBM) Gemstone Gemfire (SpringSource) EhCache (Teracotta)

クライアント

Coherence データグリッド

データベースWEB

サービス

Page 5: Oracle Coherence勉強会

分散キャッシュ 複数の JVM でクラスタ形成

データを分散して配置 透過的なデータアクセス

クライアント

A B C

JVM

A

JVM

B

JVM

C

Page 6: Oracle Coherence勉強会

Map 型インタフェース java.util.Map を継承した key/value イン

タフェース

NamedCache cache =

CacheFactory.getCache("person"); Person p1 = (Person) cache.get(key1); cache.put(key2, p2);

Page 7: Oracle Coherence勉強会

データグリッドを用いる場合の基本的なアーキテクチャ 従来型 データグリッド

クライアント

AP サーバ AP サーバ

データベース永続化データ

個別データ

共通データ

個別データ

共通データ

クライアント

AP サーバ AP サーバ

データベース永続化データ

個別データ 個別データ

キャッシュサーバ キャッシュサーバ キャッシュサーバ

共通データ

Page 8: Oracle Coherence勉強会

基本的な適用パターン例1. 大量のマスタデータのキャッシュする2. 大量の HTTP セッションを扱う

Page 9: Oracle Coherence勉強会

パターン 1 :大量のマスタデータのキャッシュ 従来

AP サーバマスタデータ

データ読み込み

データベース

AP サーバマスタデータ

データ読み込み

起動時に全部読み込む

Page 10: Oracle Coherence勉強会

パターン 1 :大量のマスタデータのキャッシュ データグリッド

AP サーバマスタデータ

データ読み込み

データベース

AP サーバマスタデータ

データ読み込み

キャッシュサーバ キャッシュサーバマスタデータ

データ読み込み

必要な時に読み込む

起動時に全部読み込む

Page 11: Oracle Coherence勉強会

パターン 1 :大量のマスタデータのキャッシュ データグリッド

AP サーバマスタデータ

データ読み込み

データベース

AP サーバマスタデータ

データ読み込み

キャッシュサーバ キャッシュサーバマスタデータ

データ読み込みデータが増えたら…

Page 12: Oracle Coherence勉強会

キャッシュサーバ

パターン 1 :大量のマスタデータのキャッシュ データグリッド

AP サーバマスタデータ

データ読み込み

データベース

AP サーバマスタデータ

データ読み込み

キャッシュサーバ キャッシュサーバマスタデータ

データ読み込み

スケールアウトで容量増加

Page 13: Oracle Coherence勉強会

パターン 2 :大量の HTTP セッション

従来

メモリはスケールしない セッションレプリケーションがネックであ

まりスケールしない

AP サーバ

セッション管理

AP サーバ

セッション管理

レプリケーション

スケール小

Page 14: Oracle Coherence勉強会

パターン 2 :大量の HTTP セッション

データグリッド

AP サーバ AP サーバ

キャッシュサーバ キャッシュサーバマスタデータ

スケール大

Page 15: Oracle Coherence勉強会

パターン 2 :大量の HTTP セッション

データグリッド

AP サーバ AP サーバ

キャッシュサーバ キャッシュサーバ キャッシュサーバマスタデータ

スケール大

Page 16: Oracle Coherence勉強会

パターン 2 :大量の HTTP セッション

データグリッド

AP サーバ AP サーバ

キャッシュサーバ キャッシュサーバ キャッシュサーバマスタデータフェールオーバ

スケール大

Page 17: Oracle Coherence勉強会

Coherence が提供するキャッシュ方式

レプリケーションキャッシュ全てのキャッシュアイテムが全ノードに複製される

パーティションキャッシュ複数のノードに分散してキャッシュする

ニアキャッシュ ( 次回 )二層混成キャッシュ ( フロント:ローカルキャッ

シュ、バック:パーティションキャッシュ )

以降「 IT アーキテクト Vol.22 」の内容を改編して説明

Page 18: Oracle Coherence勉強会

レプリケーションキャッシュ 全てのキャッシュアイテムがグリッド内

のすべてのノードに複製される→ 書き込み性能は設定次第 ( レプリケーションの同期をとるか、非同期にするか ) アプリケーションと同一のプロセス内に

キャッシュ領域を作成→ 読み込みは遅延時間 0 なので速い

Page 19: Oracle Coherence勉強会

レプリケーションキャッシュの読み込み

キャッシュノード 1

アプリケーション

A B

C D

キャッシュノード 2

アプリケーション

A B

C D

キャッシュノード 3

アプリケーション

A B

C D

読み取りはプロセス内で完結

Page 20: Oracle Coherence勉強会

レプリケーションキャッシュの書き込み

キャッシュノード 1

アプリケーション

A B

C D

キャッシュノード 2

アプリケーション

A B

C D

キャッシュノード 3

アプリケーション

A B

C D

書き込みは他のノードへレプリケート

Page 21: Oracle Coherence勉強会

パーティションキャッシュ 各ノードに分散して保存 通常アプリケーションと別プロセス内に

キャッシュ領域を作成する 読み込みはあるノードからネットワーク経由

で行う 書き込みはプライマリデータとバックアップ

データをそれぞれ別のノードにネットワーク経由で行うバックアップ数は変更可能であるが 1 が推奨値

Page 22: Oracle Coherence勉強会

パーティションキャッシュの読み込み

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A

B

CD

A

B

C D

読み取りは 1 往復のネットワークアクセス

Page 23: Oracle Coherence勉強会

パーティションキャッシュの書き込み

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A

B

CD

A

B

C D

書き込みは 2 往復のネットワークアクセス

Page 24: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A

B

CD

A

B

C D

Page 25: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

B

C

A

B

D

Page 26: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

B

C

A

B

D

A D

バックアップがプライマリに昇格

Page 27: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

B

CBA D

バックアップがプライマリに昇格

Page 28: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

B

C

D

B

A

A D

C

プライマリからバックアップを作成

Page 29: Oracle Coherence勉強会

パーティションキャッシュのリカバリ

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

B

C

D

B

A

A D

C

Page 30: Oracle Coherence勉強会

パーティションキャッシュのノード追加

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A

B

CD

A

B

C D

キャッシュノード 4

P

B

Page 31: Oracle Coherence勉強会

パーティションキャッシュのノード追加

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A

B

CD

A

B

C D

キャッシュノード 4

P

B

D

B

再パーティショニング

Page 32: Oracle Coherence勉強会

パーティションキャッシュのノード追加

キャッシュノード 1

アプリケーション アプリケーション

キャッシュノード 2 キャッシュノード 3

P

B

P

B

P

B

P… プライマリデータ、 B… バックアップデータ

A C

A

B

C D

キャッシュノード 4

P

B

D

B

キャッシュ容量を追加できる

Page 33: Oracle Coherence勉強会

レプリケーションキャッシュとパーティションキャッシュの比較方式 書き込み 読み込み データサイズ 耐障害性

レプリケーション

全ノードに書き込む( 同期 / 非同期でレイテンシが変わる )

遅延時間 0 1 プロセスに割り当て可能な最大量( 2

~ 4GB )

高い ( 落ちたノードを無視するのみ )

パーティション

(1+ バックアップ数 ) 往復のネットワークアクセス

1 往復のネットワークアクセス

ノードの追加によって容量を拡張可能

バックアップからプライマリへ昇格し、新たなバックアップを別ノードに作成

Page 34: Oracle Coherence勉強会

ハンズオンではパーティションキャッシュを使用します

Page 35: Oracle Coherence勉強会

ハンズオン

Page 36: Oracle Coherence勉強会

資材 coherence-handson フォルダで

mvn eclipse:eclipse○ 要 maven 設定 (proxy, Eclipse のクラスパス変

数 M2_REPO)Eclipse からインポート

別テキストをベースに進める

Page 37: Oracle Coherence勉強会

Oracle Coherence インストール

http://www.oracle.com/technetwork/middleware/coherence/downloads/index.html

「 Oracle Coherence for Java Version 3.6.1 」をクリックしてダウンロードして展開

展開したディレクトリを環境変数COHERENCE_HOME に設定

JAVA_HOME が未設定の場合は設定

Page 38: Oracle Coherence勉強会

キャッシュサーバー起動 %coherence_home%\bin\cache-

server.bat を実行

Page 39: Oracle Coherence勉強会

クラスタのメンバ情報

Page 40: Oracle Coherence勉強会

プライベートクラスタ作成 同一ネットワーク上で 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 に設定

設定ファイルで設定することも可能

Page 41: Oracle Coherence勉強会

今回は TTL=0 の設定を設定ファイルに記述 クラスパス上に tangosol-coherence-

override.xml を作成し、%coherence_home%\lib 上に置く。

cache-server.bat と coherence.bat のjavaコマンドの -cpを“%coherence_home%\lib;%coherence_home%\lib\coherence.jar” に変更

Page 42: Oracle Coherence勉強会

設定内容 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> 

Page 43: Oracle Coherence勉強会

キャッシュサーバーをもう一度起動

設定ファイルが上書きされていることを確認

TTL=0 になっていることを確認

Page 44: Oracle Coherence勉強会

コマンドラインからデータグリッドにアクセス 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 キャッシュからキーに対応する

値を削除する。

Page 45: Oracle Coherence勉強会

Java からデータグリッドにアクセス 新規の NamedCache を作成

java.util.Map を拡張しているので操作がわかりやすい

作成した NamedCache へオブジェ y九との put と get

Page 46: Oracle Coherence勉強会

簡単なサンプル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")); } }

 

Page 47: Oracle Coherence勉強会

Java Beans のキャッシュ 2種類の方式

java.io.Serializable インタフェースを実装する方法

Portable Object Format(POF) を実装する方法

POF は C++/.NET 間でも利用可能な上、高速かつ低容量なシリアライゼーション機構ただし、実装がやや面倒かつ、 POF 構成ファ

イルへの登録が必要

Page 48: Oracle Coherence勉強会

Serializable と POF の比較例

シリアライズ時間(ms)

デシリアライズ時間 (ms)

サイズ (byte)

Java Serializable 2360 10078 867

POF 547 1234 186

Coherence を使う場合、 POF を用いるのが推奨されている

Page 49: Oracle Coherence勉強会

java.util.Serializable を実装する方法 hashCode/equals を実装すること

Eclipse で Alt+Shift+S -> H デフォルトコンストラクタを作成するこ

Page 50: Oracle Coherence勉強会

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); }

Page 51: Oracle Coherence勉強会

POF 構成ファイルの設定 間に合いませんでした m(_ _)m

口頭で説明します

Page 52: Oracle Coherence勉強会

検索集計処理 間に合いませんでした m(_ _)m

口頭で説明します

Page 53: Oracle Coherence勉強会

CohQL

間に合いませんでした m(_ _)m口頭で説明します

Page 54: Oracle Coherence勉強会

次回予定 キャッシュの構造 ( キャッシュトポロジ、

バッキングマップ ) キャッシュデータの更新検知 エントリプロセッサによる複数キャッシュ

データ同時並行処理 複合キーとデータアフィニティ インボケーションサービスによる非同期処

理 Spring連携 永続化層の実装 (JPA/SpringJDBC連携 )

Page 55: Oracle Coherence勉強会

参考書籍 IT アーキテクト Vol.22 Oracle Coherence入門 ( アスキー・メ

ディアワークス )