質問: トリガが設定されたmysql5.5準同期 mysql5.5の準同期レプリケーションを使って、マスターサーバー(insert用)とスレーブサーバー(select用)を組み合わせたサイトを作る予定です。 マスター側のサイトはトリガーとイベントを多用しております。(トリガー13個、イベント8個) 当初、マスター側にもスレーブ側にもどちらにもトリガーとイベントを組み込んでいましたが、テストして分かったことは、イベントがエラーを起こすということでした。 マスター側でイベントが始まり結果をスレーブ側に送ることになるわけですが、同時間にスレーブ側のイベントも始まるわけなので、マスターの結果が送られてきたときにはスレーブのテーブルには計算後の数値が記載されており、結果エラーになってしまうことがわかりました。 そのため、スレーブ側のイベントは削除して構築しています。 問題はトリガーについてです。 マスター側にはaテーブルにインサートするとbテーブル、cテーブル、dテーブルが連鎖的に変更されるトリガを組んでおり、スレーブ側も同様のトリガを組んでいます。 幸い、いままでのテストでは、トリガーで計算した値が連鎖的に伝わってもエラーになっていません。 ただ、マスター側に高負荷が掛かり、マスターのトリガの計算よりもスレーブ側の計算のほうが早く終了した場合、イベントの時に起こったエラーが出ないか懸念しています。 テストで壊れるのはいいですが、実際に運用した後で壊れることは許されません。 質問としては、「実際にトリガーを使った高負荷サイトを構築されている方でスレーブサーバーを準同期で設定している方」から、どのように組めばよいかのアドバイスを頂きたいというものです。(こんな高負荷サイトで運用しているがトリガを組んでて問題ないなどという例があるとうれしいです) よろしくお願いいたします。 スレーブのトリガーを外すのが一番簡単な方法なのですが、万一マスターがハングアップした際にはスレーブを昇格させる予定ですので出来る限りトリガーはそのままにしたいと考えておりますが、スレーブ側にトリガを組んだままというのは常識的にあり得ないというアドバイスであればそれでも結構です。 これはお願いなのですが、「他のサイトを調べて回答する」という方は申し訳ございませんがご遠慮願います(私も簡単なテストは済ませており低負荷では問題が生じないことまでは分かっております。ブログに落ちているような経験値はこれと大差ありません。この程度ではアドバイスにならないと感じています。) 実際に運用経験があり、正確な知識をお持ちの方にアドバイス頂きたいと思います。 よろしくお願いいたします。 構成はcentos 6.3 mysql 5.5.28です。
回答: こういう質問をするなら、semi-sync-replication の有無より、レプリケーションとトリガーの組み合わせについて質問するなら、バイナリログのフォーマット設定も書き込むべきじゃないかな? http://dev.mysql.com/doc/refman/5.5/en/replication-features-triggers.html mysql 5.1のだけど、日本語ならここ http://dev.mysql.com/doc/refman/5.1/ja/stored-procedure-logging.html もうマニュアルに書かれていることだから説明するのも二度手間になるけど... row-basedなら、バイナリログでテーブルのデータが更新されてもトリガーがスレーブ側で実行されることは無いので、実行順序の問題は原理的に生じない。(トリガーで更新されたテーブルのデータもバイナリログに記録されてスレーブに反映される) statement-basedならスレーブでもトリガーが実行されるので、実行順序に関しての保障は無い。 というのが回答になります。 で、"これはお願いなのですが、~(省略)~実際に運用経験があり、正確な知識をお持ちの方にアドバイス頂きたいと思います。"こういう情報がほしければ、お金を払ってプロに頼んでください。