はじめに
分散型のKVSであるApache Geodeについて、はじめて使ってみること主体に記載していきます。
理屈をここで書く気はないので、詳しく知りたい方は公式を見てください。または、別の機会に詳しく説明するかも。
http://geode.apache.org
インストール
Linux環境を前提に進めます。
また、動作にはJavaの実行環境が必要となります。
最新のモジュールは下記を参照してください
https://geode.apache.org/releases/
wget -O - http://ftp.meisei-u.ac.jp/mirror/apache/dist/geode/1.6.0/apache-geode-1.6.0.tgz | tar zxvf -
PATHへ追加はお好みで
GFSHの起動
[Geodeのダウンロード先]/bin/gfshを立ち上げて、コマンドラインでGeodeを操作します。
この時、起動した時のディレクトリがGeodeの作業ディレクトリとなります。(オプションで場所指定もできますが)地味に重要で、実際にその事を忘れたがゆえにドはまりしたこともあります。
$ gfsh
_________________________ __
/ _____/ ______/ ______/ /____/ /
/ / __/ /___ /_____ / _____ /
/ /__/ / ____/ _____/ / / / /
/______/_/ /______/_/ /_/ 1.6.0
Monitor and Manage Apache Geode
gfsh>
LocatorとServerの起動
Geodeは、LocatorとServerという2つの機構が存在します。
簡単に説明すると、クライアントからの入口となるLocatorと、実際にデータを保持するServerとなっており、DNSとWebサーバの関係をイメージして貰えるとわかりやすいかもしれません。
それでは、locatorを起動してみましょう。
gfsh>start locator --name=locator
Starting a Geode Locator in /xxxx/geode/locator...
........
Locator in /xxxx/geode/locator on xxxxx01.yahoo.co.jp[10334] as locator is currently online.
Process ID: 14799
Uptime: 8 seconds
Geode Version: 1.6.0
Java Version: 1.8.0_161
Log File: /xxxx/geode/locator/locator.log
JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /xxx/apache-geode-1.6.0/lib/geode-core-1.6.0.jar:/xxxx/apache-geode-1.6.0/lib/geode-dependencies.jar
Security Manager is enabled - unable to auto-connect. Please use "connect --locator=xxxxx01.yahoo.co.jp[10334]" to connect Gfsh to the locator.
locator起動しました。続いてseverを起動します。
gfsh>start server --name=server
Starting a Geode Server in /xxxx/geode/server...
........
Server in /xxxx/geode/server on xxxxx01.yahoo.co.jp[40404] as server is currently online.
Process ID: 15301
Uptime: 6 seconds
Geode Version: 1.6.0
Java Version: 1.8.0_161
Log File: /xxxx/geode/server/server.log
JVM Arguments: -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /xxx/apache-geode-1.6.0/lib/geode-core-1.6.0.jar:/xxx/apache-geode-1.6.0/lib/geode-dependencies.jar
serverが起動しました。これで、Geodeとしての基本的な起動は終わりました。
しかし、これだけではKVSとしては機能しません。
Regionの作成
RegionはGeodeにおけるデータを保持する領域で、このRegionの単位で、expireの方針や、永続化の設定などを設定します。Oracleでいえばエンティティを作成している感覚でしょうか。
それでは作っていきます。
gfsh>create region --name=region1 --type=REPLICATE
Member | Status
------ | -------------------------------------
server | Region "/region1" created on "server"
region1という名前のregionを作成しました。実際には識別しやすい名前を付けましょう。
PutとGetの実行
データをGeodeへ設定してみましょう。データを設定するにはputコマンドを使います。
先程作成した、region1をput先に設定し、keyとvalueを設定します。
gfsh>put --region=region1 --key=key1 --value=value1
Result : true
Key Class : java.lang.String
Key : key1
Value Class : java.lang.String
Old Value : <NULL>
今度は、getコマンドを使って、keyを指定してvalueを取り出します。
gfsh>get --region=region1 --key=key1
Result : true
Key Class : java.lang.String
Key : key1
Value Class : java.lang.String
Value : value1
Geodeへの再接続
gfshを落としたあとにGeodeへ再接続する方法も記載しておきます。
ctl+dでgfshを抜けて、再度、gfshを実行します。
gfsh>
Exiting...
$ gfsh
そのまま、値をgetしようとしても下記のように取得はできません。
gfsh>get --region=region1 --key=key1
Command 'get --region region1 --key key1' was found but is not currently available (type 'help' then ENTER to learn about this command)
connectコマンドを実行して、実行中のGeodeへ接続します。
この時、gfshを実行した場所が、前回の実行場所と違うとうまくいきませんので注意してください。
gfsh>connect
Connecting to Locator at [host=localhost, port=10334] ..
Connecting to Manager at [host=dev-xxxx01.yahoo.co.jp, port=1099] ..
Successfully connected to: [host=dev-xxxx01.yahoo.co.jp, port=1099]
list membersコマンドで接続対象のlocatorとserverを確認できます。
Name | Id
------- | ----------------------------------------------------------------
locator | xxx.xxx.xxx.xxx(locator:17639:locator)<ec><v0>:1024 [Coordinator]
server | xxx.xxx.xxx.xxx(server:17858)<v1>:1025
この状態であれば、getコマンドが通ります。
gfsh>get --region=region1 --key=key1
Result : true
Key Class : java.lang.String
Key : key1
Value Class : java.lang.String
Value : value1
最後にremoveコマンドで消してみましょう。
gfsh>remove --region=region1 --key=key1
Result : true
Key Class : java.lang.String
Key : key1
LocatorとServerの停止
locatorとserverを停止します。
gfsh>stop server --name=server
Stopping Cache Server running in /xxxx/geode/server on xxx01.yahoo.co.jp[40404] as server...
Process ID: 17858
Log File: /home/mkatsube/geode/server/server.log
...
gfsh>stop locator --name=locator
Stopping Locator running in /xxxx/geode/locator on xxx01.yahoo.co.jp[10334] as locator...
Process ID: 17639
Log File: /home/mkatsube/geode/locator/locator.log
...
停止する時は、server→locatorの順番で実行する事をおすすめします。
現バージョンは確認してませんが、以前は、順番を間違えたため、再起動できなくなりました。
まとめ
Geodeをまずは簡単に試めせるよう記載してみました。
Redisなどと比べると、少しまどろっこしく感じるかもしれませんが、locator、server、Regionなど細かく設定を分けれることで、運用の規模が大きくなればなるほど、メリットが出てきます。
バージョンがM1の頃からシステムに採用して運用していますが、一度も障害が起きたことがなく、大量アクセス、大容量データに耐え続けており、非常に優秀な仕組みに感じています。
次回は、クラスタ構成の方法、Regionの解説、直面した運用課題について書いていければと思います。