MySQLのレプリケーション構築

mysql-logo MySQL

MySQLでレプリケーション構築する機会があったのでメモ。サーバー環境はCentOS7。
今回はテーブルの書き込みロックを行わないやり方でやってみた。
稼働を停止できない状況とかでは使えるかと。

マスターのMySQLでワーカー接続用のユーザーを作成

以下のコマンドをマスターとなるサーバーのMySQLに入って実行。

GRANT REPLICATION SLAVE ON *.* TO '任意のユーザー名'@'ワーカーのIP' IDENTIFIED BY 'パスワード';

// mysql8の場合はこれ
CREATE USER '任意のユーザー名'@'ワーカーのIP' IDENTIFIED BY 'パスワード';
GRANT REPLICATION SLAVE ON *.* TO '任意のユーザー名'@'ワーカーのIP';

ホスト部分を”%”で指定すると、どんなサーバー経由でもアクセスできるようになる。セキュリティ面など考えると個々に指定しておくのが無難。

マスターのポート開放

ワーカーからマスターへの接続許可が必要。内部で完結する小規模な構成だと外部接続できる形になっていない場合があるので行う。

firewall-cmd --permanent --add-port=3306/tcp

# --permanentオプションを付けている場合は再起動も
firewall-cmd --reload

ワーカーサーバーからマスターへの接続確認

mysql -h マスターのIP -u ユーザー名 -p

接続できていればとりあえずOK。

マスターのレプリケーション設定

マスターサーバーにて/etc/my.cnfを編集。以下を追記。

#サーバーIDは一意な物であればOK、他ワーカーともかぶらせない
server-id=101 
# バイナリログのファイル名
log-bin=mysql-bin 
#バイナリログの有効期限
set-variable=expire_logs_days=7

編集後mysqlの再起動。
再起動後、マスターのmysqlで以下を実行

show master status;

+----------------------------+----------+--------------+------------------+-------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------------+----------+--------------+------------------+-------------------+
|  mysql-bin.000038          |      513 |              |                  |                   |
+----------------------------+----------+--------------+------------------+-------------------+

file名とpositionが表示されていればOK。後で使うので控えておく。
空になってる場合は、my.cnfの記述ミスなどないか確認してみる。

マスターのDBをdumpしてワーカーにファイルを持っていく

mysqldump --master-data --single-transaction -u root -p DB名 > replication.dump

対象のDB名を指定し、任意のファイル名でdump。

ファイルの送信の際はgzipなどで適宜圧縮、scpなど任意の手段でファイル送信する

ワーカーでdumpファイルをリストア

あらかじめ、リストアする対象のDBは作成しておく。レプリケーションなのでマスターと同名に。

mysql -u root -p DB名 < replication.dump

ワーカーでマスター情報を設定

ワーカーのMySQLに入り以下を実行

CHANGE MASTER TO
       MASTER_HOST='マスターのIP',
       MASTER_USER='作成したワーカーからの接続用ユーザー名',
       MASTER_PASSWORD='パスワード',
       MASTER_LOG_FILE='確認したバイナリログのファイル名',
       MASTER_LOG_POS=確認したポジションの値;
start slave;
show slave status;

これでエラー等が出ておらず、Slave_IO_RunnningとSlave_SQL_RunnningがYesになってたらOK

レプリケーションできてるかの確認

マスターのデータをinsert,updateなりして、ワーカーに結果が反映されてるか確認。
マスターの結果がワーカーに反映されない場合は、上記手順の中でエラーなどでてないか確認する。マスターを変更するとポジションなどはまた変わるので、修正してから再度見る。

おまけ:ロックする場合のコマンドなど

# dump前に実行、ポジションの確認などはロック後に
flush tables with read lock;
# dumpでデータ取得後解除
unlock tables;

タイトルとURLをコピーしました