マイクロサービスにおける
Apache Geodeの効果的な使い方
マイクロサービス時代では
データ管理システムは適材適所で使おう!
0
RDB一辺倒な
あなたに贈る
自己紹介
山河 征紀
ウルシステムズ株式会社
コンサルタント
{
“分野” : ”金融系(証券・FX)”,
“得技” : [“インメモリー処理”,
“分散処理”],
“その他” : ”Apache Geodeコミッター”
}
1
本日お伝えしたいテーマ
2
RDB以外の選択肢としてのApache Geodeを
あなたの引き出しに追加する方法
証券業界・FX業界における
よくある要求
3
証券業界・FX業界におけるよくある要求
4
◼パフォーマンス
⚫ 低レイテンシー/高スループット
⚫ ユーザー数増加に伴うスケールアウト
⚫ スパイクアクセス
◼対障害性
⚫ ゼロダウンタイム
⚫ 短時間でのフェイルオーバー
⚫ DR
高性能データベース、
高性能サーバーの使用
別の解決策はないか…
5
高性能データベース、
高性能サーバーの使用
選択肢の1つとしてのApache Geode
6
よくある現行システムの状態
7
◼多くの場合、高性能DBを最大限に活かすために、様々なシ
ステムのデータが1つのデータに集約されている
高性能データベース
・・・
マイクロサービス的なアプローチ
8
◼性能にこだわりたい機能は決まっている
◼その部分のみ切り出し、高可用性を満たしつつ高速化出来
ないか?
いきなりこうは
できないけれど…
一部だけを切り出す
のはやりやすい!
RDB以外の選択肢としての
Apache Geode
9
Apache Geodeとは?
10
インメモリー
データグリッド製品
RDBとは異なりメモリー内へのデータ保持を
ベースとするプロダクト
主要なインメモリーデータグリッド製品
インメモリーデータグリッドとは?
複数のサーバーのメモリーを、仮想的に統合して一つの巨大
なメモリー空間を作り出す技術
巨大なメモリー空間
11
Apache GeodeはRDBとどう違うのか?
RDB Apache Geode
データ
モデル
リレーショナルモデル オブジェクトモデル
データ
格納場所
ディスク メモリー
データ
アクセス
SELECT * FROM XXX …
INSERT INTO XXX VALUES …
Object = GET(Key)
PUT(Key, Object)
SQL Key指定アクセス
※メモリーに
キャッシュして
高速化
※必要に応じ
てディスク
へ永続化 12
クラスター内でデータを分散
Apache Geodeは、データを各サーバーのメモリー上に分散
して保持してくれる
データB
コピー
Geodeクラスター
データA
コピー
データA
データB
13
クラスター内でデータを分散
Apache Geodeは、データを各サーバーのメモリー上に分散
して保持してくれる
データB
コピー
Geodeクラスター
データA
コピー
データA
データB
14
クラスター内でデータを分散
Apache Geodeは、データを各サーバーのメモリー上に分散
して保持してくれる
データB
コピー
Geodeクラスター
データA
コピー
データA
データB
15
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);
使い方は簡単
java.util.Mapを使用してる感覚で使用が可能
16
P2Pアーキテクチャーによるスケーラビリティ
◼データ読み込みのみならず、書き込み処理もスケールアウ
トが可能。ノード数に比例して処理性能を高めることがで
きる
・・・
データベース
・・・
RDBの場合 Apache Geodeの場合
APP
業務処理
キャッ
シュ
APP
業務処理
キャッ
シュ
APP
業務処理
キャッ
シュ
APP
業務処理
Apache
Geode
APP
業務処理
Apache
Geode
APP
業務処理
Apache
Geode
スケール
アウト
17
RDBとApache Geodeの違い
18
観点 RDB Apache Geode
重視している特性 一貫性
拡張性
可用性
拡張方法
スケールアップ または
データの水平分割
スケールアウト
データ参照方法 SQL キーによる問い合わせ
一貫性の維持 強い 緩い(RDBに比べると)
データモデル 関係モデル キー・バリューモデル
Apache Geodeのメリット
高速処理
大量のトランザクションを高速に処理できる
スケーラビリティ
ノードの追加に応じて巨大なメモリー空間を生み出せる
可用性
ノード単体の障害による影響がない
高信頼性
欧米の金融機関を中心にミッションクリティカル領域での利用実績多数
19
切り出したマイクロサービスへの
Apache Geodeの適用方法
20
切り出したサービスにおけるデータアクセスの仕分け
21
◼KVSが故のハイブリッド方式
※ただし、結果整合性が許されないケースはGeode参照(APPで頑張る)
APP
Apache
Geode
RDB
RDBへの
データ追加・更新
(非同期)
データ追加・
更新
データ参照
(シンプル)
(シンプルなデータ参照での)
キャッシュミス
データ参照
(複雑)
データ追加・更新 → Geode
データ参照
シンプル → Geode
複雑 → RDB
切り出したサービスでの
データアクセス
Apache Geodeのはじめ方
切り出したマイクロサービスへの
Apache Geodeの適用方法
22
Geodeにおける登場人物
23
Geodeクラスター
ロケーター
キャッシュ
サーバー
キャッシュ
サーバー
キャッシュ
サーバー
キャッシュ
サーバー
キャッシュ
サーバー
クライアント リージョン
リージョン
リージョン
リージョン
リージョン
キャッシュサーバー メモリー上のデータを管理するためのプロセス
ロケーター クラスターを管理するためのプロセス
Geodeクラスター作成
24
◼ロケーター起動
⚫ gfsh> start locator
◼キャッシュサーバー起動
⚫ gfsh> start server --locators=localhost[10334]
✓ポイントはlocatorを指定すること
✓これでクラスターに参加できる
Geodeクラスター作成
25
◼Pulseによるクラスターの監視
クラスター作成後にやること
26
◼リージョン作成
⚫ gfsh> create region --name=OrderRegion --type=REPLICATE
◼Index作成
⚫ gfsh> create index --name=orderStatusIndex
--region=/OrderRegion
--expression=status
クラスター作成後にやること
27
◼DataBrowserによるリージョン中のデータ確認
Apache Geode 第1の壁
切り出したマイクロサービスへの
Apache Geodeの適用方法
28
KVSの壁
29
1. キー設計
2. レプリケート or パーティション
3. パーティショニング
KVSの壁:1. キー設計
30
◼参照優先で検討
◼アクセスパターンを整理
https://speakerdeck.com/mogamin/rdbnoy-haanatanisong-ru-kvsmoderingufalsefalseuhauwogong-
kai-aws-dynamodb-azurecosmosdbdefalsekvsshe-ji-hakousiyou
KVSの壁:2. レプリケート or パーティション
◼データの特性によってレプリケーションとパーティション
を使い分ける
パーティション
レプリケーション
すべてのマシンで同一のデータを保持する 何れかのマシンにデータが存在する 31
マスターデータ
(顧客情報、商品情報等)
トランザクションデータ
(取引情報、予約情報等)
• 割と固定的
• データ数が急激に増えないもの
• 更新が少なく参照が多い
• データの一部が変動する
• 更新処理が多い
• 日毎にデータが増加するもの
KVSの壁:3. パーティショニング
32
◼データの分散配置するノードを最適化するオプション
⚫ PartitionResolver
⚫ Co-Location
PartitionResolver
◼PartitionResolverを使うことで、パーティションリージョ
ンのデータ配置を意図的に制御することが出来る
PartitionResolverを使わない場合 PartitionResolverを使う場合
データ数が均等になるように配置される 指定したResolverの内容に応じて、
データは同一ノードに配置される 33
Co-Location
◼Co-Locationにより複数のリージョンを関連付け、同一
ノード上にユーザの意図したデータを配置することが出来る
Co-Locationを使わない場合 Co-Locationを使う場合
34
リージョン間の関連はないため、
ユーザーと注文はランダムに配置される
関連するリージョンのデータは
同一ノード上に配置される
なぜパーティショニングが必要なのか?
◼デフォルトのパーティションリージョンのデータ配置では
ノード間の通信が発生してしまう
太郎
次郎
ECサイトでユーザーマスターと過去の注文履歴をチェックしつつ、注文処理を行う場合
花子 ×3個
太郎 ×100個
次郎
太郎(港区)
次郎(中央区)
花子(目黒区)
次郎 ×20冊
×5個
次郎 ×3冊
APP#1
APP#2
注
文
注
文
ユ
ー
ザ
ー
ユ
ー
ザ
ー
35
なぜパーティショニングが必要なのか?
◼デフォルトのパーティションリージョンのデータ配置では
ノード間の通信が発生してしまう
注文処理
注文処理
×8本
×5個
太郎
次郎
太郎の注文履歴
次郎の注文履歴
届け先: 港区
届け先: 中央区
ECサイトでユーザーマスターと過去の注文履歴をチェックしつつ、注文処理を行う場合
花子 ×3個
太郎 ×100個
次郎
太郎(港区)
次郎(中央区)
花子(目黒区)
次郎 ×20冊
×5個
次郎 ×3冊
APP#1
APP#2
注
文
注
文
ユ
ー
ザ
ー
ユ
ー
ザ
ー
36
なぜパーティショニングが必要なのか?
◼カスタムパーティショニングを使用することでノード間の
通信が削減できインメモリー処理が出来る
注文処理
注文処理
×8本
×5個
太郎
次郎
太郎の注文履歴
次郎の注文履歴
届け先: 港区
届け先: 中央区
花子 ×3個
太郎 ×100個
次郎
次郎 ×20冊
×5個
注
文
注
文
ユ
ー
ザ
ー
ユ
ー
ザ
ー
太郎(港区)
花子(目黒区)
次郎(中央区)
次郎 ×3冊
注文者でパーティション、注文リージョンとユーザーリージョンをCo-Location
APP#1
APP#2
37
これでKVSが使えるようになりました!
38
Apache Geode 第2の壁
切り出したマイクロサービスへの
Apache Geodeの適用方法
39
永続化の壁
40
◼複雑な検索向けのRDB永続化
⚫ リージョンデータをRDBにも登録
◼メモリー上限
⚫ RDBのデータをもとにメモリー上のデータを復元
永続化の壁:RDB連携
41
◼Apache GeodeのRDB連携機能を活用
⚫ CacheWriter(同期/非同期)
⚫ CacheLoader
RDB
リージョン
参照
(Read A)
CacheLoaderによる
リードスル―
キャッシング
A B
C
C
A B
クライアント
RDBMS
リージョン
追加
(Write A)
CacheWriterによる
ライトスルー
キャッシング/
ライトビハインド
キャッシング
A B
C
C
A B
クライアント
CacheWriter
42
◼メモリー上のデータ変更を自動でRDBへ保存
⚫ 同期の場合
⚫ 非同期の場合
RDBMS
リージョン
①
追加リクエスト
(Write A)
②
CacheWriterによる
RDB書き込み
A B
C
C
A B
クライアント
③
メモリー上の
データの確定
RDBMS
リージョン
①
追加リクエスト
(Write A)
③
CacheWriterによる
RDB書き込み
(キューにある順)
A B
C
C
A B
クライアント
②
メモリー上の
データの確定
キュー
CacheLoader
43
◼キャッシュミスが発生した場合に自動的にRDBから読み取り
⚫ APPが意識するのはリージョンのみ
⚫ あたかもメモリー上にあったかのように振る舞う
※メモリ不足対策でExpire/Evictionと一緒に使うケースが多い
RDB
リージョン
参照
(Read A)
CacheLoaderによる
リードスル―
キャッシング
A B
C
C
A B
クライアント
RDB連携の設定
44
◼データソース作成
⚫ gfsh> create data-source
--name=mysql_data_source
--url=“jdbc:mysql://localhost/geode_db“
--username=myuser
--password=mypassword
◼リージョン <-> RDBマッピング作成
⚫ gfsh> create jdbc-mapping
--data-source=mysql_data_source
--region=Order
--table=order
--pdx-name=geode.examples.Order
--catalog=geode_db
--id=orderId
これで実用レベルでGeodeが使えるようになりました
45
CQRS
46
CacheWriterを使えば簡単にCQRSができるのでは?
47
◼参照に特化したモデルにして、参照も高速化!
注文を
登録する
データ連携
Command
Model
Query
Model
Apache
Geode
Apache
Geode
注文を
検索する
注文を
登録する
Model Databas
e
注文を
検索する
一般的なデータアクセス
CQRSのデータアクセス
(Apache Geode)
CacheWriterを独自実装し
QueryModelに変換して別のGeode
リージョンへデータ連携する
Pub/SubによるCQRSの実現
◼Commandモデルのデータ更新のイベントを基点に
QueryModelをアップデートしメモリー上のモデルを更新
48
注文を
登録する
データ連携
CacheWriter
Command
Model
Query
Model
Apache
Geode
Apache
Geode
注文を
検索する
CacheWriterによるCQRS
注文を
登録する
更新データ
イベント
Publish
Command
Model
Query
Model
Apache
Geode
Apache
Geode
注文を
検索する
Pub/SubによるCQRS
QueryModelで必要なデータの更新
をSubscribeし更新データイベント
をリアルタイムに取得し
QueryModelに変換
データ更新
イベント
Subscribe
Object Query Language(OQL)
◼QueryModelではOQLを有効活用
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
Query
Model Apache Geode
注文を
検索する メモリー
参照のため
高速
500以上の注文データを取得する場合の
クエリー クエリー対象のオブジェクト
49
まとめ
50
まとめ
51
Apache Geodeは特定のマイクロサービスを
高速化する際の1つの手段
RDBとのハイブリッド使用で様々なデータアクセスに対応
KVSではキー設計&パーティショニングが重要
高速化のためにRDBと非同期で連携
CQRSパターンでデータ参照を最適化
52
お問合せ先
mailto: info@ulsystems.co.jp
http://www.ulsystems.co.jp

20211118 dbts2021 マイクロサービスにおけるApache Geodeの効果的な使い方