MySQLではレプリケーションがよく利用されます。また、アプリケーションは負荷分散のために、ソースだけでなくレプリカを参照系として利用することも多いです。しかし、レプリケーションは遅延するリスクがあります。そのため、アプリケーションは高負荷やロングトランザクションによる想定外の遅延が起こることを考慮して、設計や実装を検討しなければなりません。
MySQLでは遅延レプリケーションをサポートしています。遅延レプリケーションとは、ソースよりもレプリカへの適用を指定した時間だけ意図的に遅らせることができる仕組みです。ステートメント単位ではなく、トランザクション単位で遅延を発生させます。ソースへのトランザクション実行から指定した時間後に、レプリカに対してそのトランザクションを適用することになります。トランザクション内の各ステートメントは待機時間なく実行されます。
今回はこの遅延レプリケーションの設定方法や利用目的について紹介します。
遅延レプリケーションの設定方法
遅延レプリケーションは簡単に設定できます。レプリカ上でCHANGE REPLICATION SOURCE TO構文のSOURCE_オプションに指定します。STOP REPLICA構文などでSQLスレッドが停止した状態であれば実行できます。SQLスレッドが稼働中に実行すると、エラーになります。
下記の例では、ソースの実行からレプリカに適用されるまで、10秒遅延するように設定しています。デフォルトは0です。
mysql> CHANGE REPLICATION SOURCE TO SOURCE_DELAY=10;
遅延レプリケーションの設定値の確認方法
遅延レプリケーションの設定値はSHOW REPLICA STATUS構文のSQL_フィールドから確認できます。SQL_フィールドにはSOURCE_オプションで指定した値が入ります。Slave_フィールドがWaiting until MASTER_の場合、SQL_フィールドには遅延の残り秒数が入ります。
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
〈略〉
SQL_Delay: 10
SQL_Remaining_Delay: 2
Replica_SQL_Running_State: Waiting until SOURCE_DELAY seconds after
source executed event
〈略〉
performance_replication_テーブルのDESIRED_カラムはSHOW REPLICA STATUSのSQL_と同じデータが入ります。そして、replication_テーブルのREMAINING_カラムはSHOW REPLICA STATUSのSQL_と同様です。
mysql> SELECT * FROM performance_schema.replication_applier_configuration\G
*************************** 1. row ***************************
CHANNEL_NAME:
DESIRED_DELAY: 10
PRIVILEGE_CHECKS_USER: NULL
REQUIRE_ROW_FORMAT: NO
REQUIRE_TABLE_PRIMARY_KEY_CHECK: STREAM
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_TYPE: OFF
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_VALUE: NULL
mysql> SELECT * FROM performance_schema.replication_applier_status\G
*************************** 1. row ***************************
CHANNEL_NAME:
SERVICE_STATE: ON
REMAINING_DELAY: 2
COUNT_TRANSACTIONS_RETRIES: 0
また、SQLスレッドがレプリケーション遅延が経過するのを待機している場合、SHOW PROCESSLIST構文はそのState値をWaiting until MASTER_として表示します。
遅延レプリケーションの利用目的
遅延レプリケーションは以下のような場面で用いられます。
-
レプリケーション遅延のテストに利用
たとえば、あなたのアプリケーションが参照用にレプリカを利用しているとします。レプリケーションはソースの負荷などにより遅延が起こることがあるため、その時のアプリケーションへの影響をテストすることができます。 -
ヒューマンエラーからのデータの保護
たとえば、特定のレプリカにのみにこの遅延レプリケーションを設定します。ミスにより誤ってデータを削除してしまった場合でも、対象のレプリカではその削除がまだ実行されていないので、それを利用しデータを復旧することができます。 -
過去の時点のデータの状態を確認
通常のソースとレプリカはほぼリアルタイムで同期されているので、同じデータが保存されています。そのため、通常は数日前のデータを確認するにはバックアップから復元しなければいけませんが、数日間の遅延レプリケーションを設定することでバックアップか復元せずとデータを確認することができます。
まとめ
今回はMySQLの遅延レプリケーションについて紹介しました。
利用目的のところで紹介しましたように、いくつかの使い所はあると思います。ただし、本番環境へ導入するにはSOURCE_オプションの設定値をどういった値にするか迷います。データの保護や過去データを確認する機会がどれくらいあるか、そのためにMySQLサーバーを用意する必要があるかなど、要件に合わせて導入を検討してください。
筆者としては、現実的に
MySQL公式ドキュメントの17.