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.