async, semi-sync混在のレプリケーション [要検証]

以下、ウラトリしてないので[要検証]です。

これまたhbstudy#13で[twitter:@nippondanji]さんのセッションを聞いてて思いついたこと。

複数台スレーブがいると、マスタがダウンした場合にどのスレーブをマスタに昇格させるべきか調べるのがめんどいです。非同期レプリケーション故に。

5.5以降ならば、semi-synchronousなレプリケーションが使えるので、全スレーブでsemi-syncなレプリケーションすればこういった悩みも解消されそうなんですが、semi-sync故に台数が多くなると同期待ちで時間がかかるようになります。おそらく。→時間がかかるようにはならない。なぜなら、ackを待つのは、semi-syncなスレーブすべてからackが返るまで、ではなく、semi-syncなスレーブのうちどれかひとつからackが返るまで、なので。see: http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html [twitter:@marqs]++

ならばこういう構成はどうだろうか?というお話です。




  • プライマリマスタdb-m1が死んだら、迷わずsemi-syncしているdb-m2をプライマリマスタに昇格させる
    • 非同期なスレーブのdb-s*はプライマリマスタには昇格させない
  • 非同期スレーブdb-s*が死んだら、生きてるdb-s*のどれかをとめてデータを丸コピーして復旧させる
  • あー、非同期スレーブは別にプライマリマスタにだけぶらさげなくてもいいのかも。
    • プライマリマスタだけに非同期スレーブを6台ぶらさげる、のではなく、
    • プライマリマスタとセカンダリマスタに3台ずつ非同期スレーブをぶらさげる、とか。
  • そもそも、この図みたいにasyncとsemi-syncを混在させられるか試してないので実現可能か不明です><
    • だれか試してみてください!!

2010-07-29追記

この方式でもやはり解決できないのは「非同期なスレーブたちは新しいマスターのどこから(バイナリログポジション的な意味で)再開すればいいの?」という問題なのです。

はてなブックマーク - nippondanjiのブックマーク / 2010年7月28日

おっしゃる通りですね。。やはりGlobal Transaction IDとかnippondanjiさんのスライドで触れられてたXidとかが欲しいところです。