同じマシンでのMySQLマスタースレーブレプリケーション

公開: 2022-03-11

MySQLレプリケーションは、1つのMySQLデータベースサーバー(マスター)からのデータを1つ以上のMySQLデータベースサーバー(スレーブ)に自動的にコピーできるようにするプロセスです。 これは通常、スケーラビリティのために複数のサーバーで読み取りアクセスを分散するために使用されますが、フェイルオーバーや、マスターに過負荷をかけないためにスレーブ上のデータを分析するなどの他の目的にも使用できます。

マスター/スレーブレプリケーションは一方向のレプリケーション(マスターからスレーブへ)であるため、書き込み操作にはマスターデータベースのみが使用され、読み取り操作は複数のスレーブデータベースに分散される場合があります。 つまり、マスタースレーブレプリケーションをスケールアウトソリューションとして使用する場合は、少なくとも2つのデータソースを定義する必要があります。1つは書き込み操作用、もう1つは読み取り操作用です。

MySQLマスタースレーブレプリケーション

MySQL開発者は通常、1台のマシンでのみ作業し、開発環境全体をその1台のマシンで使用する傾向があり、ネットワークやインターネット接続に依存しないというロジックがあります。 たとえば、変更を他の場所に展開する前に開発環境でレプリケーションをテストする必要があるためにマスタースレーブレプリケーションが必要な場合は、同じマシン上にレプリケーションを作成する必要があります。 単一のMySQLインスタンスのセットアップは非常に簡単ですが、2番目のインスタンスをセットアップしてから、マスタースレーブレプリケーションをセットアップするために追加の作業を行う必要があります。

このステップバイステップのチュートリアルでは、ホストオペレーティングシステムとしてUbuntu Linuxを選択しました。提供されているコマンドは、そのオペレーティングシステム用です。 他のオペレーティングシステムでMySQLマスタースレーブレプリケーションをセットアップする場合は、特定のコマンドを変更する必要があります。 ただし、同じマシンでMySQLマスター/スレーブレプリケーションを設定する一般的な原則は、すべてのオペレーティングシステムで同じです。

MySQLマスタースレーブレプリケーション

最初のMySQLインスタンスのインストール

マシンにMySQLデータベースのインスタンスがすでに1つインストールされている場合は、この手順をスキップできます。

MySQLをUbuntuにインストールする最も簡単な方法は、ターミナルプロンプトから次のコマンドを実行することです。

 sudo apt-get install mysql-server

インストールプロセス中に、 rootユーザーのパスワードを設定するように求められます。

mysqld_multi設定

同じマシン上の2つのMySQLインスタンスを効率的に管理するには、 mysqld_multiを使用する必要があります。

mysqld_multiを設定する最初のステップは、既存のmy.cnfファイルに2つの別々の[mysqld]グループを作成することです。 Ubuntuでのmy.cnfファイルのデフォルトの場所は/etc/mysql/です。 したがって、お気に入りのテキストエディタでmy.cnfファイルを開き、既存の[mysqld]グループの名前を[mysqld1]に変更します。 この名前が変更されたグループは、最初のMySQLインスタンスの構成に使用され、マスターインスタンスとしても構成されます。 MySQLマスタースレーブレプリケーションと同様に、各インスタンスには独自のserver-idが必要[mysqld1]グループに次の行を追加します。

 server-id = 1

2番目のMySQLインスタンス用に個別の[mysqld]グループが必要なため、現在のすべての構成で[mysqld1]グループをコピーし、同じmy.cnfファイルに貼り付けます。 ここで、コピーしたグループの名前を[mysqld2]に変更し、スレーブの構成に次の変更を加えます。

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

2番目のMySQLインスタンスをスレーブとして設定するには、 server-idを2に設定します。これは、マスターのserver-idとは異なる必要があるためです。

両方のインスタンスが同じマシンで実行されるため、最初のインスタンスに使用されるポート(デフォルトでは3306 )とは異なる必要があるため、2番目のインスタンスのport3307に設定します。

この2番目のインスタンスが同じMySQLバイナリを使用できるようにするには、 socketpid-filedatadir 、およびlog_errorに異なる値を設定する必要があります。

また、2番目のインスタンスをスレーブとして使用するためにrelay-logを有効にする必要があります(パラメーターrelay-logrelay-log-indexrelay-log-info-file )。また、 master-info-fileを設定する必要があります。

最後に、スレーブインスタンスを読み取り専用にするために、パラメータread_only1に設定します。 このオプションはスレーブでの変更を完全に防ぐわけではないため、注意が必要です。 read_only1に設定されている場合でも、更新はSUPER権限を持つユーザーからのみ許可されます。 MySQLは最近、 SUPERユーザーが変更を加えないようにするために新しいパラメーターsuper_read_onlyを導入しました。 このオプションは、バージョン5.7.8で使用できます。

[mysqld1] mysqld1]グループと[mysqld2]グループとは別に、 my.cnfファイルに新しいグループ[mysqld_multi]を追加する必要もあります。

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

2番目のMySQLインスタンスをインストールし、両方を起動したら、MySQLインスタンスをシャットダウンできるようにするために、 multi_adminユーザーに適切な権限を付与します。

2番目のMySQLインスタンス用の新しいフォルダを作成する

前の手順では、2番目のMySQLインスタンスの構成ファイルを準備しました。 その構成ファイルでは、2つの新しいフォルダーが使用されます。 これらのフォルダを適切な権限で作成するには、次のLinuxコマンドを使用する必要があります。

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

AppArmorの追加のセキュリティ設定

一部のLinux環境では、2番目のMySQLインスタンスを実行するためにAppArmorのセキュリティ設定が必要です。 少なくとも、Ubuntuでは必要です。

AppArmorを適切に設定するには、お気に入りのテキストエディターで/etc/apparmor.d/usr.sbin.mysqldファイルを編集し、次の行を追加します。

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

ファイルを保存した後、これらの変更を有効にするためにマシンを再起動します。

2番目のMySQLインスタンスのインストール

2番目のMySQLインスタンスのインストールには、いくつかの異なるアプローチに従うことができます。 このチュートリアルで紹介するアプローチでは、最初のバイナリと同じMySQLバイナリを使用し、2番目のインストールには個別のデータファイルが必要です。

前の手順で構成ファイルと必要なフォルダーおよびセキュリティの変更をすでに準備しているため、2番目のMySQLインスタンスの最後のインストール手順はMySQLデータディレクトリの初期化です。

新しいMySQLデータディレクトリを初期化するには、次のコマンドを実行します。

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

MySQLデータディレクトリが初期化されると、 mysqld_multiサービスを使用して両方のMySQLインスタンスを起動できます。

 mysqld_multi start

適切なホストとポートでmysqladminを使用して、2番目のMySQLインスタンスのrootパスワードを設定します。 ホストとポートが指定されていない場合、 mysqladminはデフォルトで最初のMySQLインスタンスに接続することに注意してください。

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

上記の例では、パスワードを「rootpwd」に設定しましたが、より安全なパスワードを使用することをお勧めします。

mysqld_multiの追加構成

「mysqld_multiの設定」セクションの最後に、後でmulti_adminユーザーに適切な特権を与えると書いたので、今がその時です。 両方のインスタンスでこのユーザーに適切な権限を与える必要があるため、最初に最初のインスタンスに接続しましょう。

 mysql --host=127.0.0.1 --port=3306 -uroot -p

ログインしたら、次の2つのコマンドを実行します。

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQLクライアントを終了し、2番目のインスタンスに接続します。

 mysql --host=127.0.0.1 --port=3307 -uroot -p

ログインしたら、上記と同じ2つのコマンドを実行します。

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQLクライアントを終了します。

起動時に両方のMySQLインスタンスを自動的に起動する

mysqld_multiを設定する最後のステップは、 init.dに自動ブートスクリプトをインストールすることです。

これを行うには、/ etc / /etc/init.dmysqld_multiという名前の新しいファイルを作成し、適切な権限を付与します。

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

この新しいファイルをお気に入りのテキストエディタで開き、次のスクリプトをコピーします。

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

次のコマンドを使用して、 mysqld_multiサービスをデフォルトのrunlevelsに追加します。

 update-rc.d mysqld_multi defaults

マシンを再起動し、次のコマンドを使用して両方のMySQLインスタンスが実行されていることを確認します。

 mysqld_multi report

マスタースレーブレプリケーションのセットアップ

ここで、同じマシンで2つのMySQLインスタンスを実行している場合、最初のインスタンスをマスターとしてセットアップし、2番目のインスタンスをスレーブとしてセットアップします。

構成の一部は、「mysqld_multiのセットアップ」の章ですでに実行されています。 my.cnfファイルに残っている唯一の変更は、マスターにバイナリログを設定することです。 これを行うには、 [mysqld1]グループに次の変更と追加を加えてmy.cnfファイルを編集します。

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

これらの変更を有効にするには、マスターMySQLインスタンスを再起動します。

 mysqld_multi stop 1 mysqld_multi start 1

スレーブが正しいレプリケーション権限でマスターに接続するには、マスター上に新しいユーザーを作成する必要があります。 適切なホストとポートを備えたMySQLクライアントを使用してマスターインスタンスに接続します。

 mysql -uroot -p --host=127.0.0.1 --port=3306

レプリケーション用の新しいユーザーを作成します。

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

MySQLクライアントを終了します。

マスタデータのダンプを作成するには、以下のコマンドを実行します。

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

ここでは、バックアップファイル内にCHANGE MASTERステートメントを含むコメントを含めるために、オプション--master-data=2を使用します。 このコメントは、バックアップ時のレプリケーション座標を示しており、後でスレーブインスタンスのマスター情報を更新するためにこれらの座標が必要になります。 そのコメントの例を次に示します。

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

前の手順で作成したダンプをスレーブインスタンスにインポートします。

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

最後に、スレーブインスタンスがマスターインスタンスに接続するには、スレーブのマスター情報を適切な接続パラメーターで更新する必要があります。

適切なホストとポートを備えたMySQLクライアントを使用してスレーブインスタンスに接続します。

 mysql -uroot -p --host=127.0.0.1 --port=3307

マスター情報を更新するには、次のコマンドを実行します(上記で説明したように、ダンプファイルreplicationdump.sqlからレプリケーション座標を取得します)。

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

スレーブを起動するには、次のコマンドを実行します。

 mysql> START SLAVE;

レプリケーションが稼働中であることを確認するには、次のコマンドを実行します。

 mysql> SHOW SLAVE STATUS \G

おめでとう。 これで、同じマシン上のMySQLマスタースレーブレプリケーションが正常にセットアップされました。

MySQLマスタースレーブレプリケーション

要約

実稼働環境でのスケールアウトソリューションにマスタースレーブレプリケーションが必要な場合は、開発環境でマスタースレーブレプリケーションを構成しておくと便利です。 このように、書き込み操作と読み取り操作用に個別のデータソースを構成することで、さらに展開する前にすべてが期待どおりに機能することをローカルでテストできます。

さらに、同じマシン上に複数のスレーブインスタンスを構成して、読み取り操作を複数のスレーブに分散するロードバランサーをテストすることもできます。 その場合、この同じマニュアルを使用して、同じ手順をすべて繰り返すことにより、他のスレーブインスタンスをセットアップできます。