CoreOS/Docker で MariaDB Galera Cluster + MaxScale を動かす

MariaDB Galera Cluster を稼働させる Dockerイメージ 等を GitHub で発見したので手元の環境で試してみました。
なお、2018-07-29現在 MaraiDB Server は 10.3.6 RC を実行できますが、MaxScale は 2.1.9 となっています。

https://github.com/toughIQ/docker-mariadb-cluster
https://hub.docker.com/r/toughiq/mariadb-cluster/
https://hub.docker.com/r/toughiq/maxscale/


# Vagrant で CoreOS を起動

Vagrant を用いて VMware Workstation 12 Pro 上で CoreOS を立ち上げ、SSH で CoreOS VM に接続します。

```
git clone https://github.com/coreos/coreos-vagrant.git
cd coreos-vagrant
vagrant up
vagrant ssh
```

# Swarm Node 初期化

```
docker swarm init --advertise-addr=192.168.8.101
```

NIC が複数ある場合は --advertise-addr オプションで IP アドレスを指定します。今回は1ノードで実行します。

# ネットワークの作成

```
docker network create -d overlay mynet
```

# Galera サービスの作成

--network オプションでさきほど作成したネットワーク名(mynet)を指定します。

```
docker service create --name galera \
  --network mynet \
  --replicas=1 \
  --env DB_SERVICE_NAME=galera \
  --env MYSQL_ROOT_PASSWORD=rootpass \
  --env MYSQL_DATABASE=test \
  --env MYSQL_USER=dbuser \
  --env MYSQL_PASSWORD=dbpwd \
  toughiq/mariadb-cluster:10.3

74i5ld9k69xczfyu3ut9av1jp
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
```

--name オプションで指定するサービス名(galera)と 環境変数 DB_SERVICE_NAME で指定する名前は一致させる必要があります。```docker service ps``` でステータスが確認できます。

```
core@core-01 $ docker service ps galera
ID                  NAME                IMAGE                          NODE                DESIRED STATE       CURRENT STATE                ERROR
   PORTS
24uuqhm7p0ik        galera.1            toughiq/mariadb-cluster:10.3   core-01             Running             Running about a minute ago
```

# クラスタをスケールさせる

Galeraノード数を3に変更します。

```
core@core-01 ~ $ docker service scale galera=3

galera scaled to 3
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged

```

再び ```docker service ps galera``` を実行してみます。

```
core@core-01 $ docker service ps galera
ID                  NAME                IMAGE                          NODE                DESIRED STATE       CURRENT STATE            ERROR               P
ORTS
24uuqhm7p0ik        galera.1            toughiq/mariadb-cluster:10.3   core-01             Running             Running 2 minutes ago
0lz0fphiqk4h        galera.2            toughiq/mariadb-cluster:10.3   core-01             Running             Running 38 seconds ago
nlyfjvmyjdtl        galera.3            toughiq/mariadb-cluster:10.3   core-01             Running             Running 38 seconds ago
```

# MaxScale サービスを作成

```
docker service create --name mxs \
  --network mynet \
  --env DB_SERVICE_NAME=galera \
  --env ENABLE_ROOT_USER=1 \
  --publish 3306:3306 \
  toughiq/maxscale:2.1.9

4krr51tx9mqy9ku4t8vjgng8w
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
```

```docker service ps``` で作成したサービスを確認します。

```
core@core-01 ~ $ docker service ps mxs
ID            NAME   IMAGE                    NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS
q96p6th7xxma  mxs.1  toughiq/maxscale:2.1.9   core-01  Running        Running 52 seconds ago
```

# maxadmin list servers で Galera Cluster のステータスを確認

MaxScale コンテナ上で ```maxadmin list servers``` を実行して Galera Clusterのステータスを確認してみます。

まず、MaxScale コンテナのIDを確認します。

```
core@core-01 $ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS
               NAMES
91f99246a5c5        toughiq/maxscale:2.1.9         "/docker-entrypoint.…"   12 minutes ago      Up 11 minutes       3306-3307/tcp, 4006/tcp, 4008/tcp, 4442/t
cp, 6603/tcp   mxs.1.2q1znps6f37wt3f8j692rx0mx
d50085824290        toughiq/mariadb-cluster:10.3   "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       3306/tcp, 4444/tcp, 4567-4568/tcp
               galera.3.nlyfjvmyjdtljj6z2q2lvd1tv
0e361381690e        toughiq/mariadb-cluster:10.3   "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       3306/tcp, 4444/tcp, 4567-4568/tcp
               galera.2.0lz0fphiqk4h619hstufbb6m0
3089a575afb0        toughiq/mariadb-cluster:10.3   "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       3306/tcp, 4444/tcp, 4567-4568/tcp
               galera.1.24uuqhm7p0ikvecb4w4yxfnd8         
```

MaxScale の ID は 91f99246a5c5 ですので、以下のコマンドでクラスタのステータスを確認できます。

```
core@core-01 ~ $ docker exec -it 91f99246a5c5 maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
10.0.1.12          | 10.0.1.12       |  3306 |           0 | Slave, Synced, Running
10.0.1.11          | 10.0.1.11       |  3306 |           0 | Master, Synced, Running
10.0.1.10          | 10.0.1.10       |  3306 |           0 | Slave, Synced, Running
-------------------+-----------------+-------+-------------+--------------------
```

# サービスの削除

```
docker service rm galera mxs
```