Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Oracle Coherence勉強会

12,186 views

Published on

Published in: Technology
  • Be the first to comment

Oracle Coherence勉強会

  1. 1. Oracle Coherence勉強会<br />2011/02/22 @making<br />
  2. 2. Contents<br />概要説明<br />Oracle Coherenceとは<br />分散キャッシュを用いたアーキテクチャ例<br />キャッシュの仕組み<br />ハンズオン<br />Coherenceインストール<br />Oracle Coherenceにアクセス<br />Coherence APIを使用してJavaからアクセス<br />Java Beansのキャッシュ<br />キャッシュデータの検索・集計処理<br />CohQL (Coherence Query Language)<br />
  3. 3. 概要説明<br />
  4. 4. Oracle Coherenceとは<br />クライアント<br />インメモリデータグリッド<br />複数サーバに渡る分散キャッシュ<br />キャッシュ以外の機能<br />クエリ機能<br />イベントリスナ機能<br />データ処理のパラレル実行機能<br />Javaベース<br />実体はJavaクラスライブラリ<br />coherence.jarがあれば動く<br />クライアントはJava/C++/.NET<br />利用目的<br />スケーラブルなシステム構築<br />DBボトルネックの解消<br />類似製品<br />IBM WebSphereeXtremeScale (IBM)<br />Gemstone Gemfire (SpringSource)<br />EhCache (Teracotta)<br />Coherenceデータグリッド<br />WEBサービス<br />データベース<br />
  5. 5. 分散キャッシュ<br />複数のJVMでクラスタ形成<br />データを分散して配置<br />透過的なデータアクセス<br />クライアント<br />B<br />C<br />A<br />JVM<br />JVM<br />JVM<br />A<br />B<br />C<br />
  6. 6. Map型インタフェース<br />java.util.Mapを継承したkey/valueインタフェース<br />NamedCachecache = CacheFactory.getCache("person");<br />Person p1 = (Person) cache.get(key1);<br />cache.put(key2, p2);<br />
  7. 7. データグリッドを用いる場合の基本的なアーキテクチャ<br />従来型<br />データグリッド<br />クライアント<br />クライアント<br />APサーバ<br />APサーバ<br />APサーバ<br />APサーバ<br />個別データ<br />個別データ<br />個別データ<br />個別データ<br />共通データ<br />共通データ<br />キャッシュサーバ<br />キャッシュサーバ<br />キャッシュサーバ<br />共通データ<br />データベース<br />データベース<br />永続化データ<br />永続化データ<br />
  8. 8. 基本的な適用パターン例<br />大量のマスタデータのキャッシュする<br />大量のHTTPセッションを扱う<br />
  9. 9. パターン1:大量のマスタデータのキャッシュ<br />従来<br />APサーバ<br />APサーバ<br />マスタデータ<br />マスタデータ<br />データ読み込み<br />データ読み込み<br />起動時に全部読み込む<br />データベース<br />
  10. 10. パターン1:大量のマスタデータのキャッシュ<br />データグリッド<br />APサーバ<br />APサーバ<br />マスタデータ<br />マスタデータ<br />データ読み込み<br />データ読み込み<br />必要な時に読み込む<br />キャッシュサーバ<br />キャッシュサーバ<br />マスタデータ<br />起動時に全部読み込む<br />データベース<br />データ読み込み<br />
  11. 11. パターン1:大量のマスタデータのキャッシュ<br />データグリッド<br />APサーバ<br />APサーバ<br />マスタデータ<br />マスタデータ<br />データ読み込み<br />データ読み込み<br />キャッシュサーバ<br />キャッシュサーバ<br />マスタデータ<br />データが増えたら…<br />データベース<br />データ読み込み<br />
  12. 12. パターン1:大量のマスタデータのキャッシュ<br />データグリッド<br />APサーバ<br />APサーバ<br />マスタデータ<br />マスタデータ<br />スケールアウトで<br />容量増加<br />データ読み込み<br />データ読み込み<br />キャッシュサーバ<br />キャッシュサーバ<br />キャッシュサーバ<br />マスタデータ<br />データベース<br />データ読み込み<br />
  13. 13. パターン2:大量のHTTPセッション<br />従来<br />メモリはスケールしない<br />セッションレプリケーションがネックであまりスケールしない<br />APサーバ<br />APサーバ<br />スケール小<br />セッション管理<br />セッション管理<br />レプリケーション<br />
  14. 14. パターン2:大量のHTTPセッション<br />データグリッド<br />APサーバ<br />APサーバ<br />スケール大<br />キャッシュサーバ<br />キャッシュサーバ<br />マスタデータ<br />
  15. 15. パターン2:大量のHTTPセッション<br />データグリッド<br />APサーバ<br />APサーバ<br />スケール大<br />キャッシュサーバ<br />キャッシュサーバ<br />キャッシュサーバ<br />マスタデータ<br />
  16. 16. パターン2:大量のHTTPセッション<br />データグリッド<br />APサーバ<br />APサーバ<br />スケール大<br />キャッシュサーバ<br />キャッシュサーバ<br />キャッシュサーバ<br />フェールオーバ<br />マスタデータ<br />
  17. 17. Coherenceが提供するキャッシュ方式<br />レプリケーションキャッシュ<br />全てのキャッシュアイテムが全ノードに複製される<br />パーティションキャッシュ<br />複数のノードに分散してキャッシュする<br />ニアキャッシュ(次回)<br />二層混成キャッシュ(フロント:ローカルキャッシュ、バック:パーティションキャッシュ)<br />以降「ITアーキテクト Vol.22」の内容を改編して説明<br />
  18. 18. レプリケーションキャッシュ<br />全てのキャッシュアイテムがグリッド内のすべてのノードに複製される<br />->書き込み性能は設定次第(レプリケーションの同期をとるか、非同期にするか)<br />アプリケーションと同一のプロセス内にキャッシュ領域を作成<br />->読み込みは遅延時間0なので速い<br />
  19. 19. レプリケーションキャッシュの読み込み<br />読み取りはプロセス内で完結<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />アプリケーション<br />アプリケーション<br />アプリケーション<br />A<br />B<br />A<br />B<br />A<br />B<br />C<br />D<br />C<br />D<br />C<br />D<br />
  20. 20. レプリケーションキャッシュの書き込み<br />書き込みは他のノードへ<br />レプリケート<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />アプリケーション<br />アプリケーション<br />アプリケーション<br />A<br />B<br />A<br />B<br />A<br />B<br />C<br />D<br />C<br />D<br />C<br />D<br />
  21. 21. パーティションキャッシュ<br />各ノードに分散して保存<br />通常アプリケーションと別プロセス内にキャッシュ領域を作成する<br />読み込みはあるノードからネットワーク経由で行う<br />書き込みはプライマリデータとバックアップデータをそれぞれ別のノードにネットワーク経由で行う<br />バックアップ数は変更可能であるが1が推奨値<br />
  22. 22. パーティションキャッシュの読み込み<br />読み取りは1往復の<br />ネットワークアクセス<br />アプリケーション<br />アプリケーション<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />P<br />A<br />C<br />D<br />B<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  23. 23. パーティションキャッシュの書き込み<br />書き込みは2往復の<br />ネットワークアクセス<br />アプリケーション<br />アプリケーション<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />P<br />A<br />C<br />D<br />B<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  24. 24. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />P<br />A<br />C<br />D<br />B<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  25. 25. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />C<br />B<br />B<br />A<br />D<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  26. 26. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />バックアップが<br />プライマリに昇格<br />C<br />B<br />A<br />D<br />B<br />A<br />D<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  27. 27. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />バックアップが<br />プライマリに昇格<br />C<br />B<br />A<br />D<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  28. 28. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />プライマリから<br />バックアップを作成<br />C<br />B<br />A<br />D<br />C<br />B<br />D<br />A<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  29. 29. パーティションキャッシュのリカバリ<br />アプリケーション<br />アプリケーション<br />キャッシュノード2<br />キャッシュノード3<br />P<br />P<br />C<br />B<br />A<br />D<br />C<br />B<br />D<br />A<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  30. 30. パーティションキャッシュのノード追加<br />アプリケーション<br />アプリケーション<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />キャッシュノード4<br />P<br />P<br />P<br />P<br />A<br />C<br />D<br />B<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  31. 31. パーティションキャッシュのノード追加<br />アプリケーション<br />アプリケーション<br />再パーティショニング<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />キャッシュノード4<br />P<br />P<br />P<br />P<br />D<br />A<br />C<br />D<br />B<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  32. 32. パーティションキャッシュのノード追加<br />キャッシュ容量を<br />追加できる<br />アプリケーション<br />アプリケーション<br />キャッシュノード1<br />キャッシュノード2<br />キャッシュノード3<br />キャッシュノード4<br />P<br />P<br />P<br />P<br />D<br />A<br />C<br />B<br />A<br />C<br />D<br />B<br />B<br />B<br />B<br />B<br />P…プライマリデータ、B…バックアップデータ<br />
  33. 33. レプリケーションキャッシュとパーティションキャッシュの比較<br />
  34. 34. ハンズオンではパーティションキャッシュを使用します<br />
  35. 35. ハンズオン<br />
  36. 36. 資材<br />coherence-handsonフォルダで<br />mvneclipse:eclipse<br />要maven設定(proxy, Eclipseのクラスパス変数M2_REPO)<br />Eclipseからインポート<br />別テキストをベースに進める<br />
  37. 37. Oracle Coherenceインストール<br />http://www.oracle.com/technetwork/middleware/coherence/downloads/index.html<br />「Oracle Coherence for Java Version 3.6.1」をクリックしてダウンロードして展開<br />展開したディレクトリを環境変数COHERENCE_HOMEに設定<br />JAVA_HOMEが未設定の場合は設定<br />
  38. 38. キャッシュサーバー起動<br />%coherence_home%bincache-server.batを実行<br />
  39. 39. クラスタのメンバ情報<br />
  40. 40. プライベートクラスタ作成<br />同一ネットワーク上でCoherenceサーバを立ち上げると、デフォルト設定で同じマルチキャストアドレスとポートを使用するので、同一クラスタに参加してしまう<br />(回避策1)マルチキャストアドレス/ポートを変更<br />-Dtangosol.coherence.clusteraddress=224.0.0.7<br />-Dtangosol.coherence.clusterport=33333<br />(回避策2)TTLを0にする<br />-Dtangosol.coherence.ttl=0<br />↑のJVM起動オプションをcache-server.batやcoherence.batのjava_optsに設定<br />設定ファイルで設定することも可能<br />
  41. 41. 今回は<br />TTL=0の設定を設定ファイルに記述<br />クラスパス上にtangosol-coherence-override.xmlを作成し、%coherence_home%lib上に置く。<br />cache-server.batとcoherence.batのjavaコマンドの-cpを“%coherence_home%lib;%coherence_home%libcoherence.jar”に変更<br />
  42. 42. 設定内容<br />tangosol-coherence-override.xmlに以下の設定を記述<br /><coherence><br /><cluster-config><br /><multicast-listener><br /><!-- TTLの設定 --><br /><time-to-live>0</time-to-live><br /><!-- 既存のクラスタの確認をあきらめ新しいクラスタを開始するまでの時間 --><br /><join-timeout-milliseconds>1000</join-timeout-milliseconds><br /></multicast-listener><br /></cluster-config><br /></coherence><br /> <br />
  43. 43. キャッシュサーバーをもう一度起動<br />設定ファイルが上書きされていることを確認<br />TTL=0になっていることを確認<br />
  44. 44. コマンドラインからデータグリッドにアクセス<br />coherence.batを実行<br />Map (?): cache test<br />Map (test): put 1 One<br />Map (test): get 1<br />One<br />Map (test): put 2 Two<br />Map (test): list<br />1 = One<br />2 = Two<br />
  45. 45. Javaからデータグリッドにアクセス<br />新規のNamedCacheを作成<br />java.util.Mapを拡張しているので操作がわかりやすい<br />作成したNamedCacheへオブジェy九とのputとget<br />
  46. 46. 簡単なサンプル<br />packagehandson.coherence.lab3;<br /> <br />importcom.tangosol.net.CacheFactory;<br />importcom.tangosol.net.NamedCache;<br /> <br />publicclassMyFirstSample {<br /> <br />publicstaticvoid main(String[] args) {<br />NamedCachecache = CacheFactory.getCache("mycache");<br />cache.put("Name", "Taro Yamada");<br />System.out.println("Value in cache is " + cache.get("Name"));<br /> }<br /> <br />}<br /> <br />
  47. 47. Java Beansのキャッシュ<br />2種類の方式<br />java.io.Serializableインタフェースを実装する方法<br />Portable Object Format(POF)を実装する方法<br />POFはC++/.NET間でも利用可能な上、高速かつ低容量なシリアライゼーション機構<br />ただし、実装がやや面倒かつ、POF構成ファイルへの登録が必要<br />
  48. 48. SerializableとPOFの比較例<br />Coherenceを使う場合、POFを用いるのが推奨されている<br />
  49. 49. java.util.Serializableを実装する方法<br />hashCode/equalsを実装すること<br />EclipseでAlt+Shift+S -> H<br />デフォルトコンストラクタを作成すること<br />
  50. 50. POFを実装する方法<br />com.tangosol.io.pof.PortableObjectを実装する<br />java.util.Serializableの条件に加えて<br />readExternal(PofReader), writeExternal(PofWriter)を実装<br />@Override<br />publicvoidreadExternal(PofReaderreader) throwsIOException {<br />id = reader.readInt(0);<br />surname = reader.readString(1);<br />firstname = reader.readString(2);<br />address = reader.readString(3);<br />age = reader.readInt(4);<br />gender = reader.readString(5);<br /> }<br />@Override<br />publicvoidwriteExternal(PofWriterwriter) throwsIOException {<br />writer.writeInt(0, id);<br />writer.writeString(1, surname);<br />writer.writeString(2, firstname);<br />writer.writeString(3, address);<br />writer.writeInt(4, age);<br />writer.writeString(5, gender);<br /> }<br />
  51. 51. POF構成ファイルの設定<br />間に合いませんでしたm(_ _)m<br />口頭で説明します<br />
  52. 52. 検索集計処理<br />間に合いませんでしたm(_ _)m<br />口頭で説明します<br />
  53. 53. CohQL<br />間に合いませんでしたm(_ _)m<br />口頭で説明します<br />
  54. 54. 次回予定<br />キャッシュの構造(キャッシュトポロジ、バッキングマップ)<br />キャッシュデータの更新検知<br />エントリプロセッサによる複数キャッシュデータ同時並行処理<br />複合キーとデータアフィニティ<br />インボケーションサービスによる非同期処理<br />Spring連携<br />永続化層の実装(JPA/SpringJDBC連携)<br />
  55. 55. 参考書籍<br />ITアーキテクト Vol.22<br />Oracle Coherence入門(アスキー・メディアワークス)<br />

×