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;