[MySQL] レプリケーションしてみた

定期的にmysqldumpとかでバックアップするのもイイんだけど、確実性を求めるならやっぱレプリケーションだろうと思いやってみた。
ちなみに定期的にmysqldumpするのは間違って更新しちゃったり消しちゃった的な時には有用なのでやっとくことに越したことはないです。

MySQLのレプリケーションって?

簡単に説明すると、バックアップを取りたいサーバー(マスター)とバックアップ先のサーバー(スレーブ)を用意して、マスターが更新される度に同じ内容でスレーブを更新する仕組みです。更新はほぼリアルタイムに行われるため、更新系はマスターで、参照系はスレーブでやるとかそういう負荷分散的な使い方ができます。
スレーブは複数にしたり、そのスレーブをマスターとして更に多段にスレーブをつなげることもできます。
ただ、複数のマスターをバックアップするスレーブとかはできないです。(物理的に1台のサーバーに複数のMySQLを立ち上げてスレーブにするってのはアリですが)

手順

レプリケーションユーザー作成

まずレプリケーション用のユーザーを用意します。
これはスレーブからマスターにアクセスする用に使うユーザーで、スレーブから接続できるように設定する必要があります。
んでセキュリティー的にレプリケーションの権限だけにしたほうがよいです。
マスターサーバーで以下を実行

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘hoge_rep’@'スレーブのIP’ IDENTIFIED BY ‘hoge_password’;

ちなみにデフォルトで外部サーバーからmysqlに接続できないように設定されている場合があるので、my.cnfのbind-address設定を確認したほうがよいです。

bind-address = 127.0.0.1

とかなってたら自分自身からしかアクセス出来ませんのでコメントアウトするなりしてください。

マスターサーバーとスレーブサーバーの設定

マスターのバイナリログをスレーブが取得しにきて同期する仕組みなのでバイナリログを有効化擦る必要がありますので以下を追記する(コメントアウトされてたら有効にする)
またマスターとスレーブの文字コードが異なるとまずいことになるので明示的に設定したほうがよいです。
特定のDBのみレプリケーションしたい場合はbinlog_do_dbやbinlog_ignore_dbを設定すればおkです。

[mysqld]
server-id=11111
log_bin=/var/log/mysql/mysql-bin.log
default-character-set=utf8
binlog_do_db=hogehoge_database

[mysql]
default-character-set=utf8

server-idは何でも、スレーブとかぶらなければおkです。
基本的にスレーブ側はserver-idを設定するだけで良いのですが、レプリケーションしたいDBを限定するにはreplicate-do-dbやreplicate-ignore-dbを指定します。ただし、バイナリログを取得してから対象のDBを絞り込むため、ネットワークのトラフィック量は減りません。そのためネットワークの負荷を下げたい場合はマスター側でbinlog-do-dbを設定したほうがよいです。

[mysqld]
server-id=22222
default-character-set=utf8
replicate-do-db=hogehoge_database

[mysql]
default-character-set=utf8

ただし、スレーブをマスターにして更にスレーブをぶら下げたいときは

[mysqld]
server-id=22222
default-character-set=utf8
replicate-do-db=hogehoge_database
log_bin=/var/log/mysql/mysql-bin.log
log_slave_updates

と書く必要があります。

設定が終わったらmysqlは再起動してください。

データの複製

差分で同期していく仕組みなのでレプリケーションを開始する時には全く同じデータである必要があります。そのためマスターのデータをスレーブにコピーします。
ファイルをrsyncとかでコピーしても大丈夫だとは思いますが、普通にmysqldumpを使ってみることにします。
この時、現在のログのファイル名と位置をメモしておきます。

mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
+——————+———-+——————-+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+——————-+——————+
| mysql-bin.000028 | 2849935 | hogehoge_database | |
+——————+———-+——————-+——————+

で、この状態のまま別のターミナルでmysqldumpします

$mysqldump -r root -p hogehoge_database –lock-all-tables > hogehoge.sql

元のターミナルでロックを解除します

mysql>UNLOCK TABLES;

そして今度はスレーブでデータをインポートして、レプリケーションをスタートします。

$mysql -u root -p hogehoge_database < hogehoge.sql

mysql>CHANGE MASTER TO
MASTER_HOST=”master.example.com”,
MASTER_USER=”hoge_rep”,
MASTER_PASSWORD=”hoge_password”,
MASTER_LOG_FILE=”mysql-bin.000028″,
MASTER_LOG_POS=2849935;
mysql>START SLAVE;

以上でレプリケーションが開始されます。

参考ページ

MySQL レプリケーションのセットアップ手順

 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
Filed under: MySQL — maesan 7:18 PM