ホーム > タグ > MySQL
MySQL
MySQL5.0.xのレプリケーション
とりあえず通常のMySQL動作環境の構築まで終了してると仮定しまして。
◆レプリケーション用ユーザー追加
普通のユーザーでやってしまうと、コケたときにレプリケーションが原因なのか、そうでないのか切り分けにくくなります。また、レプリケーションのみのユーザー権限もあります。このあたりは適宜用途に応じて作成してください。
◆DBを停止
MySQLでスナップショットをとるには商用ソリューションが必要になるし割と複雑なようです。今回は停止するほうで。現在まで稼動していたマスタを停止、スレーブのほうも止めておきます。
これは、次のコピー作業が「双方の内容を同一にする」ために行うものなのですが、コピー中に変更があると内容に食い違いが生じるためです。
◆DBの内容をコピー
rsyncなどで、マスタDBのMySQLデータベースをまるごとコピーします(標準なら/var/lib/mysql以下ですな)。DBまるごとレプリケーションする場合は、一旦スレーブ側をカラにしてから
# rsync -a /path/to/dbm /path/to/dbs
でOK。
◆レプリケーション設定
各サーバのmy.confにレプリケーション設定を追加します。マスタ側で必要なのは
log-bin
server-id=100
の2行。上がバイナリログを吐く設定、下がサーバーidです。idはDBサーバー毎にユニークでないといけないので、スレーブ側ではここと被らないように注意。
スレーブ側で必要なのは
server-id=101
slave-skip-errors=1062
skip-slave-start
あたりですかね。
idは前述のとおり、レプリケーションしている他のサーバーと違う番号を振ります。
2行目は「指定した番号のエラーが発生してもスキップしてレプリケーションを続ける」という指定です。通常、エラーが発生するとレプリケーションは停止します。しかし、エラーの内容によっては、システムによっては問題のないものであったり、MySQLのバグであったりします(エラーナンバーのうち幾つかは将来回避される予定だそうですし)。
この場合は公式をそのまま引用すると、
Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
Message: ‘%s’ は key %d において重複しています
環境によって異なるので、どれをスキップするかはご自分の環境で検証してください。allも指定可能です。
3行目は、再起動時にレプリケーションを自動的に開始するな、という指定で、これは公式に推奨されているオプションです。DBにエラーが発生・再起動時は、正常にレプリケーションが行われていない可能性があるので、データの食い違いや破損による二次障害が発生しかねないためです。停止した場合はログなどから原因を突き止めた上で問題がなければ手動で再開しましょう…。
◆起動、の前に…
レプリケーション開始設定のためにMySQLサーバの起動が必要なのですが、プログラムやcronなど、DBを更新する可能性のあるものはすべて停止してください。起動後に更新が発生すると、内容が食い違ってしまって再度コピーからやり直しになってしまいます。
確認ができたら、まずマスタのMySQLサーバを再起動し、mysqlコマンドで接続します。ここで
> show master status;
と入力すると、テーブルが表示されて、File、Positionなどが表示されますが、この2つをメモしておいてください。Fileは同期するバイナリログ、Positionはそのログのどこから同期するかの位置を指定するものですので、これが間違っていると失敗する重要なところです。ちなみに更新されるとPositionは変化していくので、上のコマンドを何度か叩いて変化があるようなら、DBを更新するようなプログラムなどが動いてしまっているということになります。その場合はファイルコピーからやり直しになります。
さて、特に問題なければスレーブ側で最後の設定を行います。ここでは上で調べた同期開始位置をスレーブ側にも教えてあげて、レプリケーションを実行します。
> CHANGE MASTER TO MASTER_HOST=’マスタのIPアドレス’, MASTER_USER =’レプリケーション用ユーザ名’, MASTER_PASSWORD=’パスワード’,MASTER_LOG_FILE=’上で調べたファイル名’, MASTER_LOG_POS=上で調べた位置;
この後、
> slave start;
で同期が開始されます。
◆レプリケーションの確認
特にエラーなどが起きなければ、そのままスレーブで
> show slave status\G
と入力し、レプリケーション状況を確認します。エラーなどがなければ同期ができているはずですので、データベースやテーブル、レコードをマスタ側で追加してスレーブ側で確認するなどしてみましょう。また、データが更新されていけば、上記コマンドで確認できる、バイナリログの位置が徐々に変わっていくのが確認できるはずです。
設定だけなら、結構簡単ですね。運用するとなるとまた別ですが…。
とりあえずMRTGやcactiやNagiosなどでリソース監視はしておきましょう。
- Comments: 0
- Trackbacks: 0
Home > Tags > MySQL
