MySQL道普請便り

第230回MySQLの遅延レプリケーションについて

MySQLではレプリケーションがよく利用されます。また、アプリケーションは負荷分散のために、ソースだけでなくレプリカを参照系として利用することも多いです。しかし、レプリケーションは遅延するリスクがあります。そのため、アプリケーションは高負荷やロングトランザクションによる想定外の遅延が起こることを考慮して、設計や実装を検討しなければなりません。

MySQLでは遅延レプリケーションをサポートしています。遅延レプリケーションとは、ソースよりもレプリカへの適用を指定した時間だけ意図的に遅らせることができる仕組みです。ステートメント単位ではなく、トランザクション単位で遅延を発生させます。ソースへのトランザクション実行から指定した時間後に、レプリカに対してそのトランザクションを適用することになります。トランザクション内の各ステートメントは待機時間なく実行されます。

今回はこの遅延レプリケーションの設定方法や利用目的について紹介します。

遅延レプリケーションの設定方法

遅延レプリケーションは簡単に設定できます。レプリカ上でCHANGE REPLICATION SOURCE TO構文のSOURCE_DELAYオプションに指定します。STOP REPLICA構文などでSQLスレッドが停止した状態であれば実行できます。SQLスレッドが稼働中に実行すると、エラーになります。

下記の例では、ソースの実行からレプリカに適用されるまで、10秒遅延するように設定しています。デフォルトは0です。

mysql> CHANGE REPLICATION SOURCE TO SOURCE_DELAY=10;

遅延レプリケーションの設定値の確認方法

遅延レプリケーションの設定値はSHOW REPLICA STATUS構文のSQL_Delayフィールドから確認できます。SQL_DelayフィールドにはSOURCE_DELAYオプションで指定した値が入ります。Slave_SQL_Running_StateフィールドがWaiting until MASTER_DELAY seconds after master executed eventの場合、SQL_Remaining_Delayフィールドには遅延の残り秒数が入ります。

SHOW REPLICA STATUSの例
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_schemaデータベースからも確認できます。replication_applier_configurationテーブルのDESIRED_DELAYカラムはSHOW REPLICA STATUSSQL_Delayと同じデータが入ります。そして、replication_applier_statusテーブルのREMAINING_DELAYカラムはSHOW REPLICA STATUSSQL_Remaining_Delayと同様です。

performance_schemaデータベースの例
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_DELAY seconds after master executed eventとして表示します。

遅延レプリケーションの利用目的

遅延レプリケーションは以下のような場面で用いられます。

  1. レプリケーション遅延のテストに利用
    たとえば、あなたのアプリケーションが参照用にレプリカを利用しているとします。レプリケーションはソースの負荷などにより遅延が起こることがあるため、その時のアプリケーションへの影響をテストすることができます。

  2. ヒューマンエラーからのデータの保護
    たとえば、特定のレプリカにのみにこの遅延レプリケーションを設定します。ミスにより誤ってデータを削除してしまった場合でも、対象のレプリカではその削除がまだ実行されていないので、それを利用しデータを復旧することができます。

  3. 過去の時点のデータの状態を確認
    通常のソースとレプリカはほぼリアルタイムで同期されているので、同じデータが保存されています。そのため、通常は数日前のデータを確認するにはバックアップから復元しなければいけませんが、数日間の遅延レプリケーションを設定することでバックアップか復元せずとデータを確認することができます。

まとめ

今回はMySQLの遅延レプリケーションについて紹介しました。

利用目的のところで紹介しましたように、いくつかの使い所はあると思います。ただし、本番環境へ導入するにはSOURCE_DELAYオプションの設定値をどういった値にするか迷います。データの保護や過去データを確認する機会がどれくらいあるか、そのためにMySQLサーバーを用意する必要があるかなど、要件に合わせて導入を検討してください。

筆者としては、現実的に⁠レプリケーション遅延のテストに利用⁠という点に遅延レプリケーションの利用価値があると考えます。また紛らわしいですが、MySQLのドキュメント上に⁠遅延レプリケーション⁠⁠レプリケーション遅延⁠の記述があります。⁠遅延レプリケーション⁠は今回紹介した内容で、意図的にレプリケーションを遅延させる仕組みで、⁠レプリケーション遅延⁠は負荷等が原因で想定外のレプリケーションの遅延を指しています。

MySQL公式ドキュメントの17.4.11 遅延レプリケーションに参考しているので、もっと詳しく知りたい方はこちらをご参照ください。

おすすめ記事

記事・ニュース一覧