RancherでMySQLのレプリケーション構成スタックを作る(前編)


この記事は、
[Rancher Advent Calendar 2017](https://adventar.org/calendars/2436)
の18日目の記事になります。

# 注意

記事作成途中でデータが全て消えてしまったため、MySQLのMasterの作成部分までです。
(なんてクリスマス...)
Slave部分については後日掲載します。

この中では、あえてDocker公式のMySQL 5.7のコンテナイメージを使用していますが、
ある程度設定済みのコンテナイメージを準備することでよりシンプルに構成することが可能です。

# 全体の構成

MySQLの非同期レプリケーションスタックを作成します。
最終的に実現する構成は以下の通りになります。

![Kobito.plkTEv.png](https://qiita-image-store.s3.amazonaws.com/0/40692/40d18d21-af32-ba00-a8a7-0bfbac2ef5d3.png "Kobito.plkTEv.png")

前提: MySQLの非同期レプリケーション構成を作成します。
① DockerHost1または2の特定ポートへのアクセスでCRUDのうちのCUD(作成、更新、削除)を実現します。
② DockerHost1または2の特定ポートへのアクセスでCRUDのうちのR(読込)を実現します。


# 全体の流れ

１. MySQL Masterサービスを作成
２. MySQL Masterのサイドキックコンテナを作成
３. MySQL Masterへのアクセス用LB作成

（↑本記事ではここまで）

（↓以降は後日掲載）

４. MySQL Slaveサービスを作成
５. MySQL Slaveのサイドキックコンテナを作成
６. MySQL Slaveへのアクセス用のLBを作成
７. カタログ化

とはいえ、前半ができて仮想マシンを使ったMySQLのレプリケーション構成を
組んだことのある人であればゴールまでは早いかと思います。

# 個別手順

## MySQL Masterサービスの作成


### MySQL Replicationスタックの作成

![Kobito.LUnyEn.png](https://qiita-image-store.s3.amazonaws.com/0/40692/a95187ef-513c-0467-71ba-e273942a104d.png "Kobito.LUnyEn.png")

`Stack`から`All`また`User`を選択します。

![Kobito.Lcqt4N.png](https://qiita-image-store.s3.amazonaws.com/0/40692/529580a5-49ab-9aec-a411-9971a542ee45.png "Kobito.Lcqt4N.png")

`Add Stack`ボタンをクリックします。

![Kobito.e2eMIE.png](https://qiita-image-store.s3.amazonaws.com/0/40692/dd99e50d-2a4b-1b21-398e-4490c9645c5c.png "Kobito.e2eMIE.png")

すると、なにもサービスなどが含まれていないからのMySQL Replicationスタックが作成されます。

### MySQL Masterサービスの作成

スタック一覧の画面から`MySQLReplication`スタックを選択します。

![Kobito.rIZlK0.png](https://qiita-image-store.s3.amazonaws.com/0/40692/c7db3535-ae6a-f07b-8429-6ed4baa85e41.png "Kobito.rIZlK0.png")

`Add Service`ボタンをクリックします。

![Kobito.k2Vg3j.png](https://qiita-image-store.s3.amazonaws.com/0/40692/3cebeeff-b480-9d23-6214-205ee714189b.png "Kobito.k2Vg3j.png")

![Kobito.1k2BvH.png](https://qiita-image-store.s3.amazonaws.com/0/40692/3541eb08-4574-731e-4b8c-8514f57a91d8.png "Kobito.1k2BvH.png")

（１）MySQLのMasterコンテナなので、一つだけのコンテナを実行するようにします。
（２）コンテナの名前を`MySQLMaster`とします。
（３）利用するイメージは`mysql:5.7`とします。

#### コマンド設定

![Kobito.ctxFbm.png](https://qiita-image-store.s3.amazonaws.com/0/40692/638ba8d9-1174-621b-98d6-a0a7a94e2da9.png "Kobito.ctxFbm.png")

（１）コンテナ起動時のコマンドとして以下の内容を指定します。

```bash:起動時コマンド指定
mysqld --port=3306 --server-id=101 --character-set-server=utf8mb4 \
	--datadir=/var/lib/mysql --log-error=/var/log/mysql/error.log \
	--slow-query-log --slow-query-log-file=/var/log/mysql/slow_query_log.log \
	--long-query-time=5 --log-bin --max-connections=4096 --gtid-mode=on \
	--enforce-gtid-consistency=on
```

（２）`Add Environment Variables`を選択して環境変数を指定できるようにします。
（３）環境変数を指定します。今回は`MYSQL_ROOT_PASSWORD = root`を指定します。

#### ネットワーキング設定

![Kobito.SJZj96.png](https://qiita-image-store.s3.amazonaws.com/0/40692/d6e11d8e-91f6-7526-ef46-23cda4b21ce7.png "Kobito.SJZj96.png")

`Use the container name`を指定します。

ここまで完了したら MySQLMasterのサイドキック作成に進みます。

### MySQL Masterのサイドキックコンテナの作成

`Add Sidekick Container`ボタンをクリックします。

![Kobito.BpozdA.png](https://qiita-image-store.s3.amazonaws.com/0/40692/681d9066-8755-9391-e3cf-2c3e05f40136.png "Kobito.BpozdA.png")

コンテナの名前と利用するコンテナイメージを選択します。

（１）コンテナの名前には`MySQLMasterSidekick`を指定します。
（２）イメージは`mysql:5.7`を利用します。(mysqlクライアントが利用できればなんでも良い。)


![Kobito.x67D8t.png](https://qiita-image-store.s3.amazonaws.com/0/40692/3c6acd09-6c7f-3498-a19c-5953606cc99a.png "Kobito.x67D8t.png")


#### コマンド設定

コマンドとしてMySQLのレプリケーションのマスターとして必要なコマンドを投入します。

![Kobito.4NvjwD.png](https://qiita-image-store.s3.amazonaws.com/0/40692/90b44e43-8589-8b37-f720-93ae396b82c1.png "Kobito.4NvjwD.png")

具体的には、MySQLMasterのMySQLが起動完了するまで待ち合わせてから、
レプリケーション用のユーザを作成するコマンドの発行をワンライナーで実行しています。

```bash:サイドキックコンテナの起動時コマンド
while :; do
	sleep 10;
	if [ \`mysqladmin -h MySQLMaster -u root -proot | grep alive | wc -l\` -eq 1 ]; then
		echo \"alive\";
		mysql -u root -proot -h MySQLMaster -e \"CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
		GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';\";
		break;
	fi
done
```

ワンライナー化した場合は、以下のようになります。


```bash:ワンライナー化した起動時コマンド
/bin/bash -c "while :; do sleep 10; if [ `mysqladmin -h MySQLMaster -u root -proot | grep alive | wc -l\` -eq 1 ]; then echo \"alive\"; mysql -u root -proot -h MySQLMaster -e \"CREATE USER 'repl'@'%' IDENTIFIED BY 'repl'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';\"; break; fi done"
```

ここまで設定が完了したら画面下部の`Create`ボタンをクリックするとMySQLMasterのサービスが起動します。

![Kobito.A59AMP.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f7f543ae-dcce-ba5d-37db-e05a6702bfb4.png "Kobito.A59AMP.png")


## MySQL Masterへのアクセス用LB作成

MySQL Masterに2台のDockerhostからアクセスするためのプロキシがわりにLBを作成します。

### LBサービスの作成

MySQLReplicationスタックの画面から`Add Service隣の↓っぽい`ボタンを選択して、
`Add LoadBalancer`をクリックします。

![Kobito.tjX1Lh.png](https://qiita-image-store.s3.amazonaws.com/0/40692/e3b312e2-193e-785a-333b-4a589321d959.png "Kobito.tjX1Lh.png")

ロードバランサの設定を進めます。

![Kobito.Q0v83h.png](https://qiita-image-store.s3.amazonaws.com/0/40692/9a2103b6-6dea-e39c-ba0b-37cc2a1b3d2d.png "Kobito.Q0v83h.png")

（１）全てのホストからアクセスできるように全ホストでLBを起動するように設定します。
（２）Dockerホスト外部からアクセスするので`Public`を指定します。プロトコルには`TCP`を指定します。
（３）外部アクセスの際のTCPポート番号として`3306番`を指定します。
（４）アクセス先のサービスとして先ほど作成した`MySQLMaster`、アクセス先ポートとして`(TCP)3306番`を指定します。
（５）ここまで設定が完了したら`Create`ボタンをクリックします。

### 動作確認

Rancherサーバの管理する全てのDockerHostからアクセスできることを確認します。
した図から分かる通り、192.168.0.7と192.168.0.8のホストの3306番ポートから
MySQLMasterコンテナにアクセスできることを確認します。

![Kobito.gryNCY.png](https://qiita-image-store.s3.amazonaws.com/0/40692/a2389398-eeb6-f778-2730-0a33289fe681.png "Kobito.gryNCY.png")


![Kobito.0d0NV3.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f75a12f9-d1f5-1680-822d-766fccf84296.png "Kobito.0d0NV3.png")

![Kobito.l46N5i.png](https://qiita-image-store.s3.amazonaws.com/0/40692/b2209c89-56cb-300f-2b9b-e3583ffd0b9f.png "Kobito.l46N5i.png")

## ここまでのまとめ

ここまでで、MySQLMasterの環境が出来上がりました。
以下のような形になっています。

![Kobito.bxW8QX.png](https://qiita-image-store.s3.amazonaws.com/0/40692/d2ed21e8-f58a-143b-8e6f-1b86893bd475.png "Kobito.bxW8QX.png")

次回の記事では、MySQLのスレーブコンテナとそれにアクセスするためのLBを作成していきます。


```
作成した記事が消えた時のショックはデカすぎる。。。
```