この記事は、
Rancher Advent Calendar 2017
の18日目の記事になります。
注意
記事作成途中でデータが全て消えてしまったため、MySQLのMasterの作成部分までです。
(なんてクリスマス...)
Slave部分については後日掲載します。
この中では、あえてDocker公式のMySQL 5.7のコンテナイメージを使用していますが、
ある程度設定済みのコンテナイメージを準備することでよりシンプルに構成することが可能です。
全体の構成
MySQLの非同期レプリケーションスタックを作成します。
最終的に実現する構成は以下の通りになります。
前提: MySQLの非同期レプリケーション構成を作成します。
① DockerHost1または2の特定ポートへのアクセスでCRUDのうちのCUD(作成、更新、削除)を実現します。
② DockerHost1または2の特定ポートへのアクセスでCRUDのうちのR(読込)を実現します。
全体の流れ
1. MySQL Masterサービスを作成
2. MySQL Masterのサイドキックコンテナを作成
3. MySQL Masterへのアクセス用LB作成
(↑本記事ではここまで)
(↓以降は後日掲載)
4. MySQL Slaveサービスを作成
5. MySQL Slaveのサイドキックコンテナを作成
6. MySQL Slaveへのアクセス用のLBを作成
7. カタログ化
とはいえ、前半ができて仮想マシンを使ったMySQLのレプリケーション構成を
組んだことのある人であればゴールまでは早いかと思います。
個別手順
MySQL Masterサービスの作成
MySQL Replicationスタックの作成
Stack
からAll
またUser
を選択します。
Add Stack
ボタンをクリックします。
すると、なにもサービスなどが含まれていないからのMySQL Replicationスタックが作成されます。
MySQL Masterサービスの作成
スタック一覧の画面からMySQLReplication
スタックを選択します。
Add Service
ボタンをクリックします。
(1)MySQLのMasterコンテナなので、一つだけのコンテナを実行するようにします。
(2)コンテナの名前をMySQLMaster
とします。
(3)利用するイメージはmysql:5.7
とします。
コマンド設定
(1)コンテナ起動時のコマンドとして以下の内容を指定します。
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
(2)Add Environment Variables
を選択して環境変数を指定できるようにします。
(3)環境変数を指定します。今回はMYSQL_ROOT_PASSWORD = root
を指定します。
ネットワーキング設定
Use the container name
を指定します。
ここまで完了したら MySQLMasterのサイドキック作成に進みます。
MySQL Masterのサイドキックコンテナの作成
Add Sidekick Container
ボタンをクリックします。
コンテナの名前と利用するコンテナイメージを選択します。
(1)コンテナの名前にはMySQLMasterSidekick
を指定します。
(2)イメージはmysql:5.7
を利用します。(mysqlクライアントが利用できればなんでも良い。)
コマンド設定
コマンドとしてMySQLのレプリケーションのマスターとして必要なコマンドを投入します。
具体的には、MySQLMasterのMySQLが起動完了するまで待ち合わせてから、
レプリケーション用のユーザを作成するコマンドの発行をワンライナーで実行しています。
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
ワンライナー化した場合は、以下のようになります。
/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のサービスが起動します。
MySQL Masterへのアクセス用LB作成
MySQL Masterに2台のDockerhostからアクセスするためのプロキシがわりにLBを作成します。
LBサービスの作成
MySQLReplicationスタックの画面からAdd Service隣の↓っぽい
ボタンを選択して、
Add LoadBalancer
をクリックします。
ロードバランサの設定を進めます。
(1)全てのホストからアクセスできるように全ホストでLBを起動するように設定します。
(2)Dockerホスト外部からアクセスするのでPublic
を指定します。プロトコルにはTCP
を指定します。
(3)外部アクセスの際のTCPポート番号として3306番
を指定します。
(4)アクセス先のサービスとして先ほど作成したMySQLMaster
、アクセス先ポートとして(TCP)3306番
を指定します。
(5)ここまで設定が完了したらCreate
ボタンをクリックします。
動作確認
Rancherサーバの管理する全てのDockerHostからアクセスできることを確認します。
した図から分かる通り、192.168.0.7と192.168.0.8のホストの3306番ポートから
MySQLMasterコンテナにアクセスできることを確認します。
ここまでのまとめ
ここまでで、MySQLMasterの環境が出来上がりました。
以下のような形になっています。
次回の記事では、MySQLのスレーブコンテナとそれにアクセスするためのLBを作成していきます。
作成した記事が消えた時のショックはデカすぎる。。。