MySQLのマスター・スレーブ複製(Master-Slave Replication)は、データベースの高可用性や負荷分散を実現するために広く使用されている手法です。この方法では、1つのマスターサーバーと複数のスレーブサーバーを設定し、データを同期させることができます。特に、同一の物理マシン上で実行する場合、シンプルかつ効率的なデータ管理が可能です。本記事では、MySQLのマスター・スレーブ複製を同一のサーバー上で実現する方法を完全かつ包括的に解説します。
MySQLのマスター・スレーブ複製とは?
マスター・スレーブ複製は、データベースの更新(書き込み)がマスターサーバーにのみ行われ、その変更がスレーブサーバーにリアルタイムでコピーされる仕組みです。この構成により、スレーブサーバーは読み取り専用として機能し、マスターサーバーへの負荷を分散することができます。
同一サーバー上でのマスター・スレーブ複製
通常、マスター・スレーブ複製は複数のサーバーを使用しますが、テスト環境や小規模なシステムでは、同一の物理マシン上で複製を実現することも可能です。この方法では、同じサーバー上で複数のMySQLインスタンスを実行し、マスターとスレーブを設定します。
必要な準備
-
MySQLのインストール: 同一サーバー上で複製を行うためには、まずMySQLがインストールされている必要があります。最新版のMySQLを公式サイトからダウンロードしてインストールします。
-
ポート番号の変更: 複製を実現するためには、マスターとスレーブが異なるポート番号を使用する必要があります。デフォルトではMySQLはポート3306を使用しますが、スレーブ用のMySQLインスタンスは異なるポートを設定する必要があります。
-
データベースのバックアップ: マスターサーバーのデータベースの内容をスレーブサーバーに反映させるためには、まずマスターからバックアップを取得します。
mysqldumpコマンドを使用して、マスターのデータベースをバックアップします。
設定手順
以下に、同一サーバー上でのマスター・スレーブ複製の設定手順を示します。
1. MySQLインスタンスの設定
-
マスターとスレーブで異なる設定ファイルを使用するため、MySQLの設定ファイル(通常は
my.cnf)を変更します。 -
マスターインスタンスの設定:
server-idを設定します(ユニークなID)。log_binを有効にして、バイナリログを記録します。bind-addressを127.0.0.1に設定し、ローカル接続のみを許可します。
ini[mysqld] server-id = 1 log_bin = mysql-bin bind-address = 127.0.0.1 -
スレーブインスタンスの設定:
server-idを異なるユニークなIDに設定します。relay-logを有効にして、リレーログを記録します。
ini[mysqld] server-id = 2 relay-log = mysql-relay-bin bind-address = 127.0.0.1
2. マスターサーバーの設定
-
rootユーザーでMySQLにログインし、スレーブからの接続を許可するためのレプリケーション用ユーザーを作成します。sqlCREATE USER 'replica'@'localhost' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'localhost'; FLUSH PRIVILEGES; -
バイナリログの位置を確認します。これはスレーブサーバーで設定するために必要です。
sqlSHOW MASTER STATUS;出力例:
diff+-------------------+----------+--------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+-------------------+ | mysql-bin.000001 | 154 | | | +-------------------+----------+--------------+-------------------+この情報をメモしておきます。
3. スレーブサーバーの設定
-
スレーブMySQLインスタンスにログインし、マスターの情報を指定してレプリケーションを開始します。
sqlCHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;MASTER_LOG_FILEとMASTER_LOG_POSには、マスターから取得した情報を設定します。
-
レプリケーションを開始します。
sqlSTART SLAVE; -
レプリケーションが正常に動作しているかを確認するため、スレーブの状態を確認します。
sqlSHOW SLAVE STATUS\G出力例:
yamlSlave_IO_Running: Yes Slave_SQL_Running: Yes両方の状態が
Yesであれば、レプリケーションは正常に動作しています。
4. 動作確認
-
マスターサーバーにデータを追加して、スレーブサーバーに反映されるか確認します。
sqlINSERT INTO test_table (column1) VALUES ('test data'); -
スレーブサーバーでデータが反映されているか確認します。
sqlSELECT * FROM test_table;
トラブルシューティング
-
レプリケーションが停止した場合:
SHOW SLAVE STATUSの出力にエラーメッセージが表示されることがあります。エラーコードとメッセージを確認し、必要に応じてSTART SLAVEで再開できます。 -
データの不一致:
マスターとスレーブ間でデータが一致しない場合、pt-table-checksumなどのツールを使用してデータの整合性を確認できます。
結論
MySQLのマスター・スレーブ複製は、データベースの可用性や負荷分散を実現するための強力な方法です。特に同一サーバー上で実行することで、リソースを効率的に利用しながら、複製のテストや開発環境を整えることができます。設定はシンプルでありながら、高い信頼性とパフォーマンスを提供します。この方法を活用して、MySQL環境をさらに強化することが可能です。
