アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

mysqlのレプリケーション

こんばんは、牧野です。本当に久々のブログになりました。。。

今回の話題は、mysqlで行うレプリケーションについてです。
レプリケーションは「複製」という意味で、元となるデータベース(マスタ)をコピーして、複数のデータベース(スレーブ)を作ります。
レプリケーションを行うとマスタで実行された更新系クエリがスレーブでも実行されるようになります。
もう少し正確に言うと、データ更新があったかどうかをスレーブがマスタに聞きに行き、マスタでデータ更新があった場合は同じクエリを各スレーブでも実行するという仕組みです。
したがって、更新系のクエリはマスタだけで実行するようにしておけば、参照系のクエリはマスタ、スレーブどちらで実行した場合も同じ結果が得られます。

という訳で、レプリケーションを行うと
・参照系クエリを受け付けられるデータベースが増えることで、高負荷に耐えられる
・同じデータを複数のデータベースが持つことで、サービス継続、データ復旧の両面で障害に強くなる
といったメリットが得られます。

現場指向のレプリケーション詳説」にレプリケーションのより詳しい説明があります。
初期設定についてもこちらの「新規サーバのセットアップ」に詳しく書いてあるので、見てみて下さい。

設定してサーバ起動後、スレーブで
SHOW SLAVE STATUS;
を実行し、

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

と、両方Yesになっていれば成功です。
これは、I/Oスレッド、SQLスレッドがそれぞれ動いているかどうかを示したもので、I/Oスレッドはマスタにデータ更新があったか聞きに行く役割、SQLスレッドはマスタで実行された更新クエリをスレーブで実行する役割を果たします。

何も出てこない場合やNoになっている場合はレプリケーションに失敗しているので、再度設定を確認しましょう。


レプリケーションはまれに崩れることがあります。
崩れた時の復旧法ですが、データが大幅にくずれてしまっていた場合はマスタのデータベースディレクトリをスレーブにコピーし直すのが簡単です。

1.マスタ更新の停止、スレーブデータベースの停止
マスタとなるmysqlは、データ更新できないように
FLUSH TABLES WITH READ LOCK;
を実行します。
スレーブデータベースは止めておきます。

2.データディレクトリのコピー
データディレクトリ(/var/lib/mysql等)をスレーブに持っていきます。
スレーブに設置する時は、マスタのバイナリログファイルと、master.info、relay-log.infoを削除するのがポイントです。
また、レプリケーションしていないデータベースのデータディレクトリ、my.cnfがある場合はmy.cnf等、スレーブとマスタで異なるファイルを上書きしてしまわないように気をつけましょう。

3.マスタの状態の確認
マスタで
SHOW MASTER STATUS;
を実行し、内容を確認します。

4.スレーブデータベースの起動と同期
スレーブを起動したら
STOP SLAVE;
レプリケーションを止め、
CHANGE MASTER TO master_host = '192.168.20.2', master_user = 'repliuser', master_password = 'password', master_log_file = '…', master_log_pos = …;
というようなCHANGE MASTER文を実行します。
この時のmaster_log_file、master_log_posに先ほど確認したSHOW MASTER STATUSの内容を使用します。

5.レプリケーションの再開と確認
スレーブで
START SLAVE;
を実行後、
SHOW SLAVE STATUS;
で確認します。

レプリケーションは崩れたことに気付きにくい場合があるので、気をつけましょう。(←自分のこと)
先日、崩れたレプリケーションの復旧でハマりかけたので書いてみました。