VMware GemFire Management Consoleを触ってみる

VMware GemFireには[VMware GemFire Management Console](https://docs.vmware.com/en/VMware-GemFire-Management-Console/index.html)（以下GFMC）というGemFireの管理をGUIから一元管理する製品が提供されている。
これはGemFireのライセンスがあれば追加ライセンスなしで自由に使える製品となっている。
これがまた非常に便利なので、今回はKubernetes上に展開して使ってみる。

## GFMCのインストール
v1.1での[インストール方法](https://docs.vmware.com/en/VMware-GemFire-Management-Console/1.1/gfmc/install.html#installation-1)は、JAR、OVA、dockerの3種類が用意されているが、Kubernetes向けのものは用意されていない。

なので、dockerのインストール手順に載っているイメージを使ってKubernetes向けにインストールする。
まず、インストール先のNamespaceを作成する。
```sh
export GFMC_NS=gemfire-mc
kubectl create ns $GFMC_NS
```
Tanzu Network用の認証情報をSecretとして登録し、defaultのServiceAccountからも参照できるようにしておく。
```sh
export TANZUNET_USERNAME=xxx@yyy.zzz
export TANZUNET_PASSWORD=xxxxx
kubectl create secret docker-registry image-pull-secret --namespace=$GFMC_NS --docker-server=registry.tanzu.vmware.com --docker-username=$TANZUNET_USERNAME --docker-password=$TANZUNET_PASSWORD
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "image-pull-secret"}]}' -n $GFMC_NS

```
Deploymentを作成する。
```sh
kubectl create deploy gemfire-management-console --image registry.tanzu.vmware.com/gemfire-management-console/gemfire-management-console:1.1.0 -r 1 -n $GFMC_NS
```
Serviceを公開する。ここでは`type: LoadBalancer`を利用する。
```sh
kubectl expose deploy gemfire-management-console --port 8080 --type LoadBalancer -n $GFMC_NS
```
以上でインストールは完了となる。

## GFMCの利用
### クラスタの登録
アクセスすると以下のような画面になる。現時点ではID Providerとの連携はしていないので、NONEのまま`ENABLE DEVELOPER MODE`をクリックする。
![1699582863793.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/a096eb64-e514-faac-b986-e10b1cd9bdde.png)
するとGFMCで管理対象とするGemFireクラスタを聞いてくるので入力する。
ここでは事前に`kind: GemFireCluster`でクラスタを作成していたので、このクラスタのLocatorのServiceを入力した。
![1699583052562.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/cdd52c1f-3746-91d4-46e6-d7581d31d7ad.png)
無事接続できると、以下のようにクラスタが表示され、GemFireのVersionやLocator、Serverの数が確認できる。
![1699583111170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/9ebcb49d-ce0d-7753-b370-c1ea26151adc.png)

### クラスタの状態確認
`Dashboard`から登録したクラスタをクリックすると、以下のようにMember一覧と使用リソース、稼働時間などが確認できる。
![1699583925614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/1051acce-9826-e576-5b20-c5f642764229.png)

また、`Monitoring`のタブをクリックすると、メトリクスが取得できる。
ただし、デフォルトではメトリクスの取得が有効化されていないため、`Metrics Enabled`をクリックして有効化する必要がある。
加えて、GemFire for KubernetesではなくStandalone版を使っている場合はメンバーの起動時に`--classpath`でJARを読み込ませる必要がある（[こちら](https://docs.vmware.com/en/VMware-GemFire-Management-Console/1.1/gfmc/configure_monitoring.html#gemfire-2)参照）。
今回はKubernetes版を利用したため、特に手を加えず以下のようなグラフが表示されるようになった。
![1699584524994.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b12ae341-ab3d-1a5b-9d31-4cbc8239fbbf.png)

なお、`Monitoring`では以下のダッシュボードが用意されている。（誤りがあるかも）
- get/putのスループット
- get/putのレイテンシの平均値Latency
- Cacheのヒット・ミス率
- Function Executionのキューサイズと失敗の比率
- ClientのputのRPS
- 容量を超えたPERSISTENTのRegion
- メッセージキューサイズ
- クライアントのQPS
- 平均クエリ時間
- Regionの詳細
- Serverが利用可能なメモリの割合、
- ディスクの状態
- CPU利用率
- Serverへ接続しているConnection数
- ServerのDuration時間
- クラスタ内のメンバー間の通信の遅延
- I0 wait
- 廃棄した1秒あたりのRead数
- CPUの待ち時間の割合
- WAN構成でのGateway Receiverのスループット
- WAN構成でのGateway Senderの1秒あたりのメッセージ数

なお、ダッシュボードのインフォメーションボタンをクリックすると、ダッシュボードの詳細説明が表示されるため、どういうものかはここの説明を参考にするとよい。
![1699586073156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/78967f17-24c9-436e-c190-9bbdcf97b54e.png)


### Regionの確認
Regionの状態は`Dashboard`の`Region`から確認できる。
![1699588557867.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/19117de8-e88e-0c52-bdd4-23301e6f08d1.png)

作成したRegionのType、エントリ数、メンバや、データの有効期限やEviction設定等細かな設定が確認できる。

### gfshの実行
`Dashboard`の`gfsh`からgfshコマンドを叩くことも出来る。
![1699588895019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/33996104-eab2-493c-a3dd-1ad5dc23a9f3.png)

特にKubernetes環境とかではgfshを叩くPodとかを用意するのは面倒だったりするので、ちょっとした作業には非常に便利。
また、よく使うコマンドは`Quick Commands`の横の`EDIT`から追加して、ワンクリックで実行することも出来る。
![1699588874591.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/5182f70e-0e05-063c-1d80-9c4534c1f684.png)

削除する際は、同じく`EDIT`からプルダウンで登録したコマンドを選んで`DELETE`で削除する。

### Logの確認
ログもGFMCから確認できる。
メンバーを選んでログ表示し、フィルタ出力させることも可能。
![1699589180544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/ad2684b6-bd9e-d8d3-6f09-83b083edc01b.png)

また、`DOWNLOAD`からログをダウンロードできるが、この際開始・終了日やログレベルなども絞って出力させることが出来る。かなり便利。
![1699589267490.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b4a89e0a-fec4-a96f-2c9a-c95388ffdf6f.png)

### データの確認
Region内のデータを直接見ることも出来る。
![1699589324151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4631d6a9-69d3-b003-78e5-b9c718d0562c.png)

クエリも発行する事ができる。
![1699589784813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/2fa7001a-53ca-5411-7c9a-3e8472f37615.png)

### クラスタ情報のImport・Export
登録したクラスタの情報はjson形式でExportすることが出来る。
試しに利用する。
左サイドバーの`Export Connections`をクリックし、対象クラスタを選択して`EXPORT`をクリックする。
![1699583572615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/52ebc52c-c029-9a8a-1b7e-0088c5eaa58e.png)

すると、ブラウザ上でダウンロードが始まる。
ダウンロードが完了すると、`exportConnection_YYYYMMDD.json`という形式のjsonファイルを確認することが出来る。
これの中身は以下のようになっている。
```json
[
  {
    "connectionNumber": 1,
    "clusterNickname": "test-gem-cluster",
    "clusterHost": "gemfire1-locator.gemfire-dev.svc",
    "clusterPort": 7070,
    "clusterSecurityType": "None"
  }
]
```
これを使ってクラスタの登録状況が元に戻せるかを確認する。
`Dashboard`からクラスタの左のハンバーガーをクリックし、`Remove Connection`を選択する。
![1699583734675.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e6f8cc88-b1b3-ef2a-9ecc-6ca47f08017f.png)


クラスタの一覧が空になった状態で、先程のjsonをImportする。
`Import Connections`で先程のjsonファイルを選択して、`IMPORT CLUSTER CONNECTIONS`を選択する。
![1699583795968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/7a770364-c38e-5d0a-80e1-33df4535e0d8.png)

`Dashboard`から先程削除したクラスタが見えるようになっていることが確認できた。
![1699583846974.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/94ce2b57-c2f2-2dcd-af7e-a8caef145bd5.png)


## まとめ
VMware GemFire Management Consoleは、GemFire単品だと基本CLIであるが故に弱かった可視化のところを非常に助けてくれるかなり有用なツールだった。
GUIは他にもPulseがあるが、PulseはLocator上で動かすことが多く負荷が気になるのと、ここまでやれることは多くなかったので、Pulseの上位製品と考えて問題ない。
GemFire使う際は、まずはこれを入れて連携すると、CLIばっかりで挫けそうになった時に助けになると思われる。

## おまけ：GFMCのデータ取得の挙動
Locatorのログを見ると、3分間隔で以下のコマンドを実行していることが分かる。
```
[info 2023/11/28 16:52:17.731 JST locator1 <qtp1148735023-205> tid=0xcd] Executing command: list members

[info 2023/11/28 16:52:17.919 JST locator1 <qtp1148735023-181> tid=0xb5] Executing command: describe member --name=server1

[info 2023/11/28 16:52:18.106 JST locator1 <qtp1148735023-173> tid=0xad] Executing command: describe config --member=server1

[info 2023/11/28 16:52:18.317 JST locator1 <qtp1148735023-173> tid=0xad] Executing command: describe member --name=locator1

[info 2023/11/28 16:52:18.504 JST locator1 <qtp1148735023-204> tid=0xcc] Executing command: describe config --member=locator1

[info 2023/11/28 16:52:18.695 JST locator1 <qtp1148735023-207> tid=0xcf] Executing command: describe member --name=server2

[info 2023/11/28 16:52:18.861 JST locator1 <qtp1148735023-173> tid=0xad] Executing command: describe config --member=server2
```
`list members`を実行してメンバーの一覧取得後、取得したメンバーに対して`describe member`と`describe config`を実行して設定を取得している模様。