1

新しいWebサイトの場合、MySQLマスターマスターセットアップに接続する必要があります。これはNHibernateを使用する.NETWebサイトですが、Javaやその他の言語にも同じことが当てはまります。この設定を選択したのは、データベースがダウンした場合でもサイトが機能し続けるようにするためです。ダウンタイムは好きではありません。

マスターマスターセットアップが(MySQLで)どのように機能するかについて完全に誤解しているかもしれませんが、私の見方では、通常どおりにデータベースに接続しますが、舞台裏では、MySQLは2つの間でデータを複製しますデータベース。書き込みを行うと、マスター1またはマスター2のいずれかに移動できますが、通常はわかりません(自動インクリメントIDが異なる値を返すことを除いて)。マスターAが何らかの理由で失敗した場合でも、マスターBは機能するため、ダウンタイムは発生しません。マスターAは、再びアップしてデータが複製されるまで無視され、問題がなければ、マスターAは再びフィールドに戻ります。

これが正しければ、上記のとりとめが間違っていたら訂正してください。1人のマスターがダウンした場合に備えて、何か特別なことをする必要がありますか?192.168.1.50(マスターA)に接続した場合、マスターAがダウンするとどうなりますか?MySQLはどういうわけか自動的に192.168.1.51(マスターB)に接続するので、私のサイトは引き続き機能しますか?

私が正しくなかった場合、MySQLマスターマスターレプリケーションはどのように機能しますか?どのマスターで実行する必要があるかを各クエリに指示する必要がありますか?マスターAがダウンした場合でも、マスターAに対するすべてのクエリは失敗し、マスターマスターのセットアップはまったく役に立ちません。

つまり、基本的に、私の質問は実際には次のとおりだと思います。

まだ単一のMySQLホストに接続しますか(NHibernateを使用していますが、それは実際には問題ではありません)、単一の接続文字列を指定しますか?MySQLは2つのマスターがあることを認識しますか、またはコードがそのように変更されますか両方のマスターの接続文字列を指定する必要があること(どのように?)、2つのサーバー間のクエリのバランスをとるために特別な魔法を実行するなど。

私は他に何かが欠けていますか?ありがとう!

4

2 に答える 2

2

マスターマスターセットアップが(MySQLで)どのように機能するかについて完全に誤解しているかもしれませんが、私の見方では、通常どおりにデータベースに接続しますが、舞台裏では、MySQLは2つの間でデータを複製しますデータベース。書き込みを行うと、マスター1またはマスター2のいずれかに移動できますが、通常はわかりません(自動インクリメントIDが異なる値を返すことを除いて)

これは正しくありません。

MySQLレプリケーションは、コミットされたデータ(レプリケーションモードに応じて、変更された行または実際のSQLステートメントのいずれかを意味します)をレプリケーションログに書き込み、そのログをスレーブに送信して再生し、同じ変更を加えることで機能します。

マルチマスターレプリケーションでは、各ノードはマスターとスレーブの両方であり、ループ内の前のマシンから更新を受信し、それらを次のマシンに転送します。各マシンには、レプリケーションログを送受信するときに使用する一意の識別子があり、データが完全に循環したことを識別できます。

この方法は原始的ですが効果的です。また、従来、管理と保守を行うことは、後部での大きな苦痛でした。可能であれば、他のソリューションを優先してマルチマスターを使用しないでください。私はプロダクションでマルチマスターを使用していますが、これは経験から言えます。

192.168.1.50(マスターA)に接続した場合、マスターAがダウンするとどうなりますか?MySQLはどういうわけか自動的に192.168.1.51(マスターB)に接続するので、私のサイトは引き続き機能しますか?

マルチマスターループで1台のマシンに接続すると、その1台のマシンにのみ接続されます。複数のマシンに接続できるようにする必要がある場合、1台がダウンしている場合は、コードを変更するか、中間のロードバランサーを使用して、その状況を手動で処理する必要があります。

さらに悪いことに、ループ内の1台のマシンダウンすると、ループが壊れます。A、B、Cの3つがあるとします。ループはA => B => C => Aになります。Bがダウンすると、AはCに更新を送信できなくなります。つまり、Cが唯一の安全なものになります。 Bが復旧し、ループが復元されるまで接続するマシン。

自動インクリメントに関しては、マルチマスターレプリケーションセットアップでの自動インクリメントを可能にする2つのサーバー変数auto_increment_incrementとを見てください。auto_increment_offsetいかなる状況でも、これら2つの変数を設定せずに、マルチマスターで自動インクリメントを使用しないでください。

于 2011-10-24T15:18:03.310 に答える
0
Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

この接続文字列を使用できます。しかし、私は試しませんでした。

于 2013-03-24T21:46:02.483 に答える