Couchbaseの検証環境をcouchbase-cliで作成

# 概要
Couchbase の検証用環境を作成してみます。マニュアルを参考に Docker を利用してコンテナ上に 3 ノードのクラスタを構成しますが、マニュアルに手順がきちんと書いてあるので、あえてコンソールを使わずにcouchbase-cliを利用してみました。
参考：Couchbase Server 6.6マニュアル - [Deploy a Multi-Node Cluster with Containers](https://docs.couchbase.com/server/current/install/getting-started-docker.html#section_msh_fbl_42b)

# 作業手順
### 環境
以下の環境で作業を実施しました。

```bash
$ cat /etc/centos-release
CentOS Linux release 8.3.2011
$ docker -v
Docker version 20.10.6, build 370c289
```

### コンテナの起動
公式の Couchbase Server のコンテナイメージの取得と実行を行います。Couchbase のコンテナイメージは docker run コマンドの初回実行時にダウンロードされます。ここでは使用しませんが、コンソールからの操作ができるようマニュアル準拠でポートマッピングを 1 コンテナで指定しておきます。

```bash
# コンテナの起動
$ docker run -d --name cb1 -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase
$ docker run -d --name cb2 couchbase
$ docker run -d --name cb3 couchbase

# 起動状態の確認
$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS         PORTS                                                                                                                                                              NAMES
2506eb07bf2c   couchbase   "/entrypoint.sh couc…"   4 seconds ago    Up 2 seconds   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp                                                                                                         cb3
e4059b1a5457   couchbase   "/entrypoint.sh couc…"   4 seconds ago    Up 3 seconds   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp                                                                                                         cb2
34b717d68b3c   couchbase   "/entrypoint.sh couc…"   10 seconds ago   Up 8 seconds   0.0.0.0:8091-8096->8091-8096/tcp, :::8091-8096->8091-8096/tcp, 11207/tcp, 0.0.0.0:11210-11211->11210-11211/tcp, :::11210-11211->11210-11211/tcp, 18091-18096/tcp   cb1
```

コンソールを使用する場合、URL は以下から確認可能です。

```bash
$ docker logs cb1
Starting Couchbase Server -- Web UI available at http://<ip>:8091
and logs available in /opt/couchbase/var/lib/couchbase/logs
```

CLIを使用してCouchbase クラスタを構成する際には各コンテナのIPアドレスを指定するので、確認しておきます。

```bash
$ for name in {cb1,cb2,cb3}; do
    ipaddr=`docker inspect --format '{{.NetworkSettings.IPAddress}}' ${name}`
  echo "${name} : ${ipaddr}"
  done
cb1 : 172.17.0.2
cb2 : 172.17.0.3
cb3 : 172.17.0.4
```

### クラスタの初期構成
まずはいずれか 1 ノードでクラスタの初期構成（名前やメモリ割り当ての設定など）を行います。初期構成は [couchbase-cli cluster-init](https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-cluster-init.html) で行います。ここでは、cb1 に接続して実施しています。

```bash
# コンテナに接続
$ docker exec -it cb1 /bin/bash

# クラスタの初期構成
root@34b717d68b3c:/# couchbase-cli cluster-init         \
  --cluster couchbase://localhost  \    # 初期クラスタを構成するノードのホスト（couchbase://<addr>）
  --cluster-username Administrator \    # 管理ユーザの名前。
  --cluster-password password      \    # 管理ユーザのパスワード
  --cluster-name TestCluter        \    # クラスタ名
  --cluster-port 8091              \    # クラスタのポート番号。デフォルトは8091
  --services data,index,query,fts  \    # ノードで有効化するサービス。あとからの変更不可。最初のノードにはdataが必須
  --cluster-ramsize 2048           \    # Data Serviceで使用するメモリの上限値(MB)、クラスタ内の共通設定で新規ノード追加時にも適用されます
  --cluster-index-ramsize 512      \    # Index Serviceで使用するメモリの上限値（MB）、同上
  --cluster-fts-ramsize 512        \    # Full-Text Serviceで使用するメモリの上限値（MB）、同上
  --index-storage-setting default       # インデックスのストレージモードをdefault/memoptから選択、デフォルトはdefault
 
# クラスタ構成の確認
root@34b717d68b3c:/# couchbase-cli server-list -c couchbase://172.17.0.2 -u Administrator -p password
ns_1@cb.local 172.17.0.2:8091 healthy active
```

### クラスタへのノード追加
クラスタの初期構成が完了したので、残る cb2, cb3 もクラスタへ追加します。クラスタへの追加は [couchbase-cli server-add](https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-server-add.html) で行います。実行時にはユーザ情報と追加するノード、および稼働させるサービスを指定します。
※ 引数の指定順が入れ替わるとエラーになったので、マニュアル準拠の指定順としたほうがよさそうです。

```bash
# ノードの追加
root@34b717d68b3c:/# couchbase-cli server-add                                   \
  --cluster couchbase://172.17.0.2                           \   # ノードを追加する対象クラスタ
  --username Administrator                                   \   # 管理ユーザの名前
  --password password                                        \   # 管理ユーザのパスワード
  --server-add-username Administrator                        \   # サーバ追加に応じたクラスタ構成変更が可能なユーザの名前
  --server-add-password password                             \   # サーバ追加に応じたクラスタ構成変更が可能なユーザのパスワード
  --server-add http://172.17.0.3:8091,http://172.17.0.4:8091 \   # 追加するサーバをカンマ区切りで指定
  --services data,index                                          # 有効化するサービスを指定

# 追加を確認
root@34b717d68b3c:/# couchbase-cli server-list -c couchbase://172.17.0.2 -u Administrator -p password
ns_1@172.17.0.2 172.17.0.2:8091 healthy active
ns_1@172.17.0.3 172.17.0.3:8091 healthy inactiveAdded
ns_1@172.17.0.4 172.17.0.4:8091 healthy inactiveAdded
```

サーバ一覧に追加したノードがリストされるため、クラスタへの追加が完了しました。

### リバランスの実行
ノード追加後のリバランスを実行していないため、追加ノードは "inactiveAdded" 状態になっています（詳細はマニュアル：[Add a Node and Rebalance](https://docs.couchbase.com/server/current/manage/manage-nodes/add-node-and-rebalance.html) を参照）。そのため、[couchbase-cli rebalance](https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-rebalance.html) でリバランスを実行します。

```bash
# リバランスの実行
root@34b717d68b3c:/# couchbase-cli rebalance -c couchbase://172.17.0.2 -u Administrator -p password
```

これにより、追加ノードがアクティブとなります。クラスタ状態を [couchbase-cli server-info](https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-server-info.html) から確認してみます。これにより、ノードで稼働するサービス一覧などのより詳細ない情報を確認することができます。couchbase-cli server-info 実行時には確認対象ノードへの接続情報が必要になるため、まずはそれらを couchbase-cli host-list で取得し、while で順次ノードへ問い合わせています。couchbase-cli server-info コマンドで取得される情報は JSON 形式で帰ってくるため、ここでは jq で一部の情報のみを抽出しています。

```bash
# コンテナにjqがなかったのでexit
root@34b717d68b3c:/# exit

# リバランス後のサーバ状態の確認
$ docker exec cb1 couchbase-cli host-list -c couchbase://172.17.0.2 -u Administrator -p password | \
  while read line ; do
    docker exec cb1 couchbase-cli server-info -c ${line} -u Administrator -p password | jq -cr '{host: .hostname, status: .status, clusterMembership: .clusterMembership, services: .services}'
  done
{"host":"172.17.0.2:8091","status":"healthy","clusterMembership":"active","services":["fts","index","kv","n1ql"]}
{"host":"172.17.0.3:8091","status":"healthy","clusterMembership":"active","services":["index","kv"]}
{"host":"172.17.0.4:8091","status":"healthy","clusterMembership":"active","services":["index","kv"]}
```

ノードの状態がすべて"active"であり、稼働サービスもコマンド実行時と一致していることが確認できました。以上で、3 ノードからなるCouchbase クラスタ環境の構成が完了です。