この記事は、RancherでMySQLのレプリケーション構成スタックを作る(前編)の続編となります。
目的
前回の記事でMySQLのMaster-Slave構成に置けるMaster部分の作成が完了しました。
今回の記事ではレプリケーション先となるSlave構成の作成を行います。
全体の構成
最終的に目指す構成は以下のようになります。
全体の流れ
今回は MySQL Slaveサービスの作成を進めます。
- MySQL Slaveサービスを作成
- MySQL Slaveのサイドキックコンテナを作成
- MySQL Slaveへのアクセス用のLBを作成
今回は MySQL Slaveの作成までで、カタログ化は後編にします。
個別手順
MySQL Slaveサービスの作成
Stacks
-> User
を選択します。
MySQL Replicationを選択します。
Add Service
ボタンを選択します。
(1)コンテナは1つのみとします
(2)名前にMySQLSLave
を指定します
(3)イメージにはMasterと同じくmysql:5.7
を利用します
(4)MySQL Masterコンテナとの接続のため、Service Linkを作成します
同じ画面でコンテナ起動時のコマンドおよび、環境変数を設定します。
(1)コンテナの起動時プロセス(コマンド?)としてmysqld
を指定します
(2)環境変数にMySQL_ROOT_PASSWORD
を指定します
mysqldのオプションとしては基本的にMySQLMaster
のものと同じですが、
server-id
のみ違う値(ここでは102)を指定します。
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
設定を入れておきます。
(1)コンテナのホスト名としてUse the container name
を利用します。
最後にScheduling
設定を行います。
今回は、MySQLReplicationスタックのMySQLMasterサービスと同じ
ホスト上に載らないように以下の設定を行います。
(1)Automatically pick~~
で自動でサービスを起動させるホストを指定します。
(2)〜(4)同じホストでなるべく起動しないよう設定
MySQL Slaveのサイドキックコンテナを作成
Add Sidekick Container
ボタンを選択
(1)メインのコンテナ(MySQLSlave)とセットで動けば良いのでRun 1 container
を指定します
(2)サイドキックコンテナの名前としてMySQLSlaveSidekick
を設定します
(3) イメージには mysql:5.7
を指定します
次にMySQLSlaveSidekickの起動コマンドを指定します。
以下のようなコマンドをワンライナー化します。
(内部的には、MySQLMasterの起動待ちとMySQLSlaveコンテナをMySQLのSlaveとしての設定すると
いったことを行なっています。)
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
これをワンライナー化します。
/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"
(1)先ほど記載の起動コマンドを指定します
(2)一回動けばよいので、Auto Restart
はNever
を指定します
あとは起動をサイドキックコンテナの起動を待ちます。
show slave status \G
の結果が表示されれば正常にレプリケーション設定が完了しているはずです。
アクセス用のLBの作成
MySQL SlaveにアクセスするためのLBを作成します。
MySQLReplication stackの画面で Add Serviceのドロップダウンメニュー
を選択し、
Add Load Balancer
を選択します。
LBの作成を行います。
(1)全てのホストからMySQLのSlaveコンテナにアクセスできるようAlways run one~
を選択します
(2)LBの名前はMySQLSlaveLoadBalancer
とします
(3)外部からのアクセスのため Public
を選択し、TCPの3307番で待ち受けます
(4)トラフィックを転送する先のコンテナにMySQLSlave
、ポートとして3306番
を指定します
上記設定が完了後にCreate
ボタンをクリックしてLBを作成します。
動作確認の為、Rancherのホストにアクセスしてshow slave status
を投げてみます。
$ 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コンテナを確保できました。
まとめ
ここまでの作業で以下の環境を実現できました。
次回は、これらのカタログ化について説明します。