プライマリクラスタのレプリケーションプロセスが失敗した場合、セカンダリレプリケーションチャネルに切り替えることができます。次に、この実現に必要なステップについて説明します。
-
最新のグローバルチェックポイント (GCP) の時間を取得します。すなわち、スレーブクラスタの
ndb_apply_status
テーブルから最新のエポックを指定する必要があり、これは次のクエリーを使用して特定できます。mysqlS'> SELECT @latest:=MAX(epoch) -> FROM mysql.ndb_apply_status;
-
ステップ 1 で示したクエリーから得た情報を使用して、マスタークラスタの
ndb_binlog_index
テーブルから対応するレコードを取得します。MySQL Cluster NDB 7.3 では、次のクエリーを使用すると、マスターの
ndb_binlog_index
テーブルから必要なレコードを取得できます。mysqlM'> SELECT -> @file:=SUBSTRING_INDEX(next_file, '/', -1), -> @pos:=next_position -> FROM mysql.ndb_binlog_index -> WHERE epoch = @latest -> ORDER BY epoch ASC LIMIT 1;
これらは、プライマリレプリケーションチャネルでの障害発生後に、マスターに保存されたレコードです。ここでは、ユーザー変数
@latest
を使用して、ステップ 1 で取得した値を表します。もちろん、ある mysqld インスタンスが、ほかのサーバーインスタンスに設定されたユーザー変数には直接アクセスできません。これらの値は、手動で 2 番目のクエリーに、またはアプリケーションコードに「プラグインする」必要があります。重要START SLAVE
を実行する前に、スレーブ mysqld が--slave-skip-errors=ddl_exist_errors
で起動されていることを確認します。そうしないと、レプリケーションが重複 DDL エラーで停止する可能性があります。 -
これで、セカンダリスレーブサーバーで次のクエリーを実行して、セカンダリチャネルの同期を取ることができるようになります。
mysqlS'> CHANGE MASTER TO -> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;
再度ユーザー変数 (この場合は
@file
と@pos
) を使用して、ステップ 2 で取得され、ステップ 3 で適用される値を表します。実際には、これらの値を手動で挿入するか、関与する両方のサーバーにアクセスできるアプリケーションコードを使用して挿入する必要があります。注記@file
は'/var/log/mysql/replication-master-bin.00001'
などの文字列値であるため、SQL またはアプリケーションコードで使用するときは、引用符で囲む必要があります。ただし、@pos
で表される値は引用符で囲む必要はありません。通常、MySQL は文字列を数字に変換しようとしますが、この場合は例外です。 -
これで、セカンダリスレーブの mysqld で適切なコマンドを発行して、セカンダリチャネルでレプリケーションを開始できるようになりました。
mysqlS'> START SLAVE;
セカンダリレプリケーションチャネルがアクティブになったら、プライマリの不具合を調べて、修復できます。これを行うために必要な的確なアクションは、プライマリチャネルで失敗した原因によって異なります。
セカンダリレプリケーションチャネルは、プライマリレプリケーションチャネルの停止時や停止した場合にのみ、起動されます。複数のレプリケーションチャネルを同時に実行すると、不要な重複レコードがレプリケーションスレーブで作成される可能性があります。
障害が 1 台のサーバーに限定される場合、M
から S'
に、または M'
から S
に、(論理的には) 複製できますが、まだ検証されていません。