Tanzu Gemfire アプリケーションのモダナイゼーション

VMware Tanzu GemFire を知ろうシリーズ Part 1: Gemfireのご紹介と機能性

本シリーズでは、VMware Tanzu Data Serviceの1製品である「VMware Tanzu GemFire」について4回の連載となります。
第一回:GemFireのご紹介と機能性
第二回:Gemfireを仮想マシンへのインストールとREST APIによる操作
第三回:GemFire for Kubernetes のご紹介
第四回:Petclinicを使ったGemfire対応アプリケーション
本記事では、第一回である「GemFireのご紹介と機能性」について解説します。

 

Gemfireとは?

GemFireは、キャッシング、セッションステート、データストア、地理的に分散したミッションクリティカルなワークロードに対応する分散型インメモリキーバリューストアです。
Tanzu GemFireは、医療・サービス業などのホスピタリティ分野、ロジスティックス、チケッティング、保険、政府機関、そしてほとんどすべての金融サービス分野において、何百もの企業のお客様に採用されています。
「Gemfire」は数十年前にウォール街のトレーディング用の低遅延トランザクションデータエンジンとして初めて産業界で応用され長い歴史をかけて成熟してきた堅牢な技術です。
2015年、旧PivotalがApache Software Foundation(ASF)にApache Geodeインキュベートコミュニティの設立を提案し、2016年末にはトップレベルのApacheオープンソースプロジェクトとなりました。現在もVMware社内だけでなく外部のコミッターも含めた100名以上の貢献者が参加しています。

 

Gemfireの今後の注力領域

昨今の企業では、コンテナアプリケーションのユニバーサルコントロールプレーンとしてKubernetesを採用するケースが増えています。
Kubernetesを利用することで、開発者はデータベースシステムを他のアプリケーションスタックと同じように管理することができ、環境間での迅速で一貫したデプロイと管理という同じメリットを得ることができます。
GemfireはKubernetes上での動作のサポートと今後、様々な機能追加に力を入れていきます。VMware Tanzu GemFire for Kubernetesは既にGAとなっており本執筆時点ではRelease 1.0.1となっています。
VMware Tanzu GemFire for KubernetesのRelease 1.0.1は従来のVMware Tanzu GemFireの全ての機能はサポートしていません。
VMware Tanzu GemFireとの大きな機能差としては現時点でWANレプリケーションとSSLによる暗号化はサポートされていないことがあげられますが、今後のリリースにて順次対応していく予定となっています。リリースサイクルはおよそ6ヶ月単位でアップデートされます。

 

GemFire と Apache Geodeの違い

GemFireの解説に入る前に、オープンソース版のApache Geodeの違いを説明しておきます。
GemFireは、Apache Geodeのコードをベースにし、以下のようなエンタープライズ向けの機能を提供します。

・C#/C++/.NET開発者向けクライアントモジュールのサポート
・Tanzu Application Service向けの開発者向けセルフプラン機能と運用者向けDay2簡素化機能(VMware Tanzu GemFire for VMs ※旧Pivotal Cloud Cache)
・VMwareによるGemFireの製品サポート
上記の通り、コアの機能はApache Geodeと変わりはなくより大規模な環境での利用やマイクロサービス化を促進するような機能を提供しています。

 

GemFireとは?

GemFireは12 factor appの状態を保持する最も最善な方法を提供します。
12 factor appはクラウド上で動くアプリケーションが従うべき12個のベストプラクティスをまとめたものですが、その中の1つの要素として
アプリケーションを1つもしくは複数のステートレスなプロセスとして実行することが定義されています。GemFireを使うことにより具体的に下記を実現できます。

・アプリケーションはステートレスを保持:アプリケーションの状態を回復力の高い分散型インメモリ・データベースに保存する
・キャッシュとアプリケーションは必要に応じて独立してスケールアウトが可能:効率的なキャッシュ利用を可能とする
・HTTPセッションの状態を透過的にキャッシュ:ユーザの接続が別のサーバや基盤に移動しても継続したデータアクセスを可能とする
・アプリケーションデータの保存:アプリケーションデータはどこでもメモリ速度で利用でき、ディスク永続化による信頼性ももったアプリケーションとして動作する

 

GemFireの必要性

これまでGemFireで導入されたお客様での利用パターンを少しご紹介します。

・ウェブサイトのフロントページ

一般的なランディングページやホームページでは、表示に必要なデータを取得するためにいくつかのデータベースアクセスを何十回も呼び出すケースがあります。これらのデータの多くは比較的静的なものであるため、バッチ等で事前に計算し、キャッシュに保存することができます。
例えば、保険のアプリケーションでは被保険者の情報であるポリシー、手続き、補償内容などは比較的変更は少なくキャッシングには最適です。これにより、お客様がサイトにアクセスした時の起動時間は大幅に短縮され、顧客満足度につながります。また、バックエンドへの負荷も軽減されます。

・ショッピングカードアプリケーション

ショッピングカートのアプリケーションではユーザが買い物の途中でログアウトしてもセッションの状態を保持し次回のログイン時のために保持することが求められます。スティッキーセッションやアプリケーションサーバ、バックエンドDBでのセッション状態の保持では、ロードバランサーの設定追加、アプリケーションサーバの障害時、スパイクアクセス時の拡張性等での課題がでてきます。
GemFireによるウェブ セッション情報のキャッシング機能によりアプリケーションサーバに依存せずステートレスなアプリケーションとして動作させることができます。スパイクアクセス時もGemFireは毎秒数百万といった同時アクセスにも容易にスケールアウトが可能です。

・強い一貫性を必要とするアプリケーション

 強い一貫性を必要とするアプリケーションの例としては、銀行業務、請求書作成、保険、在庫管理、物流、オンライン電子取引等の業務で使われるアプリケーションです。これらのアプリケーションでは、更新が多いという性質上正確な最新データで動作することが求められます。このケースではキャッシュと同じ順序でバックエンドのデータストアに更新される必要があります。
GemFireではキャッシュと同じ順序でバックエンドのデータストアに更新できるインラインキャッシング機能をサポートしています。

 

VMware Tanzu GemFireの製品ラインナップ

VMware Tanzu GemFireは下記3つのディストリビューションを用意しています。

 

GemFireの構成要素

GemFireを稼働させるためのいくつかの要素について説明していきます。
GemFireではロケータ、サーバ、リージョンという3つの重要な機能を提供しています。

・Locator:GemFireのコーディネーターとして機能します。分散システム内のサーバーを追跡し、サーバー間のロードバランシングも行います。
・Cache Server:保存やクエリを行う予定のデータを実際に保持します。一般的には、いくつかのサーバをスケールアウトして冗長性を持たせ、分散システムの容量を増やすことになります。
・Region:複数のサーバに分散してデータを保存するためのネームスペースです。リージョンごとに、永続性やデータレプリケーションに関するルールを定義することができます。

 

GemFireのCache ServerとRegionの関係

Regionは、GemFireにとって最も重要な要素の1つです。データを保存したりクエリを実行しようとするとき、Cache Serverは抽象化されているので、Regionを指定するだけで済みます。
Regionへの問い合わせは、以下のようなSQLライクなコマンド言語を使って行うことができます。

SELECT entry.value FROM /exampleRegion.entries entry WHERE entry.key=’mykey’

Regionの種類によっては、データをCache Server間で分割したり、多数のCache Serverに複製したりすることができます。また、Regionのデータをディスクに保存するように設定することもできます。
これらの詳細は、クエリや保存の際には見えませんが、データストアをどのように設定するかを決める際には重要です。

GemFireでは、いくつかの異なるRegionタイプがあります。Regionを作成すると、クラスタ内の既存のすべてのサーバに自動的に追加されます。
その内、よく使われる2つのRegionタイプについて解説します。

PARTITION – システム内の様々なCache Server間でデータを分割し、各Cache ServerがRegionデータの一部のみを保存するようにします。また、システム内のデータのコピーの数を設定することができます。
Partitioned Regionは推奨されるデフォルトです。読み書きや更新が多いワークロードには、Partitioned Regionを推奨しています。
下記は人々のプロフィールや投稿を保存するソーシャル・ネットワーキング・アプリケーションをGemFireでキャッシングする例をイメージしたものです。

 

REPLICATE – Regionの完全なコピーがすべてのCache Serverに保存されます。データは通常、メモリに保存されるので、これによりシステムの冗長性を確保できます。データがクラスターの複数のノードに保存されるので、(メモリに)素早くアクセスできますが、レベルの高い冗長性が得られます。
多対多のデータリレーションシップや読み込みが多く、更新・書き込みが少ないデータには、REPLICATE regionを使用します。
下記はソーシャルネットワークのデータが複製された地域の3つのサーバーに保存される様子を示しています。

その他にも、パーティションと似ていますが、各サーバーがデータセットのパーティションをローカルディスクに保存するRegion Typeなどがあります。
メモリに収まりきらないほどのデータがある場合や、サーバーが故障した際に永続性という安全性を確保したい場合に有効です。Region Typeの詳細は公式ドキュメントをご参照ください。

 

自分のPCにGemFireをインストールして試してみよう

HomebrewがインストールされたMAC OS Xを使用している場合、セットアップはとても簡単です。それ以外の環境の場合は、公式ドキュメントに記載されているセットアップ手順を参照してください。
以下では自分のローカルMac OSにGemFireをインストールしローカルにCache Serverを立ててデータを格納しそのデータを確認するまでのステップを紹介します。

Mac OSでは、Homebrewを使ってGemFireをインストールします。下記のコマンドでGemFireをインストールします。

$ brew tap pivotal/tap && brew install gemfire

GemFireはログなどのデータを保存する場所が必要で、ディレクトリを作ってcdで作成したディレクトリに移動してください。

$ mkdir ~/workspace/gemfire
$ cd ~/workspace/gemfire/

下記コマンドでGemFire shellを起動します。

$ gfsh

gfshが正常に立ち上がったら、最初にLocatorをセットアップします。

gfsh> start locator --name=locator1

次にGimFireのモニタリングツールのPulseを起動します。

gfsh> start pulse

Pulseがブラウザで起動されるのでPulseにログインします(ユーザー名:admin パスワード:admin)。Pulseで構築した分散型システムをモニタリングすることができます。

次はデータを保持するためにいくつかのCache Serverを作成します。

gfsh> start server --name=server1 --server-port=40405
gfsh> start server --name=server2 --server-port=40406

次に、異なるタイプのRegion TYPE、REPLICATEとPARTITIONをそれぞれ作成します。

gfsh> create region --name=replicated --type=REPLICATE
gfsh> create region --name=partitioned --type=PARTITION

これでGemFireが稼働しました。まずは各リージョンにデータを入れて、どのように動作するかを確認してみましょう。
先ずはregion replicatedにデータを挿入

gfsh> put --key=best_food --value=Bread --region=replicated

Pulseを見ると、両方のサーバーにREPLICATEされたregionのエントリがあることがわかります。
次にregion partitionedにデータを挿入

gfsh> put --key=best_fruit --value=Apple --region=partitioned

PARTITIONされたregionにデータを追加すると、システム内の1つのサーバーにしか保存されていないことがわかります。

そして、データを取得するために、SQLのようなselectクエリを発行してみます。試しにregion partitionedに挿入したデータを表示するクエリを実行します。

gfsh> query --query="SELECT entry.value FROM /partitioned.entries entry WHERE key='best_fruit'"
Result : true
Limit  : 100
Rows   : 1

Result
------
Apple

データが表示されました。

以上、GemFireシェルの使い方を簡単にご紹介しましたが、次回以降の連載ではGemFireのキャッシング機能をSpring Bootで簡単に利用するサンプルアプリケーションをご紹介します。

まとめ

VMware Tanzu GemFireはこれまで金融サービスをはじめとした厳しいアプリケーション要件で成熟してきた堅牢な技術です。
Kubernetes基盤上での展開もサポートされたことにより、マイクロサービス・アーキテクチャーをより推進していく上で活用の場が広がってくると予想されます。
今後様々な機能追加がなされてきますので是非GemFireをはじめとするTanzu Data Serviceソリューションにご期待ください。