2009年12月24日

[mysql 15119] MySQL の冗長化方針について

平岡と申します。

現在 MySQL を 2 台のサーバに導入して、運用系と待機系として
動作させて、運用系に障害が発生した際や停止が必要な場合は
IP アドレスを待機系と付け替えることで運用しています。

Server1:MySQL (運用系) Server2:MySQL (待機系)
^

|
参照・更新

このシステムを今後以下のように改善したいと思います。

- 負荷分散
応答速度向上のため、参照要求を 2 台のサーバに分散したい。
更新要求は通常片方のサーバのみで処理して良いが、サーバが
停止した際は別のサーバで代行したい。
- 同期
2 台のサーバをレプリケーションにより自動的に同期したい。
- 冗長化
運用系から待機系に切り替える必要が無いようにしたい。
- 障害・停止時対応
障害や停止が発生した際に、出来る限り容易に通常状態に
復旧させたい。
- アプリケーションの対応
上記の要件をアプリケーション側の対応無しで実現したい。

これを実現するために、以下の方法を検討しております。

o シングルマスタ、シングルスレーブ
(マスタの更新内容をスレーブにレプリケーション)

Server1:MySQL (マスタ) -- 更新 --> Server2:MySQL (スレーブ)
^ ^
| |
参照・更新 参照

- スレーブ側への更新要求は失敗するため、マスタ側へは更新・
参照、スレーブ側へは参照のみを (アプリケーション側が意識
すること無く) 振り分ける方法はありますでしょうか。
MySQL Proxy を利用するのが適当でしょうか。
- マスタを停止すると、更新が行えなくなると思いますが、
スレーブで (一時的に) 代行する事は可能でしょうか。
マスタの復帰後は、スレーブに行った更新をマスタにも簡単
に反映する、といった都合の良い事を考えています。

o マルチマスタ
(相互に更新内容をレプリケーション)

Server1:MySQL (マスタ) <-- 更新 --> Server2:MySQL (マスタ)
^ ^
| |
参照・更新 参照・更新

- 2 台のマスタに対して、同時に同じデータの更新を行った場合、
整合性が取れなくなるといった危険性はありますでしょうか。
- 片側が障害や作業で停止した際に、再び起動する際には何らか
の手間が必要でしょうか。
- アプリケーションから 2 台のサーバへの接続要求を振り分ける
方法として、DNS のラウンドロビンで問題はあるでしょうか。
また、それ以外に良い方法はありますでしょうか。

尚、規模的には MySQL Cluster を使う程ではないと考えており
ます。また、マルチマスタは障害発生時のリカバリが大変である
と考えておりますので、出来ればシングルマスタで運用したいと
思います。
もしくは、上記以外の方法があれば御教示頂けますと幸いです。

以上、よろしくお願い致します。

--
平岡 征一朗


投稿者 xml-rpc : 2009年12月24日 18:44
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/91685
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。