MySQLのレプリケーション

レプリケーションとは2つのMySQLサーバでデータを同期する仕組み。マスターサーバのデータをスレーブサーバにコピーする。スレーブサーバは常に起動している必要はなく、起動時に一括でマスターからコピーできる。スレーブでの更新はマスターには影響しないので、通常は更新作業はすべてマスターで行うものと思われる。当然スレーブは複数あっていい。

レプリケーションはバイナリーログを利用する。マスターはデータの追加や更新を「イベント」としてバイナリーログに書き込む。スレーブはこのログを読んで自身のデータを更新する。このときスレーブはバイナリーログのどこから実行するかの情報をちゃんと自分で持っている。設定によってスレーブは特定のデータベースだけをレプリケーションしたりできる。

マスターとスレーブにはユニークなID(server-id)を割り付けなければならない。ここではすでにマスターにはデータがあり、マスターのserver-idとバイナリーログ有効の設定は有効にしてあり、レプリケーション用ユーザreplも存在するのもとする。ただしこのマスターは最初からバイナリーログがとられているわけではないものとする。そのときの新しくスレーブを立ち上げたときのことを考える。スレーブがレプリケーションするデータベースはdddだけとする。

マスターのバイナリログの現在の状況を確認してバックアップをとる
スレーブのデータベースは空なので、マスターのデータをまず持ってこなくてはならないが、マスターのバイナリーログとの整合性が狂うとまずいので、テーブルの更新を止めてからバイナリーログの状況を確認し、その後バックアップを取る。

マスターにコマンドラインからログインして、更新を止め、バイナリーログの状態を確認する。

このコマンドラインはこのままにして(抜けるとロック外れる)、他のコマンドラインからデータベースdddをファイルにコピーする。すでにロックしてるので–skip-lock-tables を追加する。

$ mysqldump --database ddd -u root -p --skip-lock-tables > ddd.sql

終わったら、mysqlのコマンドラインも抜ける。これでバイナリーログの状態とバックアップファイルができた。

スレーブに今作ったバックアップファイルからコピーする
スレーブにddd.sqlを持ってくる。が、最初にデータベースdddを作る。

次にddd.sqlを流し込む。

$ mysql -u root -p < ddd.sql

スレーブにserver-idを割り付ける
まずスレーブにserver-idを割り当てる。my.cnfの[mysqld]セクションに設定を行う。server-idは適当な数字でいい。(1~4294967295)。

[mysqld]
server-id=432423

スレーブを起動し、コマンドラインに入って、レプリケーションの設定をする。

MASTER_LOG_FILEとMASTER_LOG_POSの値は上で確認したマスターのバイナリーログの状態を入力する。他のホストとかユーザとかは自分のものに合わせる。

これでmaster.infoができ、ここにバイナリーログの状態が保存されているはず。

スレーブを終了しmy.cnfにちゃんとしたレプリケーション情報を書く。

[mysqld]
server-id=432423
master-host=192.168.0.100
master-user=repl
master-password=pass
replicate-do-db=ddd

スレーブを起動し、マスターで変更した情報がスレーブに反映されるかを確認する。