1

新しいWebサイトでは、MySQLマスタマスターセットアップに接続する必要があります。これはNHibernateを使用している.NET Webサイトですが、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のすべてのクエリが失敗し、マスターマスターセットアップがまったく役に立たないので、それは意味をなさないでしょう。

だから基本的に、私は私の質問は、実際にあると思う:

私はまだ私はシングルを指定しない、(私はNHibernateはを使用してますが、本当に重要ではありません よ)単一のMySQLホストに接続します接続文字列 とMySQLは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台のマシンになると、ループが壊れます。ループがA => B => C => Aであるとしましょう.Bがダウンすると、Aは更新をCに送信できなくなります。つまり、Cは唯一の安全ですマシンが接続してBが復旧し、ループが復元されるまで接続します。

自動インクリメントに関しては、auto_increment_increment and auto_increment_offsetを参照してください.2つのサーバー変数は、マルチマスターレプリケーションの設定で自動インクリメントを可能にします。どのような状況でも、これらの2つの変数を設定せずにマルチマスターで自動インクリメントを使用しないでください。

0
Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword; 

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

関連する問題