複数のライト・サーバのプライマリ自己成長IDの重複問題の解決

4126 ワード

2台のMysqlサーバー、彼らのIPアドレスはそれぞれ:A:192.168.0.97 B:192.168.0.98データベースはすべてtest_3306まず2台のサーバーのmyをあげます.ini贴出A:my.ini
server-id=2
master-host=192.168.0.98
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all
B:my.ini
server-id=1
master-host=192.168.0.97
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all
ここでは、プロファイルとマスタスレーブプロファイルは基本的に同じlog-slave-updatesというパラメータを必ず付けなければなりません.そうしないと、更新されたレコードがバイナリファイルに記録されません.slave-skip-errorsはスキップエラーです.コピー操作を続行します.他のパラメータは参照してください.http://www.tbqu.com/post/15.html
マルチプライマリ・プロビジョニングとプライマリ・スレーブ・レプリケーションにはいくつかの違いがあります.マルチプライマリではサーバに書き込み権限があるため、自己成長の重複問題に設計されています.
問題(マルチマスター自己成長ID重複)1:まずA,Bのtestテーブル構造2:Aを通して、B上でデータテーブルtest(自己成長IDが存在する)に対して挿入操作を行い、戻り挿入IDが1 3:後にBを停止し、A上でデータテーブルtest(自己成長IDが存在する)に対して挿入操作を行い、戻り挿入IDも1 4:その後、A,Bを同時に起動すると、プライマリキーID重複が現れる
解决方法:私达は2台のサーバーの上で挿入する自增のデータが异なっていることを保证するだけでいいです例えば:Aは奇数のIDを调べて、Bは偶数のIDを挿して、もちろんサーバーが多いならば、あなたはアルゴリズムを定义することができて、异なっているだけでいいです
ここではA,Bにパラメータを加えてパリティ挿入を実現する
A:my.iniにパラメータを加えるauto_increment_offset = 1
auto_increment_increment = 2
こんなAのauto_incrementフィールドで生成される数値は、1,3,5,7,...など奇数IDです.
B:my.iniにパラメータを加えるauto_increment_offset = 2
auto_increment_increment = 2
のようなBのauto_incrementフィールドで生成される数値は、2,4,6,8,...など偶数IDです.
あなたのauto_incrementフィールドは、異なるサーバ間では絶対に繰り返されないので、Master-Master構造に問題はありません.もちろん、auto_を保証する限り、3台、4台、またはN台のサーバを使用することもできます.increment_increment=N auto_を再設定increment_offsetは適切な初期値でよいので、MySQLは自己成長IDの重複を生じずに数十台のプライマリサーバを同時に持つことができます.
ここでは2台のMYSQLサーバについてお話ししますが、複数台に拡張することもできます.A->B->C->D->Aのようなループ状のバックアップ構造が形成されています.最後に、自己成長ID(プライマリ・キー)を設計することを覚えておいてください.そうしないとエラーになります.
————————————————————————————————————————–
Mysqlサーバが3台あると仮定すると、彼らのIPアドレスはそれぞれ192.168.1.8 192.168.1.88192.168.1.1188 192.168.1188 192.168.1.8のインストールディレクトリの下でmyを見つけた.iniファイル、このファイルの最後に追加:server-id=1 log-bin#asyntest 1は私が試験するためのデータベース名で、その時にあなたのデータベース名binlog-do-db=asyntest 1前のマシンで同期したデータは、次のマシンlog-slave-updates master-host=192.168.1.1188 master-user=root#192.168.1.1.1188のrootパスワードmaster-password=XXXXX#asyntest 1に入力します.データベース名replicate-do-db=asyntest 1 master-connect-retry=10#に変更するときは無視し、これを追加しないとエラーが発生し、同期プロセスはslave-skip-errors=allを終了します.
192.168.1.888のインストールディレクトリの下でmyを見つけます.iniファイル、このファイルの最後に追加:server-id=2 log-bin#asyntest 1は私が試験するために使用したデータベース名で、その時にあなたのデータベース名binlog-do-db=asyntest 1#の次の言葉に変えることが重要です.それを加えるだけです.前のマシンで同期したデータは、次のマシンlog-slave-updates master-host=192.168.1.8 master-user=root#192.168.1.8のrootパスワードmaster-password=XXXXX#asyntest 1を入力します.データベース名replicate-do-db=asyntest 1 master-connect-retry=10#に変更するときは無視し、これを追加しないとエラーが発生し、同期プロセスはslave-skip-errors=allを終了し、192.168.188のインストールディレクトリの下でmyを見つけます.iniファイル、このファイルの最後に追加:server-id=3 log-bin#asyntest 1は私が試験するために使用したデータベース名で、その時にあなたのデータベース名binlog-do-db=asyntest 1#に変更します.次の言葉は重要です.それを加えるだけです.前のマシンで同期されたデータは、次のマシンlog-slave-updates master-host=192.168.1.888 master-user=root#192.168.1........888のrootパスワードmaster-password=XXXXX#asyntest 1に入力します.データベース名replicate-do-db=asyntest 1 master-connect-retry=10#に変更するときは無視し、これを追加しないとエラーが発生し、同期プロセスはslave-skip-errors=allを終了します.
192.168.1.8,192.168.1.888,192.168.1.1.1.1188に全く同じデータベースasyntest 1を構築し、この3台のデータベースを再起動し、その後、どのマシンで行われた更新操作も、他の2台のマシンに同期します.これはリング同期で、192.168.1.8で変更があれば、まず192.168.1.888のマシンに同期します.88のマシンは、同期されたデータを192.168.1.1.188のマシンに同期します.同様に、192.168.1.888で更新があれば、まず192.168.1.1.1188のマシンに同期し、192.168.1.8のマシンに同期します.192.168.1.1.188のマシンで更新があれば、まず192.168.1.8のマシンに同期し、192.168.1.88に同期したマシンに同期します.この原理により,任意の複数の機器の相互同期問題を解決できる.
問題が発生した場合は、まず各サーバ上でコマンドラインでtelnetコマンドで他のマシン3306ポートの接続状況を確認してください.また、各機器のファイアウォール設定とウイルス対策ソフトの配置を確認してください.これらのソフトウェアは一時停止してから試験することができます.