web-dev-qa-db-ja.com

マスター-マスター複製重複エントリエラー

マスター-マスターレプリケーションのセットアップがあり、数日間は問題なく動作しましたが、次の問題が発生します:数日後に重複エントリエラー。

私の設定は次のとおりです。オランダの1台のサーバーとワシントンD.C.の1台のサーバー。両方のサーバーでWindows Server 2012 R2とMySQL 5.6.15 X64を実行しています。

私は このチュートリアル に従いました。

ぼくの my.iniファイルには以下が含まれます。

オランダのサーバー

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs

ワシントンD.C.サーバー

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs

両方のサーバーがスレーブを停止し続け、どちらも同じことを報告します:重複エントリーエラー。例えば:

クエリのキー 'PRIMARY'のエラー 'Duplicate entry' 4353 '。

これを防ぐにはどうすればよいですか?

2
gijs007

あなたがリンクしたチュートリアルは非常に楽観的です。自動生成されたAUTO_INCREMENT PRIMARY KEYの場合のみをカバーすることに注意してください。

それが提案するメソッドは、もちろん一般的なUNIQUE KEYを含むPRIMARY KEYの一般的なケースをカバーしていません。

この記事では、「レプリケーションで最も一般的な問題は主キーの衝突」について言及しています。その後、他のすべての問題については完全に言及していません...

したがって、とにかく、UNIQUE KEYの衝突が発生すると、おそらく両方向でレプリケーションが壊れてしまいます。

レプリケーションに失敗したのはどのテーブルですか?そのテーブルはAUTO_INCREMENT PRIMARY KEYまたは「一般的な」PRIMARY KEY(つまり、AUTO_ICNREMENT以外の列)でしたか?

一意のキーの一般的なケースを解決するには、アプリケーションはその場所(オランダまたはワシントンDC)を十分に認識している必要があり、衝突を引き起こす可能性のあるデータの書き込みを控える必要があります。または、同期/ロックメカニズムを使用することもできます。もちろん、データは大西洋を横断する必要があるため、遅延が発生します。

binlog_do_dbの使用もナイーブで危険であることも示唆するかもしれません。 mysqlスキーマを複製しないでよろしいですか?新しいスキーマを追加するとどうなりますか?一般的な正しい解決策は、フィルタリングなしで完全な複製を作成することです。そうしないと、なぜそうしないのかという非常に良い説明が得られます。

最後に、アクティブ-アクティブマスター-マスターレプリケーションの使用はお勧めしません。過去に利用していたお客様もいました。そのセットアップのために彼らが遭遇したトラブルの量、そして私の反対の推奨にもかかわらず、多くの台無しにされた週末と休日につながりました。

Galeraレプリケーション を確認することをお勧めします。これは同期マスターレプリケーションソリューションであり、WAN経由で機能すると聞きました。これにより、アプリケーションを無知のままにすることができます。クラスタの一部が不変になるため、ネットワーク障害に注意してください。

5
Shlomi Noach

完全な手順をやり直したくない場合は、使用することをお勧めします。

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

このようなエラーが多すぎる場合は、bashスクリプトを使用して自動化することをお勧めします。

参照:重複エントリエラーの修正

サーバー間の潜在的な不整合を回避するには、pt-table-checksumを実行せずにこれを行わないでください。

2