ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

docker-composeでお手軽mysqlのmaster-slave構成

mysqlのreplicationの構築を検証してみたかったので、Dockerを使って環境構築をしてみました。

docker-composeを使って、コマンド一つでmaster, slave両方管理出来るようにしています。

githubにあげてみたので、よかったら使ってみて下さい。

https://github.com/te-nu/mysql_replication_by_docker

やったこと

mysqlのコンテナを2台起動する

まずはmysqlのコンテナを2台起動するためのdocker-compose.ymlを書きました。

version: '3'
services:
  master:
    image: mysql:5.7
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
     volumes:
      - ./master.cnf:/etc/mysql/conf.d/master.cnf
    networks:
      web_net:
        ipv4_address: 192.168.99.11
  slave:
    image: mysql:5.7
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./slave.cnf:/etc/mysql/conf.d/slave.cnf
    networks:
      web_net:
        ipv4_address: 192.168.99.12

networks:
  web_net:
    driver: bridge
    ipam:
      config:
      - subnet: 192.168.99.0/25

特筆すべき点としては/etc/mysql/conf.d/に設定ファイルを入れると読み込まれる挙動を生かしてmaster.cnfslave.cnfをそれぞれコンテナ内の/etc/mysql/conf.dに入れています。

また、レプリケーション用のアカウント追加の際にIPアドレスが必要になるためコンテナ2つにそれぞれ固定IPを割り振っています。

実際に立ち上げてみます。

$ docker-compose up -d
Creating mysqlreplicationbydocker_slave_1  ... done
Creating mysqlreplicationbydocker_master_1 ... done

$ docker-compose ps

                Name                             Command             State    Ports
-------------------------------------------------------------------------------------
mysql_replication_by_docker_master_1   docker-entrypoint.sh mysqld   Up      3306/tcp
mysql_replication_by_docker_slave_1    docker-entrypoint.sh mysqld   Up      3306/tcp

立ち上がりました。あとは設定ファイルを追加し、レプリケーション用のコマンドを打っていきます。

設定を追加する

master.cnfとslave.cnfに以下の設定を追加します。

master.cnf

[mysqld]
log-bin
server-id=101

slave.cnf

[mysqld]
server-id=102

設定後はmysqldの再起動が必要なので、コンテナを再起動させます。

$ docker-compose restart

あとはコンテナ内に入ってレプリケーションを起動させます。

まずはmasterに入ってレプリケーション用のアカウントを作ります。ここでIPを入力するのでコンテナのIPを固定にしました。

$ docker-compose exec master mysql -uroot

mysql> create user 'repl'@'192.168.99.12' identified by 'test-password';
mysql> grant replication slave on *.* to 'repl'@'192.168.99.12';

あとはslaveに入り以下のコマンドを叩いて設定・実行します。

$ docker-compose exec slave mysql -uroot

mysql> change master to
    -> master_host="192.168.99.11",
    -> master_user="repl",
    -> master_password="test-password";

start slave:

これでslaveの設定ができました。軽く確認してみます。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.99.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 19cc04f89d07-bin.000003
          Read_Master_Log_Pos: 778
               Relay_Log_File: ea6c96b8103c-relay-bin.000004
                Relay_Log_Pos: 1005
        Relay_Master_Log_File: 19cc04f89d07-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
-- 以下省略

動いてそう。

masterでhogeスキーマを作ります。

$ docker-compose exec master mysql -uroot

mysql> create database hoge;

slaveでも作られたか確認

$ docker-compose exec slave mysql -uroot

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hoge               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

hogeスキーマが作られてました。

ミニマムなレプリケーションの設定の検証ができたので、台数増やしたり設定を追加したりとプラスで色々実験できそうです。

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド