Docker を使って、Master-Slave のレプリケーションを行うMySQLサーバをセットアップするサンプルスクリプトです。
概略
- 一連のスクリプトを順番に実行するだけで、Master-SlaveのMySQLサーバが動きます
- MySQLサーバは、Dockerのコンテナの中で動きます
- DBの実体は、Host側に持ち、それをコンテナがマウントして使います
私は、MySQLもDockerも勉強中で、あまり詳しくありません。本格的な運用に耐えるものではありませんが、gitlabやredmineのような、開発者用のWebアプリを自動バックアップ付きでサクっと立ち上げる時には参考になるかもしれません。
実際に使用する際は、必ずご自分で各スクリプトの内容を確認して、パスワード等を変更してお使いください。
下記のスクリプトを参考にして作成しました。
準備
- Dockerをインストールしたサーバを二台用意してください
- 両方にmysql-client をインストールしてください
- Slave から Master の ポート 3306 に接続できるようにしてください
使い方
Master用ホストで以下のコマンドを実行します。
$ git clone https://github.com/essa/docker-mysql-repl.git
$ cd docker-mysql-repl
$ sudo docker build -t essa/mysql-repl .
$ sudo ./create_repl.sh
$ ./copy_replica.sh SLAVE_HOST
これで、以下のものができます。
- MySQLが動くDocker イメージ
- 初期化されたMasterのDB ( data/mysql )
- レプリケーション用ユーザの設定
- Master と同期した Slave のDB ( replica/ 以下 )
- 確認用の repltest という DBと test というテーブル
次に replica/ 以下のファイルを Slave用ホストに転送します。
Master から Slave にssh できれば、以下のスクリプトで転送できます。
$ ./copy_replica.sh SLAVE_HOST
次にMasterでMySQLを起動します。
$ sudo ./start_master.sh
$ mysql -uroot -proot -h 127.0.0.1 -AN repltest
Slave側でも、転送した replica/ ディレクトリで、Dockerイメージを作成してから、MySQLを起動します。
$ cd replica
$ sudo docker build -t essa/mysql-repl .
$ sudo ./start_slave.sh MASTER_HOST
$ mysql -uroot -proot -h 127.0.0.1 -AN repltest
この状態で、Master側のmysql からデータを追加、変更すると、その結果を Slave側で見ることができます。
(Master側で)
INSERT INTO test values(12345, "test");
(Slave側で)
SELECT * from test;
マスター側のMySQLサーバのポートは、start_master.shの中の以下のオプションでコントロールされます。
-p 0.0.0.0:3306:3306
これは、コンテナ内の3306ポートを、ホストの全てのインターフェースで同じ3306でオープンするという意味です。誰でも接続できますので、インターネット上のサーバで運用する場合は、必ず、ファイアーウォールでSlaveホスト以外からはアクセスできないように設定してください。
Masterホスト内の他のコンテナでアプリケーションを起動して、接続先をホストのDocker用ネットワークのアドレスにすれば、このMySQLを使うことができます。