Ore no homepage
MySQL DBマスタのDC間移設
システムをデータセンターAからデータセンターBに論理移設を行うときのメモ。
肝になるのはDB、特にマスタDBだと思うので、主題の通りおもにDBマスタの切り替えに焦点を当てて手順を書く。
移設先であるデータセンターBではサーバ構築やアプリケーション/コンフィグのデプロイは完了していて、新マスタおよび全スレーブは現マスタにレプリを張っている状態からスタートする。新マスタにはバイナリログ出力など、DBマスタとして振る舞うための設定が入っているものとする。
手順の要約
- 現DBマスタへの更新クエリをすべてブロックする
- 全てのスレーブと新マスタでshow slave statusしてログとポジションが一致していることを確認する
- 新マスタと全てのスレーブでstop slaveする
- 新マスタと全てのスレーブでreset slaveする
- 新マスタでreset masterする
- 全てのスレーブでchange master to新マスタする
- アプリケーションからの更新クエリを新マスタに向ける
- DNSでインターネットからのHTTPリクエストを移設先のデータセンターBに向ける
(0) 手順の開始時点のイメージ

(1) 現DBマスタへの更新クエリをすべてブロックする
DBマスタを切り替えるに当たって、切り替え作業中に更新系のクエリが飛んできたら困るのでそれを止める。DBマスタに更新を行うようなバッチを停止するのも忘れてはならない。
具体的には次のいずれかの手段で行う。- Web/APにて、更新リクエストを受信した場合はメンテナンスページを返すようにする。
- Web/APの前段のロードバランサで、リクエストをソーリーサーバに飛ばす。
- 現DBマスタにて、Web/APからの接続ユーザをdrop userする。
- 現DBマスタにてflush tables with read lockする。
- 現DBマスタにてset global read only = 1する。
(2)全てのスレーブと新マスタでshow slave statusしてログとポジションが一致していることを確認する
更新クエリのブロックを行った後にshow slave statusすると、新マスタを含むすべてのスレーブでログとポジションが一致しているはず。ここでポジションが一致していなかったりポジションがチマチマ動くようであれば、すべての更新クエリをブロックできていないか、現マスタからのバイナリログの受信および処理が完了していないと思われる。
(3)新マスタと全てのスレーブでstop slaveする
現DBマスタにぶら下がっているすべてのDBでstop slaveしてレプリケーションを止める。
(4)新マスタと全てのスレーブでreset slaveする
マスタを切り替えるために、reset slaveしてレプリケーションの設定をクリアする。

(5)新マスタでreset masterする
新マスタ構築時に、バイナリログ出力の設定をいれてからcreate databaseやalter tableなどを行った場合、それが新マスタのバイナリログに記録されてしまっているためreset masterしてバイナリログを初期化しておく(まあ、次のフェーズのchange master toでログとポジションを指定してあげてもいいんだけど)。
(6)全てのスレーブでchange master to新マスタする
1 | change master to master_host='新マスタ', master_port=3306, master_user='xxxxxx', master_password='xxxxxx'; |
ログとポジションの指定は不要。前のフェーズでreset masterを行っているため、バイナリログとそのポジションは先頭から開始すればいいので。

(7)アプリケーションからの更新クエリを新マスタに向ける
アプリケーションのコンフィグ書き換えなどを行い、更新系のクエリを新マスタに向ける。この時点でシステムは更新リクエストを受け付けることが可能となり、サービスを再開できる状態になる。

(8)DNSでインターネットからのHTTPリクエストを移設先のデータセンターBに向ける
移設元であるデータセンターA側に通信が飛んでこなくなったら移設完了。データセンターAのサーバは撤去可能となる。
2 Responses to MySQL DBマスタのDC間移設
コメントを残す コメントをキャンセル
Top Posts
- - MySQL DBマスタのDC間移設 [1,567 views]
- - MySQL DBマスタにFusion-IOを使ってみて困ったこと [1,546 views]
- - LVSでDSR(簡易構成) [847 views]
- - GNU parallelを試してみた [363 views]
- - MySQLのSHOW BINLOG EVENTS構文 [269 views]
- - omreportでNo controllers found. [258 views]
- - 結婚式 [250 views]
- - about [235 views]
- - 4月ですね [192 views]
- - English Casual #1 [97 views]
- - MySQL DBマスタのDC間移設 [1,567 views]

DCBのSlaveは最初からnew masterのSlaveとしておいたほうが、手間が省けるのじゃ?
コメントありがとうございます。その通りですね。
ちなみにこの記事の一部は実際の仕事の作業ログです。
複数のデータセンターにDBスレーブが散らばっているようなシステムで、DBマスタの移設を行う&移設先のデータセンターに存在しているDBスレーブはそのまま使い回す・・・という作業を実際の仕事で行いました。そのため、作業スタートは移設前のDBマスタ(現DBマスタ)に全部のDBスレーブがぶら下がっている状態から・・・となっております。