はじめてのApache Geode

### はじめに
分散型の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という２つの機構が存在します。
簡単に説明すると、クライアントからの入口となる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へ設定してみましょう。データを設定するにはｐutコマンドを使います。
先程作成した、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の解説、直面した運用課題について書いていければと思います。