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]++
ならばこういう構成はどうだろうか?というお話です。
- 比較的スペックのよいマシン2台(db-m1, db-m2)で、semi-syncなレプリケーションをする
- レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプランのように、この2台は相互にsemi-syncなレプリケーションしていて、更新系のクエリはプライマリの方のマシンにだけ来るようにする、のもいいかも。
- ほどほどのスペックのマシン複数台(db-s1, db-s2, db-s3,...)は、プライマリな方(db-m1)をマスタとして、asyncなレプリケーションをする
- プライマリマスタ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とかが欲しいところです。