2011/02/22 @making Oracle Coherence勉強会
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 WebSphereeXtremeScale (IBM) • Gemstone Gemfire (SpringSource) • EhCache (Teracotta) Coherenceデータグリッド WEBサービス データベース
分散キャッシュ • 複数のJVMでクラスタ形成 • データを分散して配置 • 透過的なデータアクセス クライアント B C A JVM JVM JVM A B C
Map型インタフェース • java.util.Mapを継承したkey/valueインタフェース NamedCachecache = CacheFactory.getCache("person"); Person p1 = (Person) cache.get(key1); cache.put(key2, p2);
データグリッドを用いる場合の基本的なアーキテクチャ データグリッドを用いる場合の基本的なアーキテクチャ • 従来型 • データグリッド クライアント クライアント APサーバ APサーバ APサーバ APサーバ 個別データ 個別データ 個別データ 個別データ 共通データ 共通データ キャッシュサーバ キャッシュサーバ キャッシュサーバ 共通データ データベース データベース 永続化データ 永続化データ
基本的な適用パターン例 • 大量のマスタデータのキャッシュする • 大量のHTTPセッションを扱う
パターン1:大量のマスタデータのキャッシュ パターン1:大量のマスタデータのキャッシュ • 従来 APサーバ APサーバ マスタデータ マスタデータ データ読み込み データ読み込み 起動時に全部読み込む データベース
パターン1:大量のマスタデータのキャッシュ パターン1:大量のマスタデータのキャッシュ • データグリッド APサーバ APサーバ マスタデータ マスタデータ データ読み込み データ読み込み 必要な時に読み込む キャッシュサーバ キャッシュサーバ マスタデータ 起動時に全部読み込む データベース データ読み込み
パターン1:大量のマスタデータのキャッシュ パターン1:大量のマスタデータのキャッシュ • データグリッド APサーバ APサーバ マスタデータ マスタデータ データ読み込み データ読み込み キャッシュサーバ キャッシュサーバ マスタデータ データが増えたら… データベース データ読み込み
パターン1:大量のマスタデータのキャッシュ パターン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 キャッシュノード2 キャッシュノード3 アプリケーション アプリケーション アプリケーション A A A B B B C C C D D D
レプリケーションキャッシュの書き込み 書き込みは他のノードへ レプリケート キャッシュノード1 キャッシュノード2 キャッシュノード3 アプリケーション アプリケーション アプリケーション A A A B B B C C C D D D
パーティションキャッシュ • 各ノードに分散して保存 • 通常アプリケーションと別プロセス内にキャッシュ領域を作成する • 読み込みはあるノードからネットワーク経由で行う • 書き込みはプライマリデータとバックアップデータをそれぞれ別のノードにネットワーク経由で行う • バックアップ数は変更可能であるが1が推奨値
パーティションキャッシュの読み込み 読み取りは1往復の ネットワークアクセス アプリケーション アプリケーション キャッシュノード1 キャッシュノード2 キャッシュノード3 P P P A D B C C A D B B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュの書き込み 書き込みは2往復の ネットワークアクセス アプリケーション アプリケーション キャッシュノード1 キャッシュノード2 キャッシュノード3 P P P A D B C C A D B B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード1 キャッシュノード2 キャッシュノード3 P P P A D B C C A D B B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード2 キャッシュノード3 P P B C A D B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード2 キャッシュノード3 P P バックアップが プライマリに昇格 A B D C A D B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード2 キャッシュノード3 P P バックアップが プライマリに昇格 A B D C B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード2 キャッシュノード3 P P プライマリから バックアップを作成 A B D C C D A B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのリカバリ アプリケーション アプリケーション キャッシュノード2 キャッシュノード3 P P A B D C C D A B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのノード追加 アプリケーション アプリケーション キャッシュノード1 キャッシュノード2 キャッシュノード3 キャッシュノード4 P P P P A D B C C A D B B B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのノード追加 アプリケーション アプリケーション 再パーティショニング キャッシュノード1 キャッシュノード2 キャッシュノード3 キャッシュノード4 P P P P D A D B C C A D B B B B B B P…プライマリデータ、B…バックアップデータ
パーティションキャッシュのノード追加 キャッシュ容量を 追加できる アプリケーション アプリケーション キャッシュノード1 キャッシュノード2 キャッシュノード3 キャッシュノード4 P P P P D A B C C A D B B B B B P…プライマリデータ、B…バックアップデータ
レプリケーションキャッシュとパーティションキャッシュの比較 レプリケーションキャッシュとパーティションキャッシュの比較
ハンズオンではパーティションキャッシュを使用します ハンズオンではパーティションキャッシュを使用します
ハンズオン
資材 • coherence-handsonフォルダで • mvneclipse: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 One Map (test): get 1 One Map (test): put 2 Two Map (test): list 1 = One 2 = Two
Javaからデータグリッドにアクセス • 新規のNamedCacheを作成 • java.util.Mapを拡張しているので操作がわかりやすい • 作成したNamedCacheへオブジェy九とのputとget
簡単なサンプル packagehandson.coherence.lab3; importcom.tangosol.net.CacheFactory; importcom.tangosol.net.NamedCache; publicclassMyFirstSample { publicstaticvoid main(String[] args) { NamedCachecache = 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の比較例 • 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 publicvoidreadExternal(PofReaderreader) throwsIOException { 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 publicvoidwriteExternal(PofWriterwriter) throwsIOException { writer.writeInt(0, id); writer.writeString(1, surname); writer.writeString(2, firstname); writer.writeString(3, address); writer.writeInt(4, age); writer.writeString(5, gender); }
Load More ...