本シリーズでは、VMware Tanzu Data Serviceの1製品である「VMware Tanzu GemFire」について4回の連載となります。
第一回:GemFireのご紹介と機能性
第二回:Gemfireを仮想マシンへのインストールとREST APIによる操作
第三回:GemFire for Kubernetes のご紹介
第四回:Petclinicを使ったGemfire対応アプリケーション
本記事では、第2回である「Gemfireを仮想マシンへのインストールとREST APIによる操作」について解説します。
この記事では Gemfire を仮想マシン上に直接展開し、Gemfire が提供するキャッシュ機能を REST API で利用するサンプルを紹介します。
Tanzu Gemfire の導入方法は大きく3つあります。
- Kubernetes への導入
- OS上に直接展開する導入
- Cloud Foundry BOSH を使った導入
この記事では Ubuntu 20.04 上に展開をします。
インストール作業を実施するまえに、簡単にGemfire の構成を確認します。Gemfire は以下の図の構成から成り立っています。
キャッシュ機能を提供するのが「Server」となります。これはホストではなくインスタンスですので、1つの物理ホスト上に複数のServerを展開することもできます。クライアントからのアクセスを複数台ある Server にロードバランスしたり、「Region」と呼ばれるデータ領域(DBでいうとテーブル)を複数のServerで共有させるための機能が「Location」です。インストール後の設定でこれらの構成をおこないます。
Ubuntu 20.04 への Gemfire のインストール
ここでは以下のドキュメントの内容に沿って Gemfire を ubuntu 20.04 にインストールします。
Windows/Unix/Linux—Install Pivotal GemFire from a Compressed TAR File
まず、Gemfire の tar イメージを入手します。今回は 9.10.7 を以下のページから入手しています。
入手したイメージを以下の手順で導入します。
- Gemfireを展開するディレクトリの作成 (今回は /opt/pivotal とした)
- イメージを上記ディレクトリに解凍
- jdk11(Java Development Kit)のインストール
- Java と Gemfire が必要とする環境変数を .bashrc に定義
- .bashrc に書かれた環境変数をよみこみ
- Gemfireが使えるかを gfsh コマンドで確認
上記のコマンドのサンプルを以下に記載します。
以上でインストールは終了です。
Gemfireを利用する準備
Ubuntu に Gemfireをインストールしただけではキャッシュ機能が利用できないため、最初に説明した「Locator」「Server」「Region」の設定をします。あとのサンプルで REST API を使ってキャッシュ機能を利用しますので、ポートを指定して REST API を有効化しています。
以下にコマンドの実行サンプルを記載します。
Locator や Server, Region の設定は以下のドキュメントなどをご参照ください。
Tutorial—Creating and Using a Cluster Configuration
REST API 対応のサーバーの展開方法は以下のドキュメントを参照ください。
gfsh によるキャッシュ操作
キャッシュ機能はアプリケーション側から利用することになりますが、DBもSQLをシェルから発行できるように Gemfire も gfsh でキャッシュを操作できます。ここでは単純なキーバリューストア機能を試します。
putをするとエントリの新規作成と上書きができ、getコマンドで既存エントリの取得ができます。
REST API によるアプリからのキャッシュ機能の利用
Gemfire は Java 用のクライアントが用意されていますが、それ以外のプログラミング言語は REST API を使ってキャッシュ機能を利用します。具体的には以下の図のようになります。
決められたURL形式でGET/POST/PUT/DELETE のHTTPメソッドを呼び出すことでキャッシュ操作ができます。一般的なREST APIと同様にGETでエントリを取得し、POSTでエントリを新規作成し、PUTで既存エントリを更新し、DELETEで既存エントリを消すという仕様になっています。
ここでは Python を使って REST API 経由でキャッシュ機能の確認をします。他の言語でも同様のHTTPリクエストを投げれば同じ挙動をするはずです。以下の Python のサンプルでは Gemfire を操作するためのクラスである GemfireRepository を作成し、その各メソッドがキャッシュ操作を REST API で実行しています。
クラスの後ろにあるサンプルコードで GemfireRepository クラスタが実装するキャッシュ機能を試しています。
コンストラクタでサーバーのIP(もしくはホスト名)とポートおよびRegion名を指定しています。これはサーバーに問い合わせるためのURLで利用されます。
コンストラクタでインスタンス化したオブジェクトにたいして、まずemptyメソッドでキャッシュを全てクリアしています。そのあとで、create_key メソッドでキャッシュエントリを3つ作成し、update_keyメソッドで1つのエントリを更新し、delete_keyメソッドで別の1つのエントリを削除しています。
最後に現在の状態をキー一覧取得メソッドのlist_keysで確認し、バリュー一覧をlist_valuesメソッドで確認し、キーに対応するバリューをget_keyメソッドで確認しています。
実行結果は以下となります。
キー apple は更新されたバリュー green を持ち、キー banana は作成後に消されたので存在しておらず、キー grape は作成された際のバリュー purple を持っています。
上記のプログラムのベースは以下のドキュメントにあるPythonコードとなります。
REST API の細かな作法については以下のドキュメントを参照ください。