MySQL レプリケーションの基本

MySQLBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、MySQL レプリケーションの基本を学びます。レプリケーションとは、複数のサーバーで MySQL データベースのコピーを維持するプロセスです。これは、負荷分散、データバックアップ、高可用性のために一般的に使用されます。

Docker を使用して、2 つの別々の MySQL コンテナで現実的なマスター・スレーブレプリケーションのセットアップを作成します。まず、バイナリロギングが有効化された状態で事前に設定されたマスターコンテナを起動し、検証します。マスター上に特別なレプリケーションユーザーを作成します。次に、2 番目のコンテナをスレーブとして設定し、マスターに接続して、データが正しく同期されていることを確認します。この実践的なアプローチにより、実際の MySQL レプリケーション環境を管理する上で重要なステップを理解することができます。

Docker 環境のセットアップ

最初のステップとして、マスター・スレーブレプリケーション環境に必要な Docker コンテナをセットアップします。専用のネットワークを作成し、2 つの MySQL コンテナを起動します。

  1. Docker ネットワークの作成:

    専用ネットワークを使用すると、コンテナ間で名前による通信が可能になります。mysql-net という名前のネットワークを作成します。

    docker network create mysql-net
  2. マスター MySQL コンテナの起動:

    次に、マスターコンテナを起動します。このコマンドは mysql:5.7 を使用し、サーバーID を 1 に設定し、replication_db データベースのバイナリロギングを有効にします。

    docker run -d \
      --name mysql-master \
      --network mysql-net \
      -e MYSQL_ROOT_PASSWORD=lab_password \
      -e MYSQL_DATABASE=replication_db \
      mysql:5.7 \
      mysqld --server-id=1 --log-bin=mysql-bin --binlog-do-db=replication_db
  3. スレーブ MySQL コンテナの起動:

    次に、スレーブコンテナを起動します。このコンテナも同じネットワーク上にあり、サーバーID を 2 に設定しています。また、スレーブがマスターからの変更を正しく適用できるように、事前に replication_db データベースを作成します。

    docker run -d \
      --name mysql-slave \
      --network mysql-net \
      -e MYSQL_ROOT_PASSWORD=lab_password \
      -e MYSQL_DATABASE=replication_db \
      mysql:5.7 \
      mysqld --server-id=2 --relay-log=mysql-relay-bin --log-slave-updates=1
  4. コンテナの初期化を待機:

    MySQL コンテナの初期化には時間がかかります。コンテナが実行されているかを確認するために、約 15 秒待機します。

    docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
    
    cfe8c98d2ad0 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-slave
    fc125bf293ea mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-master

これで環境のセットアップが完了しました。次にマスターサーバーの設定に進むことができます。

マスターサーバーの設定を確認する

コンテナが起動したので、次にマスターサーバーがレプリケーション用に正しく設定されていることを確認します。マスターの主な役割は、すべてのデータベース変更をバイナリログに記録することであり、スレーブは後でこれを読み取ります。

まず、デスクトップからターミナルを開きます。

次に、マスターコンテナに接続し、その設定を確認します。

  1. マスターコンテナへの接続:

    docker exec を使用して、mysql-master コンテナ内で MySQL シェルを開きます。パスワード(lab_password)の入力を求められます。

    docker exec -it mysql-master mysql -uroot -plab_password
  2. バイナリロギングとサーバーID の確認:

    mysql> プロンプトが表示されたら、以下のコマンドを実行して、バイナリロギングが有効になっており、サーバーID が正しく設定されていることを確認します。

    SHOW VARIABLES LIKE 'log_bin';

    出力は log_binON であることを示すはずです。

    +---------------+----+
    | Variable_name | Value |
    +---------------+----+
    | log_bin       | ON |
    +---------------+----+
    1 row in set (0.01 sec)

    次に、サーバーID を確認します。

    SHOW VARIABLES LIKE 'server_id';

    出力は server_id1 であることを示すはずです。

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.00 sec)

    設定を確認したら、MySQL シェルを終了できます。

    exit;

これで、マスターサーバーがレプリケーションの準備ができていることを正常に確認できました。

レプリケーションユーザーとテストデータベースの作成

スレーブサーバーは、バイナリログを読み取るためにマスターに接続する必要があります。セキュリティのため、この目的専用のユーザーアカウントを作成し、権限を制限するのがベストプラクティスです。このステップでは、レプリケーションユーザーを作成し、レプリケーションを実際に確認するためのテストデータベースにデータを投入します。

  1. マスターサーバーへの接続:

    mysql-master コンテナ内で MySQL シェルを開きます。

    docker exec -it mysql-master mysql -uroot -plab_password
  2. レプリケーションユーザーの作成:

    mysql> プロンプトで、repl_user という名前のユーザーをパスワード repl_password で作成するために、以下のコマンドを実行します。このユーザーは、スレーブが接続するために使用されます。'@'%' を使用することで、Docker ネットワーク上のスレーブコンテナを含む任意のホストからの接続を許可します。

    CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
  3. レプリケーション権限の付与:

    新しいユーザーには、マスターからのバイナリログを読み取ることを許可する REPLICATION SLAVE 権限が必要です。

    GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

    権限を付与した後、権限テーブルをリロードして変更を即座に適用します。

    FLUSH PRIVILEGES;
  4. マスターのバイナリログステータスの確認:

    スレーブを設定する前に、スレーブがレプリケーションを開始すべきマスターのバイナリログ内の正確な座標を知る必要があります。SHOW MASTER STATUS コマンドがこの情報を提供します。

    SHOW MASTER STATUS;

    出力は以下のようになります。FilePosition の値をメモしておいてください。次のステップで必要になります。

    +------------------+----------+------------------+--------------------+-------------------+
    | File             | Position | Binlog_Do_DB     | Binlog_Ignore_DB   | Executed_Gtid_Set |
    +------------------+----------+------------------+--------------------+-------------------+
    | mysql-bin.000001 |      337 | replication_db   |                    |                   |
    +------------------+----------+------------------+--------------------+-------------------+
    1 row in set (0.00 sec)
  5. テストテーブルとデータの作成:

    replication_db データベースは、コンテナ起動時に作成されました。レプリケーションをテストするために、テーブルを作成し、いくつかのデータを挿入しましょう。

    USE replication_db;
    CREATE TABLE messages (
        id INT PRIMARY KEY AUTO_INCREMENT,
        content VARCHAR(255)
    );
    INSERT INTO messages (content) VALUES ('Hello from the master!');

    挿入されたデータが正しく確認できます。

    SELECT * FROM messages;

    挿入した行が表示されるはずです。

    +----+------------------------+
    | id | content                |
    +----+------------------------+
    |  1 | Hello from the master! |
    +----+------------------------+
    1 row in set (0.00 sec)

    これで、MySQL シェルを終了します。

    exit;

これで、レプリケーションユーザーとテストデータを作成することにより、マスターサーバーの準備が整いました。

スレーブサーバーの設定と起動

マスターの準備ができたので、スレーブコンテナを設定します。このステップでは、ステップ 3 でマスターから記録したバイナリログの座標を使用して、スレーブがどこからレプリケーションを開始すべきかを指示します。

  1. スレーブコンテナへの接続:

    まず、mysql-slave コンテナ内で MySQL シェルを開きます。

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. スレーブをマスターに接続するように設定:

    次に、CHANGE MASTER TO コマンドを使用してレプリケーション設定を行います。ステップ 3SHOW MASTER STATUS から記録した FilePosition の値を使用します。MASTER_HOST'mysql-master' です。これは、両方のコンテナが同じ Docker ネットワーク上にあるため機能します。

    注意: mysql-bin.000001 と位置番号は、ステップ 3 で記録した実際の値に置き換えてください。値がない場合は、新しいターミナルで docker exec mysql-master mysql -uroot -plab_password -e "SHOW MASTER STATUS;" を実行して取得できます。

    CHANGE MASTER TO
        MASTER_HOST='mysql-master',
        MASTER_USER='repl_user',
        MASTER_PASSWORD='repl_password',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=337;

    このコマンドは、スレーブにマスターに接続するために必要なすべての情報で設定します。

  3. スレーブスレッドの起動:

    最後に、START SLAVE コマンドを実行してレプリケーションプロセスを開始します。これにより、マスターからバイナリログを取得する I/O スレッドと、ログからのイベントを実行する SQL スレッドの 2 つのスレッドが開始されます。

    START SLAVE;

    これで MySQL シェルを終了できます。

    exit;

これでスレーブは設定され、マスターへの接続とデータのレプリケーションを試みるはずです。

レプリケーションの検証

スレーブを起動した後、最後のステップはレプリケーションが正しく機能していることを検証することです。スレーブのステータスを確認し、マスターからのデータがコピーされていることを確認します。

  1. スレーブサーバーへの接続:

    mysql-slave コンテナ内で MySQL シェルを開きます。

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. スレーブステータスの確認:

    レプリケーションを監視するための最も重要なコマンドは SHOW SLAVE STATUS です。\G 修飾子は出力を縦方向にフォーマットするため、読みやすさが大幅に向上します。

    SHOW SLAVE STATUS\G

    出力の中から、以下の 2 行を探してください。どちらも Yes の値を持つ必要があります。

    • Slave_IO_Running: Yes: これは、スレーブがマスターに正常に接続され、バイナリログデータを受信していることを確認します。
    • Slave_SQL_Running: Yes: これは、スレーブがバイナリログからのイベントを正常に実行していることを確認します。

    もう一つの重要なフィールドは Seconds_Behind_Master です。値が 0 であることは、スレーブがマスターと完全に同期していることを示します。

    正常なステータスは以下のようになります(一部の値は異なる場合があります)。

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: mysql-master
                      Master_User: repl_user
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 529
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 699
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ...
             Seconds_Behind_Master: 0
    ...
  3. レプリケートされたデータの検証:

    次に、replication_db データベースとそのデータがマスターからコピーされているか確認します。

    SHOW DATABASES;

    リストに replication_db が表示されるはずです。

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | replication_db     |
    | sys                |
    +--------------------+

    データベースに切り替えて、messages テーブルをクエリします。

    USE replication_db;
    SELECT * FROM messages;

    マスターに挿入したデータが、スレーブにも存在しているはずです。

    +----+------------------------+
    | id | content                |
    +----+------------------------+
    |  1 | Hello from the master! |
    +----+------------------------+
    1 row in set (0.00 sec)

    これにより、レプリケーションが正しく機能していることが確認できます。これで MySQL シェルを終了できます。

    exit;

これで、Docker を使用して基本的な MySQL マスター・スレーブレプリケーション環境を正常にセットアップし、検証しました。

まとめ

この実験では、Docker を使用した MySQL マスター・スレーブレプリケーションの基本的な設定手順を学びました。まず、マスター用とスレーブ用の 2 つの MySQL コンテナを作成し、Docker ネットワークで接続しました。バイナリログが有効化され、一意のサーバー ID が設定されているマスターの設定を確認しました。次に、安全な接続のためにマスター上に専用のレプリケーションユーザーを作成しました。マスターの準備が整った後、CHANGE MASTER TO コマンドを使用してスレーブコンテナを設定し、マスターのバイナリログ座標との接続を確立しました。最後に、SHOW SLAVE STATUS でスレーブのステータスを確認し、テストデータが正しく同期されていることを確認することで、レプリケーションの成功を検証しました。この実験を通して、現実的な MySQL レプリケーション設定の構成、管理、および検証に必要な基本的なスキルを習得しました。