notebook

都内でWEB系エンジニアやってます。

mysqlのレプリケーション

MySQLレプリケーション設定

基本的なレプリケーションについて、master-slave1台づつの構成をサンプルにしてます。

  • master(192.168.1.11)
  • slave(192.168.1.12)

masterの設定

slave(192.168.1.0/24)からserver2というユーザーでrelay_logを取得しにくる許可をする

> GRANT REPLICATION SLAVE ON *.* TO 'server2'@'192.168.1.0/255.255.255.0';
  • my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1

server-idは実運用の時はIPの台4オクテットとか分かりやすいようにした方がいいと思います。

slaveの設定

[mysqld]
log-bin=mysql-bin
log_slave_updates
server-id=2

slaveをmasterとして使う場合がある場合は下記を追加

log_slave_updates

スナップショットの作成 at master

  • ロック、binlogのポジションを確認
> flush tables with read lock;
> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      396 |              |                  |
+------------------+----------+--------------+------------------+
  • ロックしている間にダンプファイルを作成する
mysqldump -u root -p database_name --lock-all-tables > dump.sql
  • ロック解除
unlock tables;

extrabackupなどで既にバックアップをとっていてslave_infoなどがある場合

そちらを使えばダンプファイルを生成するためのロックやダンプは必要なくて、ただバックアップファイルからslaveを構築するだけです。

レプリケーションの設定 at slave

show amster statusで得た情報をchange master toでmaster_log_file,master_log_posに入力

  • dumpファイルの展開

mysql -u root --default-character-set=utf8 -A database_name < dump.sql

  • masterの情報登録
change master to
  master_host='192.168.1.11', #masterのIP
  master_user='server2',      #レプリケーション用のユーザ名(masterにGRANTで追加したユーザ名)
  master_password='',
  master_log_file='mysql-bin.000004',
  master_log_pos=107;

start slave;
  • 確認
> show slave status\G

下記項目を確認し問題なければOK

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Error:
Last_SQL_Error:

masterで更新系クエリ発行、slaveで確認

無事レプリケーションは完了

  • スレーブの停止

change master to を発行するときはslaveの機能は止まっている必要があるので

既にslaveが動いてる時にchange master toを発行したい時はstop slaveでレプリケーションをとめてあげる必要がある

> stop slave;