MySQL ReplicationのStackを作る(Rancher 2.0 Tech Preview版)


説明不足気味なので、適宜注釈を入れたい。。。

# 目的

Rancher 2.0で任意のStackを作成するための手順を整理する。
例として MySQLのレプリケーション構成を利用する。

# 注意

**Tech Preview** だからな!!

# 手順
##  MySQLのMasterを準備
![Kobito.EAfbk2.png](https://qiita-image-store.s3.amazonaws.com/0/40692/9dc8490f-89d0-f360-e5cb-ae443849227f.png "Kobito.EAfbk2.png")


```bash:MySQLMasterのコマンド内容
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
```


![Kobito.soxioE.png](https://qiita-image-store.s3.amazonaws.com/0/40692/9d70163c-df59-cb24-5dd6-ddb506b6512e.png "Kobito.soxioE.png")


## MySQLのMasterのside-kickを準備

```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

```

Dockerコンテナのコマンドとして実行しなければいけないので、ワンライナー化する。

```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"
```

![Kobito.FcRaxG.png](https://qiita-image-store.s3.amazonaws.com/0/40692/1818095f-7ca7-6e1b-07e1-fb0a495f361e.png "Kobito.FcRaxG.png")

コマンドにはワンライナー化したコマンドを指定する。

![Kobito.PvxMxM.png](https://qiita-image-store.s3.amazonaws.com/0/40692/33eb3938-f77a-57c7-8060-df7ba11b15e8.png "Kobito.PvxMxM.png")

## MySQLのSlaveを準備

```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
```

![Kobito.b5X7Xh.png](https://qiita-image-store.s3.amazonaws.com/0/40692/198fa66e-d846-addd-c000-f383e8b906e9.png "Kobito.b5X7Xh.png")


ホストをまたいだパケットが通らないので。
![Kobito.tcMgPT.png](https://qiita-image-store.s3.amazonaws.com/0/40692/1776d6a3-d46d-16d0-7593-bc4357a6276b.png "Kobito.tcMgPT.png")

![Kobito.NS9FYF.png](https://qiita-image-store.s3.amazonaws.com/0/40692/826a75f0-344e-df57-4bfa-a85f6864a222.png "Kobito.NS9FYF.png")

## MySQLのSlaveのside-kickを準備

```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:MySQLSlaveのサイドキックコンテナで実行するコマンド(ワンライナー版)
/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.alAcGx.png](https://qiita-image-store.s3.amazonaws.com/0/40692/5ebd633e-2c0e-dc40-e57b-f21879b8b9b9.png "Kobito.alAcGx.png")

![Kobito.TSFQnr.png](https://qiita-image-store.s3.amazonaws.com/0/40692/547f56cd-4610-4183-f703-ee10fb82766c.png "Kobito.TSFQnr.png")


一旦ここまでで完成。
![Kobito.HrcZFt.png](https://qiita-image-store.s3.amazonaws.com/0/40692/5bbd961b-a8ea-1a40-534d-b9acbec5bdb1.png "Kobito.HrcZFt.png")


下図のとおり、slaveコンテナからmasterは見えている。
![Kobito.MPfC0U.png](https://qiita-image-store.s3.amazonaws.com/0/40692/1738487d-9ac7-850b-76b0-2590c085c4df.png "Kobito.MPfC0U.png")


# config.yml

config.ymlは出力できたが、まだこれを使ってのインポートにはバグがある模様。
まあ、Tech Previewだし...

```yaml:config.yml
version: "2"
services:
  MySQLMaster:
    command: [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]
    environment:
    - MYSQL_ROOT_PASSWORD=root
    image: mysql:5.7
    labels:
      io.rancher.container.pull_image: always
    ports:
    - 3306:3306/tcp
    stop_signal: SIGTERM
    restart: always
    stdin_open: true
    tty: true
    scale: 1
  MySQLMasterSidekick:
    command: [/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']
    image: mysql:5.7
    labels:
      io.rancher.container.pull_image: always
    network_mode: container:MySQLMaster
    stop_signal: SIGTERM
    restart: "no"
    stdin_open: true
    tty: true
    scale: 1
  MySQLSlave:
    command: [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]
    environment:
    - MYSQL_ROOT_PASSWORD=root
    image: mysql:5.7
    labels:
      io.rancher.container.pull_image: always
      io.rancher.scheduler.affinity:container: mysqlreplication-mysqlmaster-1
    stop_signal: SIGTERM
    restart: always
    stdin_open: true
    tty: true
    scale: 1
  MySQLSlaveSidekick:
    command: [/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']
    image: mysql:5.7
    labels:
      io.rancher.container.pull_image: always
    network_mode: container:MySQLSlave
    stop_signal: SIGTERM
    restart: on-failure
    stdin_open: true
    tty: true
    scale: 1
```