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



この記事は、[RancherでMySQLのレプリケーション構成スタックを作る(前編)](https://qiita.com/RyoMa_0923/items/794464cd8120ce2db79f)の続編となります。

# 目的

前回の記事でMySQLのMaster-Slave構成に置けるMaster部分の作成が完了しました。
今回の記事ではレプリケーション先となるSlave構成の作成を行います。


# 全体の構成

最終的に目指す構成は以下のようになります。

![Kobito.qMj4uk.png](https://qiita-image-store.s3.amazonaws.com/0/40692/2476ac32-3626-77e7-964f-5588593a38ab.png "Kobito.qMj4uk.png")


前回はここまで作成済みです。
![Kobito.sdyGJQ.png](https://qiita-image-store.s3.amazonaws.com/0/40692/0b62e834-7967-d3c0-2cc9-981ca2c1a7e8.png "Kobito.sdyGJQ.png")


# 全体の流れ

今回は MySQL Slaveサービスの作成を進めます。

1. MySQL Slaveサービスを作成
2. MySQL Slaveのサイドキックコンテナを作成
3. MySQL Slaveへのアクセス用のLBを作成

今回は MySQL Slaveの作成までで、カタログ化は後編にします。

# 個別手順

## MySQL Slaveサービスの作成

`Stacks` -> `User`を選択します。

![Kobito.uTsyAN.png](https://qiita-image-store.s3.amazonaws.com/0/40692/576346ae-5342-47da-0953-73e315939e56.png "Kobito.uTsyAN.png")

![Kobito.8UmBHB.png](https://qiita-image-store.s3.amazonaws.com/0/40692/d7d13ef4-36c8-1f90-6ae0-87fe1e01f0e7.png "Kobito.8UmBHB.png")

MySQL Replicationを選択します。

![Kobito.I4Iuld.png](https://qiita-image-store.s3.amazonaws.com/0/40692/07847c1b-e6b2-1e99-4632-1cc92f87e10c.png "Kobito.I4Iuld.png")

`Add Service`ボタンを選択します。

![Kobito.UlfLz1.png](https://qiita-image-store.s3.amazonaws.com/0/40692/4cd3bb3b-2137-6bec-8f39-ea16cbacd08c.png "Kobito.UlfLz1.png")

（１）コンテナは１つのみとします
（２）名前に`MySQLSLave`を指定します
（３）イメージにはMasterと同じく`mysql:5.7`を利用します
（４）MySQL Masterコンテナとの接続のため、Service Linkを作成します


同じ画面でコンテナ起動時のコマンドおよび、環境変数を設定します。

![Kobito.HxRHxP.png](https://qiita-image-store.s3.amazonaws.com/0/40692/76bf1b3b-11de-25c1-4137-4cab1f4d2281.png "Kobito.HxRHxP.png")

（１）コンテナの起動時プロセス(コマンド?)として`mysqld`を指定します
（２）環境変数に`MySQL_ROOT_PASSWORD`を指定します

mysqldのオプションとしては基本的に`MySQLMaster`のものと同じですが、
`server-id`のみ違う値(ここでは102)を指定します。

```bash:MySQLSlaveの起動コマンド
mysqld --port=3306 --server-id=102 --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
```

しなくてもいいですが、`Networking`設定を入れておきます。

![Kobito.ihmV64.png](https://qiita-image-store.s3.amazonaws.com/0/40692/63f90767-62e9-1536-9360-b286befd0076.png "Kobito.ihmV64.png")

（１）コンテナのホスト名として`Use the container name`を利用します。

最後に`Scheduling`設定を行います。

![Kobito.JqCcl6.png](https://qiita-image-store.s3.amazonaws.com/0/40692/63647e6a-8646-f427-0d1d-c679f06c2893.png "Kobito.JqCcl6.png")

今回は、MySQLReplicationスタックのMySQLMasterサービスと同じ
ホスト上に載らないように以下の設定を行います。

（１）`Automatically pick~~` で自動でサービスを起動させるホストを指定します。
（２）〜（４）同じホストでなるべく起動しないよう設定


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

`Add Sidekick Container`ボタンを選択

![Kobito.rG2gfk.png](https://qiita-image-store.s3.amazonaws.com/0/40692/8010f8d9-265d-4098-52df-6831f93d063e.png "Kobito.rG2gfk.png")


![Kobito.PWen7v.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f5a72ba5-1498-430a-df62-9c62326c4f4f.png "Kobito.PWen7v.png")

（１）メインのコンテナ(MySQLSlave)とセットで動けば良いので`Run 1 container`を指定します
（２）サイドキックコンテナの名前として`MySQLSlaveSidekick`を設定します
（３) イメージには `mysql:5.7`を指定します

次にMySQLSlaveSidekickの起動コマンドを指定します。
以下のようなコマンドをワンライナー化します。
(内部的には、MySQLMasterの起動待ちとMySQLSlaveコンテナをMySQLのSlaveとしての設定すると
いったことを行なっています。)

```bash:MySQLSlaveのサイドキックコンテナの起動コマンド
while :;
    do sleep 10;
    if [ `mysqladmin -h MySQLMaster -u root -proot | grep alive | wc -l` -eq 1 ]; then
        echo "master alive";
        if [ `mysqladmin -h MySQLSlave -u root -proot | grep alive | wc -l` -eq 1 ]; then
            echo "slavealive";
            mysql -u root -proot -h MySQLSlave -e "CHANGE MASTER TO MASTER_HOST='MySQLMaster', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1; START SLAVE;";
            sleep 10;
            mysql -u root -proot -h 10.42.2.11 -e "show slave status\G";
            break;
        fi
    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 \"master alive\"; if [ `mysqladmin -h MySQLSlave -u root -proot | grep alive | wc -l` -eq 1 ]; then echo \"slave also alive\"; mysql -u root -proot -h MySQLSlave -e \"CHANGE MASTER TO MASTER_HOST='MySQLMaster', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1; START SLAVE;\"; sleep 10; mysql -u root -proot -h MySQLSlave -e \"show slave status\\G\";break; fi fi done"
```

![Kobito.lTaOWh.png](https://qiita-image-store.s3.amazonaws.com/0/40692/afdb337d-acc4-b4b2-7735-59f9f7919913.png "Kobito.lTaOWh.png")

（１）先ほど記載の起動コマンドを指定します
（２）一回動けばよいので、`Auto Restart`は`Never`を指定します

あとは起動をサイドキックコンテナの起動を待ちます。
`show slave status \G`の結果が表示されれば正常にレプリケーション設定が完了しているはずです。

![Kobito.iZiWso.png](https://qiita-image-store.s3.amazonaws.com/0/40692/2f69093b-ea23-f64a-b4e8-68d4aef134b4.png "Kobito.iZiWso.png")

## アクセス用のLBの作成

MySQL SlaveにアクセスするためのLBを作成します。

MySQLReplication stackの画面で `Add Serviceのドロップダウンメニュー`を選択し、
`Add Load Balancer`を選択します。

![Kobito.Q1Y21f.png](https://qiita-image-store.s3.amazonaws.com/0/40692/67addfad-ecb7-6d3d-cf4f-46ca3c35b32f.png "Kobito.Q1Y21f.png")

LBの作成を行います。


![Kobito.Ej8vrD.png](https://qiita-image-store.s3.amazonaws.com/0/40692/200feaa7-13e1-8c0d-4cb0-6c18ab979fc9.png "Kobito.Ej8vrD.png")


（１）全てのホストからMySQLのSlaveコンテナにアクセスできるよう`Always run one~`を選択します
（２）LBの名前は`MySQLSlaveLoadBalancer`とします
（３）外部からのアクセスのため `Public`を選択し、TCPの3307番で待ち受けます
（４）トラフィックを転送する先のコンテナに`MySQLSlave`、ポートとして`3306番`を指定します

上記設定が完了後に`Create`ボタンをクリックしてLBを作成します。

動作確認の為、Rancherのホストにアクセスして`show slave status`を投げてみます。

```bash:MySQLSlaveへのアクセス確認
$ mysql -u root -p -h 192.168.0.8 -P 3307
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.20-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: MySQLMaster
                  Master_User: repl
                  Master_Port: 3306
~~~~~~~~~~(中略)~~~~~~~~~

$ mysql -u root -p -h 192.168.0.7 -P 3307
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.20-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: MySQLMaster
                  Master_User: repl
                  Master_Port: 3306

```

ここまでで、MySQLのSlaveコンテナとコンテナにアクセスするためのLBコンテナを確保できました。

# まとめ

ここまでの作業で以下の環境を実現できました。

![Kobito.h8I9K5.png](https://qiita-image-store.s3.amazonaws.com/0/40692/340b3821-7e84-1e8d-efca-169ca5f6cc37.png "Kobito.h8I9K5.png")

次回は、これらのカタログ化について説明します。