VMware GemFireのLocatorの接続方法を確認する

VMware GemFire(旧Tanzu GemFire)ではデータを共有する際、1つのクラスタ内に複数のLocator間を用意して繋げる方法と、Gateway Sender/Receiverを用いて繋げる方法（マルチサイト(WAN)設定）がある。

■Locator間を接続した場合の構成（[引用元](https://docs.vmware.com/en/VMware-GemFire/10.0/gf/topologies_and_comm-topology_concepts-how_member_discovery_works.html)）
![1696412119396.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/99073e42-0d2e-b03c-6ed2-b756447ab245.png)
■Gateway Sender/Receiverを用いて接続した場合（マルチサイト(WAN)設定）の構成（[引用元](https://docs.vmware.com/en/VMware-GemFire/10.0/gf/topologies_and_comm-multi_site_configuration-multisite_overview.html)）
![1696412282029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b5877516-dd86-9c16-61c7-a0e44c7fb076.png)


ここではそれぞれの設定方法を紹介する。

なお、今回VMを2台用意し、以下の設定値で設定を行った。
- Server1
  - IP: 10.215.76.208
  - Locator Port: 9001
- Server2
  - IP: 10.215.72.112
  - Locator Port: 9002

## Locator間の接続
### Server1側の設定
gfshを起動し、LocatorとServerを作成する。
```sh
start locator --name locator1 --bind-address <Server1のIP> --port 9001 --locators=<Server1のIP>[9001],<Server2のIP>[9002]
start server --name server1 --server-bind-address=<Server1のIP> --locators=<Server1のIP>[9001],<Server2のIP>[9002]
```
ポイントとしては、`--locators`でServer2の起動予定のLocatorを指定している点となる。
探しに行っているかどうかはgfsh実行ディレクトリの`./<Locator名>/<Locator名>.log`を見ると確認できる。
次にRegionを作成し、データを格納する。
```sh
create region --name=regionA --type=PARTITION
put --region=regionA --key="1" --value="one"
put --region=regionA --key="2" --value="two"
```
これを後でServer2側から見れるかを確認する。

### Server2側の設定
基本的にはServer1で叩いたコマンドと同じとなる。
```sh
start locator --name locator2 --bind-address <Server1のIP> --port 9002 --locators=<Server2のIP>[9001],<Server2のIP>[9002]
start server --name server2 --server-bind-address=<Server2のIP> --locators=<Server1のIP>[9001],<Server2のIP>[9002]
```
### 動作確認
Server2の方から確認する。
もし一度gfshを抜けた場合は`connect --locator <Server2のIP>[9002]`で接続し直す。
まずメンバーとRegionを確認する。
```sh
gfsh>list members
Member Count : 4

  Name   | Id
-------- | ----------------------------------------------------------------
server2  | wdc-10-215-72-112(server2:9009)<v3>:41125
locator1 | 10.215.76.208(locator1:9838:locator)<ec><v0>:43853 [Coordinator]
server1  | wdc-10-215-76-208(server1:10008)<v1>:58029
locator2 | 10.215.72.112(locator2:8823:locator)<ec><v2>:60147
``` 
```
gfsh>list region
List of regions
---------------
regionA
```
それぞれ、Server1で作成したものが確認できる。
Server1でputした値が取れるかも確認する。
```sh
gfsh>query --query="select * from /regionA"
Result : true
Limit  : 100
Rows   : 2

Result
------
one
two
```
問題なく取得できた。

## Gateway Sender/Receiverを用いた接続
Locator間の接続で確認したLocator等は削除した状態で始めるものとする。

### Server1側の設定
LocatorとServerを起動する。
```sh
start locator --name locator1 --bind-address <Server1のIP> --port 9001 --J=-Dgemfire.distributed-system-id=1 --J=-Dgemfire.remote-locators=<Server2のIP>[9002]
configure pdx --read-serialized=true --disk-store
start server --name server1 --server-bind-address=<Server1のIP> --locators=<Server1のIP>[9001] --J=-Dgemfire.distributed-system-id=1 --J=-Dgemfire.remote-locators=<Server2のIP>[9002]
```
`distributed-system-id`はWANを挟んで通信するようなクラスタを跨いだ構成の場合、どのクラスタからのメッセージかを識別するために設定する。
`remote-locators` はクラスタ跨ぎで接続する際に接続先を指定する。
それぞれの詳細な説明は[こちら](https://docs.vmware.com/en/VMware-GemFire/10.0/gf/reference-topics-gemfire_properties.html)。
`configure pdx`の部分は、Portable Data eXchange (PDX) と呼ばれるデータをシリアライズさせる設定であり、これがないとクラスタ間で接続しても別クラスタのデータが読めないため設定する。

次にGateway Sender/ReceiverとRegionを作成する。
```sh
create gateway-sender --id=rhel8-1 --parallel=true --remote-distributed-system-id=2
create region --name=regionA --type=PARTITION --gateway-sender-id=rhel8-1
create gateway-receiver
```
Gateway Sender作成時、`--parallel`を指定しているが、Gateway Senderによるデータの送信方法にSerialとParallelがあり、どちらを使うかを指定している。
それぞれの違いはここでは割愛するが、データの順序性を気にするならSerial、スループットを気にするならParallelを選ぶとよい。
[この辺](https://docs.vmware.com/en/VMware-GemFire/10.0/gf/topologies_and_comm-multi_site_configuration-multisite_overview.html#parallel-gateway-senders-4)に公式ドキュメントの説明がある。
また、Region作成時に`--gateway-sender-id`でRegionと紐付けるGateway Senderを指定する。

最後にデータをputする。
```sh
put --region=regionA --key="1" --value="one"
put --region=regionA --key="2" --value="two"
```

### Server2側の設定
LocatorとServerを作成する。Server1の設定の値が逆になるような感じで設定する。
```sh
start locator --name locator2 --bind-address <Server2のIP> --port 9002 --J=-Dgemfire.distributed-system-id=2 --J=-Dgemfire.remote-locators=<Server2のIP>[9001]
configure pdx --read-serialized=true --disk-store
start server --name server2 --server-bind-address=<Server2のIP> --locators=<Server2のIP>[9002] --J=-Dgemfire.distributed-system-id=2 --J=-Dgemfire.remote-locators=<Server1のIP>[9001]
```

次にGateway Sender/ReceiverとRegionを作成する。
```sh
create gateway-sender --id=rhel8-2 --parallel=true --remote-distributed-system-id=1
create region --name=regionA --type=PARTITION --gateway-sender-id=rhel8-2
create gateway-receiver"
```
同一クラスタ内でLocator同士を繋げた時と異なり、Regionは作成する必要がある。

### 動作確認
Server2の方から確認する。
もし一度gfshを抜けた場合は`connect --locator <Server2のIP>[9002]`で接続し直す。
まずメンバーを確認する。
```sh
Cluster-2 gfsh>list members
Member Count : 2

  Name   | Id
-------- | -----------------------------------------------------------------
server2  | wdc-10-215-72-112(server2:17305)<v1>:47190
locator2 | 10.215.72.112(locator2:17154:locator)<ec><v0>:56614 [Coordinator]

``` 
別クラスタのメンバーまでは見えないため、Server2のメンバーのみ表示された。

Server1でputした値が取れるかも確認する。
```sh
Cluster-2 gfsh>query --query="select * from /regionA"
Result : true
Limit  : 100
Rows   : 2

Result
------
two
one
```
メンバーは存在しないが、問題なく取得できた。