人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mysqlのレプリケーションについて、
質問させてください。

MASTER、SLAVE1、SLAVE2、SLAVE3という構成で、
MASTERから各SLAVEにレプリケーションしている状態において、
MASTERに障害が発生し、
SLAVEのどれかをMASTERに昇格させる場合、
3つのSLAVEのポジションはどのように同期を取ったらよいのでしょうか。

MASTERには接続できないものとします。

よろしくお願いします。

●質問者: the_yakisoba
●カテゴリ:コンピュータ インターネット
✍キーワード:MySQL いもの ポジション レプリケーション 接続
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kn1967
●27ポイント

作業としては、Slave1をマスターとして再起動した後

Slave2/Slave3でマスター情報を書き換えて再起動するだけで同期されます。


一応、マニュアルが基本になりますので下記参照のうえで

どのあたりが判り難いのかを明示されると理解が進むと思いますよ。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 5.3.6 フェイルオーバでのマスタ切り替え

たとえば、Slave 1 を選択する場合、

すべての Web Clients を Slave 1 にリダイレクトして、

そこのバイナリ ログ にアップデートを記録します。

つまり、Slave 2 と Slave 3 は Slave 1 から複製することになります。

◎質問者からの返答

ご回答ありがとうございます。

> Slave 2 と Slave 3 は Slave 1 から複製することになります。

これはSlave1からDumpしてSlave2、3を作るという意味ではないですよね?

提示いただいたリンク先を読んだところ、

「STOP SLAVE IO_THREAD」をしてSlave1、2、3がその時点までのリレー ログを、

更新して同期しているようです。

しかし、

同期に関して気になる記述があり

「実情では、複数スレーブのリレー ログがマスタからそれほど遅れをとらないので、この方法が適用できるとの考えに基づいています。」

もしSlaveごとにリレーログの遅れに差分がある場合、

どのように同期を取ることができるのでしょうか。


2 ● crazytaxi
●27ポイント

そのような状態になったときは、Slave1, Slave2, Slave3 で show slave status を実行し、ポジションに差異がないかどうかを見ます。

具体的には、Master_Log_File, Exec_Master_Log_Pos を見て、違いがないことを確認します。

ほとんどありえないですが、もし差異がある場合。

・3つバラバラ -> 一番進んでいるものをMasterに昇格させ、Slaveを新規で作る

・2つ一緒 -> どちらかをMasterに昇格させる

ということをやることになると思います。

昇格するサーバーは、バイナリログを出力するようにする必要があります。

また、kn1967さんもコメントでおっしゃっている通り、差異が発生することはありえます。

どうしても差異が発生してはいけないようなデータを取り扱っている場合、マルチマスタなりを検討した方がいいです。

自分はやったことないですが、Master の show master status を常時どこかに出力しておいたら、障害時に差分比較はできるかもしれないと思っています。

それが正しいという保証ができるかはわからないですが。

◎質問者からの返答

ご回答ありがとうございます。

> ・3つバラバラ -> 一番進んでいるものをMasterに昇格させ、Slaveを新規で作る

新規で作成ということは、

新MasterからDumpして作成ということでしょうか。

また、

新Masterとその他SlaveのExec_Master_Log_Posを比較して、

差分を手動で更新させ同期を取るといった手段は有効でしょうか。


3 ● crazytaxi
●26ポイント

> ・3つバラバラ -> 一番進んでいるものをMasterに昇格させ、Slaveを新規で作る

新規で作成ということは、

新MasterからDumpして作成ということでしょうか。

そうですね。


また、

新Masterとその他SlaveのExec_Master_Log_Posを比較して、

差分を手動で更新させ同期を取るといった手段は有効でしょうか。

可能でしょうか?っていう質問だと思って回答します。

以下の状態であれば可能です。

障害時、以下のようなステータスだったとします。

この状態の時、Slaveは、新Masterと比べて、20000 - 19600 = 400(byte)分、旧Masterのバイナリログが実行されてないことになります。

ですので、新Masterのバイナリログの position を400byteさかのぼったところからSQLを流すことで、同期が取れた状態になります。

8000 - 400 = 7600です。

mysqlbinlog -j 7600 mysqld-bin.000001 > diff.sql

この出力が差分になります。

◎質問者からの返答

ご回答ありがとうございます。

新Masterのバイナリログは、

新Masterのリレーログで代用できないでしょうか。

mysqlbinlog -j 8600 relay-bin.000001 > diff.sql

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ