マルチマスターレプリケーションでMySQL集群を使用することは可能です(多くのMySQL集群間の循環レプリケーションを含みます)。
循環レプリケ,ションの例次のいくかのパラグラフでは,次のようなレプリケションセットアップの例にいて検討します。このセットアップは,番号が1,2,3のつのMySQL集群で構成され,クラスタ1はクラスタ2のレプリケーションマスターとして動作し,クラスタ2はクラスタ3のマスターとして動作し,クラスタ3はクラスタ1のマスターとして動作します。各クラスタは2つのSQLノードを持ち,SQLノードとBはクラスタ1に属し,SQLノードCとDはクラスタ2に属し,SQLノードEとFはクラスタ3に属しています。
これらのクラスタを使用する循環レプリケ,ションは,次の条件を満たすかぎり,サポ,トされます。
すべてのマスタとスレブのSQLノドは同じ
レプリケションのマスタおよびスレブとして動作するすべてのSQLノドが
——log-slave-updates
オプションを使用して起動される
このタ。
このシナリオでは,クラスタ1のSQLノード一はクラスタ2のSQLノードCに複製し,SQLノードCはクラスタ3のSQLノードEに複製し,SQLノードEはSQLノード一に複製します。言い換えると,レプリケーションライン(図中の赤の矢印)は,レプリケーションのマスターおよびスレーブとして使用されるすべてのSQLノードを直接接続します。
ここで示すように,すべてのマスターSQLノードが必ずしもスレーブというわけではない場合に,循環レプリケーションをセットアップすることも可能です。
この場合,各クラスタの異なるSQLノードはレプリケーションのマスターおよびスレーブとして使用されます。ただし,sqlノ,ドを——log-slave-updates
を使用して起動する必要はありません。レプリケーションのライン(これも図中の赤の矢印)が連続的でないMySQL集群のこのタイプの循環レプリケーションスキームは,可能性はありますが,まだ完全にはテストされていないため,実験的なものだと考えるようにしてください。
NDBネティブのバックアップとリストアを使用したスレ,ブMySQL集群の初期化循環レプリケーションをセットアップする場合,バックアップを作成するMySQL集群で管理クライアントの备份
コマンドを使用してから,ndb_restoreを使用して別のMySQL集群でこのバックアップを適用すると,スレーブクラスタを初期化できます。ただし,これによってバイナリログが,レプリケーションスレーブとして動作する2番目のMySQL集群のSQLノードに,自動的に作成されることはありません。バ▪▪ナリログが作成されるようにするには,対象のSQLノ▪▪ドで显示表
ステ,トメントを発行する必要があります。これは,开始的奴隶
を実行する前に行なってください。
これは,今後のリリ,スで対応する予定の既知の問題です。
マルチマスタのフェルオバの例このセクションでは,3つのMySQL集群のサーバーIDが1,2,および3であるマルチマスターのMySQL集群レプリケーションセットアップでのフェイルオーバーについて説明します。このシナリオでは,クラスタ1はクラスタ2および3に複製し,クラスタ2もクラスタ3に複製します。この関係はここで示すとおりです。
つまり,データはクラスタ1からクラスタ3へ異なる2つのルートを介して(直接,およびクラスタ2経由で)複製されます。
マルチマスターレプリケーションに参加するすべてのMySQLサーバーが必ずしもマスターとスレーブの両方の役割を果たさなければならないわけではなく,特定のMySQL集群が異なるレプリケーションチャネルの異なるSQLノードを使用する場合があります。このようなケ,スを次に示します。
レプリケションスレブとして動作しているMySQLサバは,——log-slave-updates
オプションを使用して実行する必要があります。また,どのmysqldプロセスでこのオプションが必要か,前の図に示されています。
——log-slave-updates
オプションを使用しても,レプリケ,ションスレ,ブとして動作していないサ,バ,には作用しません。
複製しているクラスタの1が停止した場合,。この例では,クラスタ1のサービスが失われ,そのためにクラスタ3がクラスタ1の更新の2つのソースを失うケースを検討します。MySQL集群間のレプリケーションが非同期であるため,クラスタ1から直接生じるクラスタ3の更新が,クラスタ2を経由して受け取った更新よりも新しいという保証はありません。クラスタ1からの更新に関して,クラスタ3が確実にクラスタ2に追いつくことで,これに対処できます。すなわちMySQLサーバーに関して,未処理の更新をMySQLサーバーCからサーバーFに複製する必要があります。
サ,バ,cで,次のクエリ,を実行します。
mysqlC> SELECT @latest:=MAX(epoch) -> FROM mysql。ndb_apply_status -> WHERE server_id=1;mysqlC> SELECT -> @file:=SUBSTRING_INDEX(File, '/', -1), -> @pos:=Position -> FROM mysql。ndb_binlog_index-> WHERE orig_epoch >= @latest -> AND orig_server_id = 1 -> ORDER BY epoch ASC LIMIT 1;
適切な@ @ンデックスをndb_binlog_index
テーブルに追加することで,このクエリーのパフォーマンスを向上できるため,フェイルオーバー時間が大幅に短縮される可能性があります。詳細にいては,セクション18.6.4“MySQL集群レプリケションスキマとテブル”を参照してください。
@file
および@pos
の値を手動でサーバーCからサーバーFにコピーをします(またはアプリケーションで同様に実行させます)。次にサ,バ,fで,次の将master更改为
ステ,トメントを実行します。
mysqlF> CHANGE MASTER TO -> MASTER_HOST =' serverC' -> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;
この実行後,MySQLサ,バ,Fで开始的奴隶
ステートメントを発行でき,サーバーBから生じた,不足している更新がサーバーFに複製されます。
将master更改为
ステ,トメントはIGNORE_SERVER_IDS
オプションもサポ,トします。このオプションは,カンマ区切りのサーバーのIDを使用し,対応するサーバーから発生したイベントが無視されます。詳細にいては,セクション13.4.2.1 " change master to構文"およびセクション13.7.5.35 " show slave status構文"を参照してください。