この記事は、
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を作成していきます。
作成した記事が消えた時のショックはデカすぎる。。。


















