Skip to main content
1
〜Apache Geode 入門
gfsh によるクラスター構築・管理
quitada
2017/8/18
2
Apache Geode? gfsh?何それお
いしいの?
Apache Geode と gfsh
 Apache Geode(アパッチジオード)とは?
– インメモリデータグリッド製品 Pivotal GemFire のオープンソース版
– スケールアウト可能な分散型 Key-Value NoSQL インメモリデータベースに、
SQL の select 文みたいなクエリーとかデータドリブンなイベント処理とか
並列データ処理とかできるようにしたやつ
– Apache Ignite とか Infinispan とか Hazelcast みたいなやつ
– http://geode.apache.org/
 gfsh(ジーフィッシュ)とは?
– Geode Shell の略:あれ?「f」はどこからきたの?
▪ 商用版の GemFire では、GemFire Shell の略なのでそのまま流用していると思われる
– Apache Geode 付属の CLI 管理ツールで、クラスターの構築とか起動、デー
タベースの構築とか各種運用管理をするやつ
3
gfsh を使って Apache Geode のクラス
ターを構築してデータ投入してみま
す!
gfsh を使って Apache Geode のクラス
ターを構築してデータ投入してみま
す!
大切なことなので、二度いいました!
データ設計もしてみます!
4
こんな構成でクラスター構築してみる(1/2)
5
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
今回は仮想マシン x2 を使います。
OS は Cent OS Linux 7 を使いま
す。各仮想マシンがお互い
TCP/UDP で通信できて、IP から
ホスト名解決できるようにしてお
きます。
Locator(ロケーター)は、クラ
スターへの接続ポイントならびに
クラスターのメンバー管理を行う
人です。1 ついれば動きますが、
冗長構成で 2 つ用意してみます。
こんな構成でクラスター構築してみる(2/2)
6
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
Cache Server(キャッシュサー
バー)は、インメモリのデータス
トアの人です。複数束ねてあたか
も一つのインメモリデータストア
として使用可能です。今回は冗長
構成もかねて 2 つ用意します。
Region(リージョン)は、
RDBMS のテーブルみたいなもの
です。今回は Partitioned Region
(パーティションリージョン)と
いう、Hadoop HDFS みたいな
データの持ち方で、ローカルディ
スクにデータ永続化する設定にし
ます。
では、順番にクラスター構築してみよ
う!
7
事前準備(1/6)
8
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
各マシンで、Locator や Cache
Server に必要な設定ファイル、
起動スクリプト、ログ、永続化し
たデータの格納ディレクトリ等準
備します。
事前準備(2/6)
 Apache Geode を各マシンにインストールし、gfsh コマンド
を実行できるように各種環境変数を設定します。
 クラスターのルートディレクトリの作成
– ログとか設定ファイルを格納するルートディレクトリを決めましょ
う。ここでは、以下のディレクトリを各マシンに作るものとします。
▪ /home/geode/mycluster
– 極端な話、各マシンで Locator、Cache Server 用に全く異なるディ
レクトリにしてもよいのですが、ここでは、管理しやすくするため
共通ルートディレクトリを決めてしまいます。
9
事前準備(3/6)
 設定ファイルの作成(1/3)
– ここでは、各マシンのクラスタールートディレクトリ直
下(ここでは、/home/geode/mycluster)にデフォルトの
gemfire.properties というファイル名で次ページのよう
な内容のファイルを作成します。
– プロパティーファイル名のデフォルトが
gemfire.properties なのは、商用版 GemFire の名残ですが、
起動時に明示的に指定すれば好きなファイル名でかまい
ません。
10
事前準備(4/6)
 設定ファイルの作成(2/3)
– サーバーマシン 1(machine1)
– サーバーマシン 2(machine2)
11
log-level=config
locators=machine1[55221],machine2[55221]
bind-address=machine1
server-bind-address=machine1
jmx-manager-bind-address=machine1
log-level=config
locators=machine1[55221],machine2[55221]
bind-address=machine2
server-bind-address=machine2
jmx-manager-bind-address=machine2
事前準備(5/6)
 設定ファイルの作成(3/3)
– 各パラメーターの意味
▪ log-level : ログレベルです。config レベルに設定すると、一般的な info レベルに加えてクラ
スターの設定内容も出力されるので、正しく設定されているかどうか確認のため便利です。
▪ locators : Locator 一覧(ホスト名[ポート番号])をあらかじめ設定する必要があります。
▪ bind-address : クラスター内通信用のホスト名を指定します。NIC が 1 つだけの時は設定不要
ですが、意図したネットワークセグメントで通信しているかどうか確認のため明示的に設
定することをおすすめします。
▪ server-bind-address : クライアントサーバー通信用のホスト名を指定します。NIC が 1 つだけ
の時は bind-address 同様設定不要です。Cache Server だけに有効なパラメーターです。
▪ jmx-manager-bind-address : JMX マネージャー通信用のホスト名を指定します。NIC が 1 つだ
けの時は bind-address 同様設定不要です。JMX マネージャーサービスが稼働する Locator あ
るいは Cache Server にのみ有効なパラメーターです。デフォルトでは、一番最初に起動す
る Locator のみに適用されるパラメーターとなります。
▪ ホスト名を指定するパラメーターに関しては、代わりに IP 直指定でもかまいません。
12
事前準備(6/6)
 各マシンで Locator や Cache Server のログや永続化ディスクストアを格納する
ディレクトリを作成します。
– サーバーマシン 1(machine1)
– サーバーマシン 2(machine2)
13
$ cd /home/geode/mycluster
$ mkdir locator1
$ mkdir server1
$ cd /home/geode/mycluster
$ mkdir locator2
$ mkdir server2
locator1 が Locator 1 用のディレ
クトリ、server1 が Cache Server
1 用のディレクトリとします。
locator2 が Locator 2 用のディレ
クトリ、server2 が Cache Server
1 用のディレクトリとします。
Locator 起動(1/3)
14
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
各マシンで、コマンドラインより
gfsh を使って Locator を起動しま
す。
Locator 起動(2/3)
 各マシンで、gfsh を使って Locator を起動します
– サーバーマシン 1(machine1)
– サーバーマシン 2(machine2)
15
$ cd /home/geode/mycluster
$ gfsh start locator --name=locator1 --dir=locator1 --bind-address=machine1 --
port=55221 --properties-file=gemfire.properties
$ cd /home/geode/mycluster
$ gfsh start locator --name=locator2 --dir=locator2 --bind-address=machine2 --
port=55221 --properties-file=gemfire.properties
Locator 起動(3/3)
 “gfsh start locator” コマンドのパラメーターの意味
– --name : クラスター中の各プロセス識別のため、各 Locator と Cache Server で一意の名前を指定
します。ここでは、事前準備で作成した各 Locator 用ディレクトリ名をそのまま指定しています。
– --dir : 事前準備で作成した各 Locator 用ディレクトリのパスを指定します。絶対指定・相対指定ど
ちらも可能です。ここでは、当該ディレクトリのあるディレクトリ(ここでは、
/home/geode/mycluster)で gfsh コマンドを実行することを前提に相対指定としています。
– --bind-address : 事前準備で作成した gemfire.properties の Locator 一覧にホスト名にそって指定し
ます。ただし、gemfire.properties の bind-address パラメーターですでに設定済みなので、これは
省略可能です。
– --port : 事前準備で作成した gemfire.properties の Locator 一覧のポート番号にそって指定します。
ここでは Locator 1、Locator2 ともに 55221 を適用しています。
– --properties-file : 事前準備で作成した設定ファイルのパスを指定します。絶対指定・相対指定どち
らも可能です。
 各 Locator を起動するコマンドラインをシェルスクリプトにしておくと良いでしょう。
16
Cache Server 起動(1/3)
17
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
各マシンで、コマンドラインより
gfsh を使って Cache Server を起
動します。
Cache Server 起動(2/3)
 各マシンで、gfsh を使って Cache Server を起動します
– サーバーマシン 1(machine1)
– サーバーマシン 2(machine2)
18
$ cd /home/geode/mycluster
$ gfsh start server --name=server1 --dir=server1 --server-port=0 --properties-
file=gemfire.properties
$ cd /home/geode/mycluster
$ gfsh start server --name=server2 --dir=server2 --server-port=0 --properties-
file=gemfire.properties
Cache Server 起動(3/3)
 “gfsh start server” コマンドのパラメーターの意味
– --name : クラスター中の各プロセス識別のため、各 Locator と Cache Server で一意の名前を指定
します。ここでは、事前準備で作成した各 Cache Server 用ディレクトリ名をそのまま指定してい
ます。
– --dir : 事前準備で作成した各 Cache Server 用ディレクトリのパスを指定します。絶対指定・相対
指定どちらも可能です。ここでは、当該ディレクトリのあるディレクトリで gfsh コマンドを実
行することを前提に相対指定しています。
– --server-port : クライアントアプリケ−ションとの通信用のポートを設定します。ここでは、0 を
指定することで、起動時に空いている任意のポートを割り当てます。割り当てられたポートは、
Locator が記憶するので、クライアントアプリケーションはロケーターに問い合わせることでど
のポート経由でアクセスすべきか知ることができます。もちろん、明示的にポート番号を指定す
ることも可能です。
– --properties-file : 事前準備で作成した設定ファイルのパスを指定します。絶対指定・相対指定どち
らも可能です。
 各 Cache Server を起動するコマンドラインをシェルスクリプトにしておくと良いでしょう。
19
20
Apache Geode クラスターができ
たので、設定内容・挙動を gfsh
で確認してみよう。
gfsh によるクラスター管理(1/2)
 gfsh を引数なしで実行すると、“gfsh>” というコマンドプロンプトが現れ、インタラク
ティブに各種コマンドを実行できるモードで起動します。
 bash とかみたく、適宜 TAB キーで各コマンド一覧表示やら引数の補完やらやってくれま
す。
21
$ gfsh
_________________________ __
/ _____/ ______/ ______/ /____/ /
/ / __/ /___ /_____ / _____ /
/ /__/ / ____/ _____/ / / / /
/______/_/ /______/_/ /_/ 1.2.0
Monitor and Manage Apache Geode
gfsh>
gfsh によるクラスター管理(2/2)
 大部分のコマンドを実行するには、まず、以下のコマンドでいずれかの Locator に接続す
る必要があります。
– --locator パラメーターに、Locator のホスト名とポート番号を指定します
 以下の管理コマンドを実行してみます。
22
gfsh>connect --locator=machine1[55221]
gfsh>help
gfsh>list members
gfsh>show log —member=server1 —lines=100
gfsh>change loglevel —loglevel=fine --members=server1
gfsh>show log —member=server1 —lines=100
gfsh>change loglevel --loglevel=config --members=server1
gfsh>status server —name=server1
gfsh>describe member —name=server1
デモ:
一連の gfsh 管理コマンドを実行して結
果を見てみるよ。
23
24
Apache Geode クラスターができ
たので、データの出し入れとか
gfsh でやりたいね!
と、その前に、データの入れ物
を作ったり、データの型定義と
かしたくない?
データオブジェクト設計と Region 作成(1/12)
25
サーバーマシン 1
Locator 1
Cache Server 1
サーバーマシン 2
Locator 2
Cache Server 2
冗長構成
Partitioned Region
冗長コピー x1
IP: 192.168.100.1
ホスト名: machine1
IP: 192.168.100.2
ホスト名: machine2
ローカルディスク ローカルディスク
データ永続化 データ永続化
データオブジェクトを挿入する入
れ物ととして、Region を作成す
るんですが、その前にデータオブ
ジェクトを設計してみます。
データオブジェクト設計と Region 作成(2/12)
 Apache Geode は、Region という名の Key-Value ストアに任意のオブジェ
クトを挿入できますよー!超柔軟!
– 実運用・実アプリケーションレベルでは、同一 Region に無秩序に任意の型
のオブジェクトが入っていたら大変なことに…
– なので、少なくとも単一 Region に挿入する Key や Value のオブジェクト型
は一意に定義したい
 はい、このプレゼンの趣旨的に、gfsh でできるだけ管理したいですよ
ね?
– gfsh でコマンドラインからデータオブジェクト挿入したいでしょう?
– gfsh でコマンドラインから SQL ライクなクエリーを実行したいでしょう?
26
データオブジェクト設計と Region 作成(3/12)
ということで…
– key には、各データを一意に識別するだけなの
で、文字列型(java.lang.String)で。
– value には、RDBMS のテーブルみたいな構造の
“ドメインオブジェクト” ってやつを入れること
にしましょう。
27
データオブジェクト設計と Region 作成(4/12)
 イメージ的には、RDBMS の DDL で定義したテーブル型をオブジェクトに変換する感じ。
 ここでは、以下のような DDL で定義したテーブル型からドメインオブジェクトの型を表す
Java クラスで実装してみます。
28
create table employee (
id CHAR(6),
first_name VARCHAR2(10),
family_name VARCHAR2(10),
title VARCHAR2(30),
age INT(3),
primary key( id )
);
データオブジェクト設計と Region 作成(5/12)
 はい、以下のような感じ。各カラムをフィールド変数として保持する感じ。
 実際には、コンストラクター、各フィールド変数のゲッターとかセッターも実装する必要あります。
 value として、こちらを元に quitada.Employee 型のドメインオブジェクトとして挿入します。
29
package quitada; // パッケージ名
public class Employee { // クラス名
private String id; // フィールド変数 – カラム: id
private String firstName; // フィールド変数 – カラム: first_name
private String familyName; // フィールド変数 – カラム: family_name
private String title; // フィールド変数 – カラム: title
private int age; // フィールド変数 – カラム: age
:
}
データオブジェクト設計と Region 作成(6/12)
 さて、次にさきほど作成したクラス(quitada.Employee)をコンパイルして jar でかためて
以下のように Cache Server にデプロイします(connect コマンドで Locator に接続してい
ることが前提*)。
 当該 jar ファイル自体は各 Locator ディレクトリ配下に配備されます。今回の例では、以下
のディレクトリ配下に配備されます。
– machine1:/home/geode/mycluster/locator1/cluster_config/cluster
– machine2:/home/geode/mycluster/locator2/cluster_config/cluster
 以降、各 Cache Server 起動時には自動的に当該 jar ファイルが各 Cache Server のローカル
ディレクトリーにコピーされデプロイされます。
30
gfsh>deply –jar=/path/to/classes/myDomainObject.jar
*= 以下、“gfsh>” プロンプトのコマンド実行例は全て connect コマンドで Locator 接続済みであることが前提。
データオブジェクト設計と Region 作成(7/12)
 [任意設定] シリアライザーの設定(1/5)
– ドメインオブジェクトを通信経路にのせるため、シリアライズ可能
であるよう設定する必要があります。
– ドメインオブジェクトの Java クラスをシリアライズ可能であるよ
うに実装していれば明示的なシリアライザー設定は不要です
(implements java.io.Serializable 付与してるとか)。
– ドメインオブジェクトの Java クラス自体がシリアライズ不可であ
る場合は、gfsh でシリアライザーの設定を行います。なお、シリア
ライザーは、Apache Geode 独自のシリアライズフォーマットであ
る PDX(Portable Data eXchange)のオートシリアライザーを適用し
ます。
31
データオブジェクト設計と Region 作成(8/12)
 [任意設定] シリアライザーの設定(2/5)
– まず対象クラスの PDX メタデータを永続化するディスクストアを以下のコマンドで
作成します。PDX メタデータの永続化は必須ではありませんが、Cache Server 再起動
の度に再作成するコスト削減のため設定が推奨されます。
– “—dir=pdx” と指定することで各 Cache Server ディレクトリ配下に PDX メタデータ永
続化ディスクストア格納用に pdx というディレクトリが作成されます。今回の例で
は、以下のディレクトリー配下に作成されます。
▪ machine1:/home/geode/mycluster/server1/pdx
▪ machine2:/home/geode/mycluster/server2/pdx
– “—name=pdx” と指定することで、当該ディスクストアを “pdx” という名前で参照
可能となります。
32
gfsh>create disk-store --name=pdx --dir=pdx
データオブジェクト設計と Region 作成(9/12)
 [任意設定] シリアライザーの設定(3/5)
– 次に、以下のコマンドで PDX ベースのシリアライザーを設定します。
– “—read-serialized=false” とすることで、ドメインオブジェクトをそのもののオブ
ジェクト型で読み込みます。逆に “true” とした場合は、必ず PdxInstance 型のオブ
ジェクトとして読み込みます(対象ドメインオブジェクトがシリアライズされたま
ま PdxInstance 型の入れ物に入っているイメージです)。
– “—disk-store=pdx” とすることで、先ほど作成した “pdx” という名前のディスクスト
アに PDX メタデータを格納するよう指定します。
– “—auto-serializable-classes=quitada.*” とすることで、quitada というパッケージの全
てのドメインオブジェクトを自動的にシリアライズ可能とします。
33
gfsh>configure pdx --read-serialized=false --disk-store=pdx --auto-serializable-
classes=quitada.*
データオブジェクト設計と Region 作成(10/12)
 [任意設定] シリアライザーの設定(4/5)
– さて、“configure pdx” コマンドを実行すると、以下のような不穏な
メッセージがでてくると思います。
– はい、PDX シリアライザー設定を有効化するには、すでに起動して
いる Cache Server を再起動する必要があります。
34
The command would only take effect on new data members joining the distributed
system. It won't affect the existing data members
:
Non portable classes :[quitada.*]
データオブジェクト設計と Region 作成(11/12)
 [任意設定] シリアライザーの設定(5/5)
– ということでまず以下の gfsh の “stop server” コマンドを使ってコマンドラ
インより Cache Serverを停止します。
– サーバーマシン 1(machine1)の Cache Server 停止
– サーバーマシン 2(machine2)の Cache Server 停止
– その後、先で言及した “start server” コマンドで各 Cache Server を再起動し
ます。
35
$ cd /home/geode/mycluster
$ gfsh stop server --dir=server1
$ cd /home/geode/mycluster
$ gfsh stop server --dir=server2
データオブジェクト設計と Region 作成(12/12)
 Region の作成
– SQL で create table を実行するイメージ(?)で、以下のようなコマンドを実行します。
– “—name=/Employee” とすることで、“Employee” という名前の Region を作成します。なお
Region 名の前に付与されているスラッシュは省略可能です。
– “—type=PARTITION_REDUNDANT_PERSISTENT” とすることで、Region 型として、データを各
サーバに分散配置(PARTITION)、高可用性確保のため他の Cache Server に各データのコピーを
1 つ保持(REDUNDANT)、全データをディスクに永続化(PERSISTENT)としています。
– “—key-constraint=java.lang.String” とすることで、Key として挿入可能なオブジェクトは文字列型
のみとなります。
– “—value-constraint=quitada.Employee” とすることで、Value として挿入可能なオブジェクトはド
メインオブジェクトとしてさきほど作成した quitada.Employee 型のみとなります。
36
gfsh>create region --name=/Employee --type=PARTITION_REDUNDANT_PERSISTENT --key-
constraint=java.lang.String --value-constraint=quitada.Employee
37
では、Apache Geode で、データ
の出し入れとか gfsh でやってみ
よう!
データオブジェクトの出し入れ・クエリー(1/5)
 まず、さきほど作成した Employee リージョンの有無確認のため、以下のコマン
ドを実行してみます。 “Employee” と出力されるかと思います。
 次に、Employee リージョンの詳細情報を以下のコマンドで確認します。
 さて、Employee リージョンが正常に作成されていることを確認したら、いよい
よデータオブジェクトの挿入です。
38
gfsh>list region
gfsh>describe region --name=/Employee
データオブジェクトの出し入れ・クエリー(2/5)
 その前に、Employee リージョンに挿入するデータオブジェクトのクラスを再確認してみます。
 はい、実際に gfsh でデータオブジェクト挿入の際には、各フィールド変数の名前とそれぞれの値を列
挙し、データオブジェクト型を指定することで、gfsh が自動的に Employee オブジェクトを生成して、
Employee リージョンの Value とします。
39
package quitada; // パッケージ名
public class Employee { // クラス名
private String id; // フィールド変数 – カラム: id
private String firstName; // フィールド変数 – カラム: first_name
private String familyName; // フィールド変数 – カラム: family_name
private String title; // フィールド変数 – カラム: title
private int age; // フィールド変数 – カラム: age
:
}
データオブジェクトの出し入れ・クエリー(3/5)
 いよいよデータオブジェクト挿入です。以下の put コマンドを実行します。
 “—region=/Employee” とすることで、Employee リージョンにデータオブジェクトを挿入することを宣言します。
 “--key-class=java.lang.String” とすることで、Key のオブジェクト型は文字列とします。デフォルトの型は文字列なので、
この設定は省略可能です。
 “--value-class=quitada.Employee” とすることで、Value のオブジェクト型は quitada.Employee 型とします。
 “—key=‘101’” とすることで、key の値を指定します。ここでは、ドメインクラスEmployeeの主キーと設定している
フィールド変数idの値を指定しています。文字列の場合はシングルクォーテーションで囲みます(省略可)。
 “—value” パラメータで、Value を指定します。上述の例のように、JSON っぽい形式でフィールド変数名のその値を指定
します。フィールド変数名や文字列値はシングルクォーテーションで囲みます(これも省略可)。
40
gfsh>put --region=/Employee --key-class=java.lang.String --value-
class=quitada.Employee --key='101' --
value=('id':'101','firstName':'Taro','familyName':'Yamada','title':'Engineer','age'
:28)
データオブジェクトの出し入れ・クエリー(4/5)
 次に、さきほど挿入したデータオブジェクトを読み込んでみました。以下の get
コマンドを実行します。結果として、gfsh では各フィールド変数値が出力され
ます。
 “—region=/Employee” とすることで、Employee リージョンからデータオブジェ
クトを読み込むことを宣言します。
 “—key=‘101’” とすることで、key の値が “101” であるデータオブジェクトを読み
込みます。
41
gfsh>get --region='/Employee' --key='101'
データオブジェクトの出し入れ・クエリー(5/5)
 最後にクエリーを実行してみましょう。以下の query コマンドの実行例です。
 “—query” に SQL の select 文ライクな、OQL(Object Query Language)のクエリーを指定します。
42
gfsh>query --query="select * from /Employee where id='101'"
Result : true
startCount : 0
endCount : 20
Rows : 1
age | familyName | firstName | id | title
--- | ---------- | --------- | --- | --------
28 | Yamada | Taro | 101 | Engineer
NEXT_STEP_NAME : END
43
ということで、gfsh で Apache
Geode を弄ってみました。
では、またー。