Apache Geodeで学ぶ!
インメモリーデータグリッド
2018.02.17 Sat.
HACKER TACKLE ハカタクル?
#hackt
自己紹介
山河 征紀
ウルシステムズ株式会社
マネージングコンサルタント
{
“分野”:”金融系”
“得技”:[“分散処理”,
“インメモリー処理”]
“趣味”:”マラソン”
}
1
本日のトーク
microservices – application databases Command Query Responsibility Segregation
2
マイクロサービス、CQRSで使える
NoSQLデータベース「Apache Geode」
よくあるRDB中心のアーキテクチャ
Part 1
データベース、使ってますか?
• データの内容を確認する場合、ものすごく便利
• ただし、アプリケーションから使う場合は・・・
4
JVM
アプリケーション
JDBC
リレーショナルデータモデル
オブジェクト インピーダンス
ミスマッチ
オブジェクト vs リレーショナルデータモデル
様々なO/Rマッパーの登場
• O/Rマッパーを使用することでデータモデルの差異を吸収して煩わしい作業が不要に
5
JVM
アプリケーション
JDBC
リレーショナルデータモデル
オブジェクト
O/R
マッパー
先入観?そもそもRDBいらなくないか?
• 使いたいのはオブジェクト、RDBに保存したいわけではない
• RDBは昔からあったから使っているだけ?
6
JVM
アプリケーション
JDBC
リレーショナルデータモデル
オブジェクト
O/R
マッパー
??
?
??
?
例えばこんなことができれば・・・
7
メモリー中のオブジェクトの共有
オブジェクトへのトランザクション処理
オブジェクトへのクエリー
非同期イベント処理
これが出来るのがApache Geode
8
Apache Geodeとは?
Part 2
Apache Geodeとは?
10
インメモリー
データグリッド製品
主要なインメモリーデータグリッド製品
インメモリーデータグリッドとは?
• 複数のサーバーを束ねて、一つの仮想的なメモリー空間を作り出す技術
巨大なメモリー空間
11
Geodeの特徴
12
超高速インメモリー処理
高可用性
書き込み処理のスケールアウト
トランザクション処理
1
2
3
4
サーバ
JVM
アプリケーション
RDB
サーバ
サーバ
JVM
JVM
アプリケーション
アプリケーション
インメモリー
データグリッド
サーバ
JVM
アプリケーション
特徴①超高速インメモリー処理:
大事なのは、どの部分のメモリーを使うのか?
• RDBでもメモリーを使用して処理を高速化している
• インメモリーデータグリッドはアプリケーションと同じメモリー空間を共有するため速い
13
メモリー
RDBの場合 インメモリーデータグリッドの場合
サーバ
JVM
アプリケーション
RDB
サーバ
サーバ
JVM
JVM
アプリケーション
アプリケーション
インメモリー
データグリッド
サーバ
JVM
アプリケーション
特徴①超高速インメモリー処理:
やりたいのはO/Rマッピングでなくオブジェクトの共有では?
• RDBではJavaとRDBの間でO/Rマッピングが必要
• アプリケーションが使用するデータはKey-Value形式でオブジェクトのまま保持
14
RDBの場合 インメモリーデータグリッドの場合
特徴①超高速インメモリー処理:
メモリーによる処理が速いはご存知の通り
• RDBと比較して1000倍のスループット
データ参照先 スループット
インメモリーデータグリッド
(同一JVM)
1,103,347 TPS
インメモリーデータグリッド
(別JVM)
2,617 TPS
RDB 1,100 TPS
400倍
1000倍
データ参照時スループット
15
特徴②高可用性:
メモリーといえど高可用性を実現できる
• インメモリーデータグリッドは、データを各サーバーのメモリー上に分散保持してくれる
データB
コピー
Apache Geodeクラスター
データA
コピー
データA
データB
16
特徴②高可用性:
メモリーといえど高可用性を実現できる
• インメモリーデータグリッドは、データを各サーバーのメモリー上に分散保持してくれる
データB
コピー
Apache Geodeクラスター
データA
コピー
データA
データB
17
Cache cache = new CacheFactory()
.set("cache-xml-file", “cache.xml").create();
Region<Integer, Employee> region = cache.getRegion(“Employee");
Integer key = 1;
Employee employee = new Employee(…);
// データ登録
region.put(key, employee);
// データ取得
Employee value = region.get(key);
// データ削除
region.remove(key);
特徴②高可用性:
APから見た使い方も簡単
• java.util.Mapを使用してる感覚でデータが分散される
• APからはクラスター、冗長化を意識する必要はない
18
特徴③書き込み処理のスケールアウト:
P2Pアーキテクチャー
• データ読み込みのみならず、サービスの呼び出し頻度により書き込みも増減可能
• ノード数に比例して処理性能を高めることができる
・・・データベース
・・・
RDBの場合 Apache Geodeの場合
サービス
業務処理
キャッ
シュ
サービス
業務処理
キャッ
シュ
サービス
業務処理
キャッ
シュ
サービス
業務処理 Apache
Geode
サービス
業務処理 Apache
Geode
サービス
業務処理 Apache
Geode
スケール
アウト
19
特徴④トランザクション処理:
RDBと同じようにトランザクション処理もできる
• RDBと同じようにトランザクション処理ができる
• ただし、楽観ロックとなるため、競合が発生した場合は例外となる
20
CacheTransactionManager txManager =
cache.getCacheTransactionManager();
try {
// トランザクション開始
txManager.begin();
regionA.put("KEY", value1);
regionB.put("KEY", value2);
// コミット
txManager.commit();
} catch (Exception e) {
// ロールバック
txManager.rollback();
throw e;
}
リージョンA
リージョンB
成功
失敗
トランザクション
リージョンAの処理も
ロールバックできる
マイクロサービスにおける
Apache Geodeの使い方
- Command Query Responsibility Segregation -
Part 3
読み込みと書き込みの責務を分けて
独立してスケールアウトもできるようにしたい
• Apache Geodeならデータストアも簡単に分離できる
22
注文を
登録する
データ連携
Command
Model
Query
Model
Apache
Geode
Apache
Geode
注文を
検索する
注文を
登録する
Model
Database
注文を
検索する
一般的なデータアクセス
CQRSのデータアクセス
(Apache Geode)
JVM
JVM
リアルタイムキャッシュ
• Apache Geodeではメモリー中のデータを管理するサーバーとクライアントがある
• クライアントはサーバーから必要なデータのみを取得しリアルタイムでキャッシュする
• QueryModelではキャッシュといえど常に最新のデータがメモリー中に存在する
23
注文を
登録する
Command
Model
Query
Model
Apache Geode
(DataServer)
Apache Geode
(Client)
注文を
検索する
CQRSのデータアクセス
(Apache Geode)
リアルタイム
キャッシュ
変更内容はサーバーから
Push更新される
メモリー
参照
Object Query Language(OQL)(1)
• データを取得する際はキーを指定した取得が基本となるが、クライアントキャッシュに対してク
エリーを実行することも出来る
24
public class Order {
private int ordreId;
private String customerId;
private String productCd;
private Date orderDate;
private int amount;
private double price;
・・・
・・・
}
SELECT
*
FROM
/Order ord
WHERE
ord.amount >= 500
JVM
Query
Model
Apache Geode
(Client)
注文を
検索する メモリー
参照
500以上の注文データを取得する場合のクエリー クエリー対象のオブジェクト
Object Query Language(OQL)(2)
• データ量が多い場合はサーバーに対してパラレルクエリー実行する
25
JVM
Query
Model
注文を
検索する
Apache Geodeクラスター
Apache Geode
(DataServer)
Apache Geode
(DataServer)
Apache Geode
(DataServer)
・・・
マイクロサービスにおける
Apache Geodeの使い方
- Orchestration and Choreography -
Part 4
サービス間を疎結合にしたい
• Apache Geodeなら非同期イベント処理が簡単にできる
27
注文
サービス
注文を
登録する
取引所へ
発注
注文受付
メール送信
注文
イベント
注文を
登録する
取引所へ
発注
注文受付
メール送信
オーケストレーション型のサービス
Pub/Sub型でのサービス連携
(Apache Geode)
Apache
Geode
Pub/SubもできるNoSQLデータベース
• データをApache Geodeに保持しつつ、非同期イベントをSubscriberへ配信する
• Subscriberは事前に登録した条件に合致するイベントのみ取得する
28
JVM
注文を
登録する
Command
Model
Apache Geode
(DataServer)
注文
イベント
取引所へ
発注
注文受付
メール送信
・・・
イベントは事前に登
録したもののみ取得
される
取得対象
イベント登録
サービス
(Subscriber)
イベント処理のコード例
• クライアント(Subscriber)は取得したいイベントの条件と、イベントが発生した場合の処
理を実装する
29
Region<String, Order> region =
cache.getRegion(“Order");
// 取得対象イベントのキーを正規表現で指定
region.registerInterestRegex(".*");
public class OrderListener
implements CacheListener<String, Order> {
@Override
public void afterCreate(
EntryEvent<String, Order> event) {
// 登録、追加、削除等のイベント種別毎に実装できる
}
@Override
public void afterUpdate(
EntryEvent<String, Order> event) {
// 任意のイベント処理、変更前後のデータが取得できる
}
…
全ての注文イベントを取得する場合 イベント処理の実装
Continuous Query
• Continuous Queryを使うことでキー以外の条件でイベント処理できる
• Continuous QueryではOQLを登録しておき、結果が変更となった場合にイベントが取得
出来る
30
Apache Geode
(DataServer)
注文
イベント
取引所へ
発注
注文受付
メール送信
・・・
サービス
(Subscriber)
SELECT * FROM /Order ord
WHERE ord.productCd <> 'ABC'
特定銘柄の場合のみメール送信しない
Continuous
Query
全イベント
取得
非同期イベントでQueryに最適化したデータを作る
• 検索しづらい場合は、非同期イベントでクエリーに最適化したデータを作る
• パフォーマンス向上のためキーで検索できるようにする
• JOINを不要とするため非正規化したデータモデルを作る
• 集計処理、等
31
JVM
JVM
注文を
登録する
Command
Model
Query
Model
Apache Geode
Apache Geode
(Query最適化データ)
注文を
検索する メモリー
参照
注文
イベント
Queryに
最適化
Apache Geodeファミリー
Part 5
ビッグデータリアルタイム分析ならSnappyData!
• Apache Sparkとインメモリーデータベースを統合し、独自機能を付加
• 分散インメモリーデータベースの足回りにApache Geodeを使用
分散インメモリー
データベース
独自付加機能
カラム型データベース
予測分析処理
ロー型データベース
トランザクション
分散処理
フレームワーク
バッチ処理
分析処理
ストリーム処理
33
Powerd by
Apache Geodeサマリー
Part 6
Apache Geodeサマリー
35
インメモリーで速い
読み込み、書き込みともスケールアウトできる
柔軟なイベント処理ができる
マイクロサービスやCQRSで使いやすい
お問合せ先
mailto: info@ulsystems.co.jp
http://www.ulsystems.co.jp
36

20180217 hackertackle geode