mysqlのレプリカサーバーを構築してみた。
Dockerを使用してMySQLのプライマリとレプリカを作成する手順は以下の通りです。以下の手順では、Docker Composeを使用してコンテナを定義し、それを実行します。
1. Docker Composeファイルを作成
docker-compose.ymlという名前のファイルを作成します。
version: '3'
services:
mysql-master:
image: mysql:latest
container_name: mysql-master
command: --server-id=1 --log-bin=mysql-bin --binlog-format=row
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydatabase
MYSQL_USER: replication_user
MYSQL_PASSWORD: replication_password
ports:
- "3306:3306"
mysql-slave:
image: mysql:latest
container_name: mysql-slave
depends_on:
- mysql-master
command: --server-id=2 --log-bin=mysql-bin --binlog-format=row
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydatabase
MYSQL_USER: replication_user
MYSQL_PASSWORD: replication_password
ports:
- "3307:3306"
この例では、mysql-masterとmysql-slaveという2つのサービスが定義されています。それぞれがMySQLコンテナを起動し、マスターとレプリカとして構成されています。
2. Docker Composeを使用してコンテナを起動
コマンドラインで、Docker Composeを使用してコンテナを起動します。
docker-compose up -d
3. マスターサーバーの設定
マスターサーバーにアクセスして、マスターの設定を行います。
docker exec -it mysql-master bash
mysql -uroot -p
マスターサーバー上でMySQLコマンドラインに入り、以下のSQLコマンドを実行します。
ALTER USER 'replication_user'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'replication_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
上記のコマンドで表示される情報を控えておきます。
4. レプリカサーバーの設定
レプリカサーバーにアクセスして、レプリカの設定を行います。
docker exec -it mysql-slave bash
mysql -uroot -p
レプリカサーバー上でMySQLコマンドラインに入り、以下のSQLコマンドを実行します。
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='mysql-bin.xxxxxx', -- マスターサーバーで表示されたファイル名
MASTER_LOG_POS=xxxx; -- マスターサーバーで表示されたポジション
マスターサーバーで表示された情報を使用して CHANGE MASTER TO コマンドを設定します。
5. レプリカサーバーを開始
レプリカサーバーで以下のSQLコマンドを実行してレプリケーションを開始します。
START SLAVE;
6. レプリケーションの状態を確認
レプリカサーバー上で以下のSQLコマンドを使用して、レプリケーションの状態を確認します。
SHOW SLAVE STATUS;
状態が正常であることを確認します。
これで、Dockerを使用してMySQLのプライマリとレプリカを設定しました。
7. 動作確認
最後に動作確認します。まず、レプリカサーバーでデータが存在しないことを確認します。
use mydatabases;
show tables;
Empty set (0.00 sec)
次にマスターサーバーでテーブルとデータを投入します。
use mydatabases;
create table user (id int);
Query OK, 0 rows affected (0.04 sec)
insert into user values(1);
Query OK, 1 row affected (0.00 sec)
select * from user;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
最後にレプリカサーバーでデータがレプリケーションされてることを確認します。
select * from user;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
問題なくレプリカサーバーが構築できてることを確認できました。
今はクラウドで自動的にボタンひとつでレプリカサーバーを構築してくれますが、自分で構築してみると意外にレプリカサーバーを構築することは簡単なんだなと思います。ですが、フェイルオーバーを実装し高可用性にしたり、ストレージを分散させ高可用性にしたりなどクラウドと同等の機能を実装するのはやることたくさんだなと思います。
後片付け
下記コマンドで綺麗に片付けられます。
docker-compose down
Discussion