MySQLでレプリケーション

posted in: MySQL | 0

こんにちは松田です。
MySQLのレプリケーション機能を使用することによって
マスターと同じデータを持ったスレーブ(主に読み込み用)を作成することができます。

各バージョン

  • CentOS 6.8
  • MySQL 5.6

仕組み

レプリケーションの処理はスレーブ側のIOスレッドとSQLスレッドが行います。

  • スレーブIOスレッドがマスター側に接続する。
  • マスター側のBinlogダンプスレッドがバイナリログに書かれたSQLをスレーブIOスレッドに送信する。
  • スレーブIOスレッドは受け取ったSQLをローカルのリレーログに書き込む。
  • スレーブSQLスレッドがリレーログのSQLを読み取り実行する。

このようにしてマスター側で実行されたSQLと同じSQLがスレーブ側でも実行される為、データの同期が実現できます。

注意点としてこのレプリケーションは非同期です。
そのためマスターが更新されてからスレーブに反映されるまでタイムラグがあります。
(通常は一瞬でスレーブに反映されますが、重いSQLや大量のSQLを実行したりするとレプリケーション遅延が発生します。)

レプリケーションに必要な設定

マスター側にレプリケーション用アカウントを用意します。

マスター側ではバイナリログを出力する必要がある為、その設定をします。(my.cnf)

マスター/スレーブのserver_idを異なる値に設定する必要があります。(my.cnf)

レプリケーション手順

レプリケーション前にマスター/スレーブのデータは同じ状態にする必要がある為、
マスター側からフルダンプを取得して、スレーブ側にリストアします。

マスター側からダンプ

スレーブ側にリストア

取得したポジションからレプリケーションをスタートします。

もしダンプ取得以降にマスター側のデータを更新している場合は、
ダンプファイル(mysql1.dump)に書かれたポジションを使用します。
※mysqldumpでmaster-data=2を指定するとダンプ時のポジションがdumpファイルの先頭付近にコメントで記載されます。

確認

レプリケーションの設定が完了したらうまくいっているか確認します。
スレーブ側でshow slave statusを打つとレプリケーションの状態が確認できます。

Slave_IO_RunningとSlave_SQL_RunningがYesで、Errorに何も出ていなければ成功です!

終わり

無事にレプリケーションすることができました。
レプリケーションによって負荷分散や高可用性が実現できますのでぜひ活用してみてください。

LINEで送る
Pocket