Aurora MySQL でのバイナリログのレプリケーションの最適化 - Amazon Aurora

Aurora MySQL でのバイナリログのレプリケーションの最適化

次に、Aurora MySQL でバイナリログのレプリケーションのパフォーマンスを最適化し、関連する問題のトラブルシューティングを行う方法について説明します。

ヒント

この説明は、MySQL バイナリログのレプリケーションメカニズムとその仕組みに精通していることを前提としています。背景情報については、MySQL ドキュメントの「レプリケーション実装ガイド」を参照してください。

マルチスレッドバイナリログレプリケーション

マルチスレッドのバイナリログレプリケーションでは、SQL スレッドはリレーログからイベントを読み取り、SQL ワーカースレッドが適用されるようにキューに入れます。SQL ワーカースレッドは、コーディネータスレッドによって管理されます。バイナリログイベントは、可能な場合はパラレルに適用されます。

マルチスレッドバイナリログレプリケーションは、Aurora MySQL バージョン 3 および Aurora MySQL バージョン 2.12.1 以降でサポートされています。

Aurora MySQL DB インスタンスがバイナリログレプリケーションを使用するように構成されている場合、レプリカインスタンスはデフォルトで 3.04 より前の Aurora MySQL バージョンに対してシングルスレッドレプリケーションを使用します。マルチスレッドレプリケーションを有効にするには、カスタムパラメータグループの replica_parallel_workers パラメータを 0 より大きい値に設定します。

Aurora MySQL バージョン 3.04 以降では、レプリケーションはデフォルトでマルチスレッド化され、replica_parallel_workers4 に設定されています。このパラメータはカスタムパラメータグループで変更できます。

以下の構成オプションを使用して、マルチスレッドレプリケーションを微調整することができます。使用量に関する情報については、MySQL リファレンスマニュアルレプリケーションとバイナリログのオプションと可変を参照してください。

最適な構成は、いくつかの要因によって異なります。例えば、バイナリログレプリケーションのパフォーマンスは、データベースワークロードの特性と、レプリカが実行されている DB インスタンスクラスの影響を受けます。したがって、新しいパラメータ設定を本番インスタンスに適用する前に、これらの構成パラメータに対するすべての変更を徹底的にテストすることをお勧めします。

  • binlog_group_commit_sync_delay

  • binlog_group_commit_sync_no_delay_count

  • binlog_transaction_dependency_history_size

  • binlog_transaction_dependency_tracking

  • replica_preserve_commit_order

  • replica_parallel_type

  • replica_parallel_workers

Aurora MySQL バージョン 3.06 以降では、複数のセカンダリインデックスを持つ大きなテーブルのトランザクションをレプリケートするときにバイナリログレプリカのパフォーマンスを向上させることができます。この機能により、バイナリログレプリカにセカンダリインデックスの変更を並列で適用するスレッドプールが導入されます。この機能は aurora_binlog_replication_sec_index_parallel_workers DB クラスターパラメータによって制御されます。これにより、セカンダリインデックスの変更を適用できる並列スレッドの総数が制御されます。パラメータは、デフォルトで 0 (無効) に設定されています。この機能を有効にしてもインスタンスを再起動する必要はありません。この機能を有効にするには、進行中のレプリケーションを停止し、必要な数の並列ワーカースレッドを設定してから、レプリケーションを再開します。

また、このパラメータをグローバル変数として使用することもできます。ここで、n は並列ワーカースレッドの数です。

SET global aurora_binlog_replication_sec_index_parallel_workers=n;

バイナリログレプリケーションの最適化 (Aurora MySQL 2.10 以降)

Aurora MySQL 2.10 以降では、Aurora は、バイナリログのレプリケーションにバイナリログ I/O キャッシュと呼ばれる最適化を自動的に適用します。最後にコミットされたバイナリログイベントをキャッシュすることにより、この最適化は、バイナリログ出典インスタンスでのフォアグラウンドトランザクションへの影響を制限しながら、バイナリログのダンプスレッドのパフォーマンスを向上するように設計されています。

注記

この機能に使用されるこのメモリは、MySQL binlog_cache 設定とは無関係です。

この機能は、db.t2 および db.t3 インスタンスクラスを使用する Aurora DB インスタンスには適用されません。

この最適化を有効にするために、設定パラメータを調整する必要はありません。特に、以前の Aurora MySQL バージョンで設定パラメータ aurora_binlog_replication_max_yield_seconds をゼロ以外の値に調整する場合は、Aurora MySQL 2.10 以降ではゼロに戻します。

ステータス可変 aurora_binlog_io_cache_reads および aurora_binlog_io_cache_read_requests は Aurora MySQL 2.10 以降で使用できます。これらのステータス可変は、バイナリログ I/O キャッシュからデータが読み込まれる頻度をモニタリングするのに役立ちます。

  • aurora_binlog_io_cache_read_requests はキャッシュからのバイナリログ I/O 読み取りリクエストの数を示します。

  • aurora_binlog_io_cache_reads はキャッシュから情報を取得するバイナリログ I/O 読み取り数を示します。

次の SQL クエリは、キャッシュされた情報を利用するバイナリログ読み取りリクエストの割合を計算します。この場合、比率が 100 に近づくほど、より良好であることを意味します。

mysql> SELECT (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='aurora_binlog_io_cache_reads') / (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='aurora_binlog_io_cache_read_requests') * 100 as binlog_io_cache_hit_ratio; +---------------------------+ | binlog_io_cache_hit_ratio | +---------------------------+ | 99.99847949080622 | +---------------------------+

バイナリログ I/O キャッシュ機能には、バイナリログのダンプスレッドに関連する新しいメトリクスも含まれています。ダンプスレッドは、新しいバイナリログレプリカがバイナリログ出典インスタンスに接続したときに作成されるスレッドです。

ダンプスレッドメトリクスは、60 秒ごとにプレフィックス [Dump thread metrics] を伴ってデータベースログに出力されます。メトリクスには、Secondary_idSecondary_uuid、バイナリログのファイル名、各レプリカが読み込んでいる位置など、各バイナリログのレプリカの情報が含まれます。メトリクスには、レプリケーション出典とレプリカの間の距離をバイト単位で表す Bytes_behind_primary も含まれます。このメトリクスは、レプリカ I/O スレッドのラグを測定します。この数値は、バイナリログのレプリカの seconds_behind_master メトリクスによって表されるレプリカ SQL 適用元スレッドのラグとは異なります。距離が減少するか増加するかを確認することで、バイナリログレプリカが出典に追いついているのか、遅れているのかを判断できます。

バイナリログレプリケーションの最適化 (Aurora MySQL バージョン 2~2.09)

Aurora MySQL のバイナリログのレプリケーションを最適化するには、以下のクラスターレベルの最適化パラメータを調整します。これらのパラメータは、バイナリログの出典インスタンスのレイテンシーとレプリケーションラグの間の適切なバランスを特定するのに役立ちます。

  • aurora_binlog_use_large_read_buffer

  • aurora_binlog_read_buffer_size

  • aurora_binlog_replication_max_yield_seconds

注記

MySQL 5.7 互換クラスターの場合、Aurora MySQL バージョン 2 から 2.09.* でこれらのパラメータを使用できます。Aurora MySQL 2.10.0 以降では、これらのパラメータはバイナリログ I/O キャッシュの最適化によって置き換えられ、それらを使用する必要はありません。

大きな読み取りバッファと最大収量の最適化の概要

クラスターが多数のトランザクションを処理している間、バイナリログのダンプスレッドが Aurora クラスターボリュームにアクセスすると、バイナリログレプリケーションのパフォーマンスが低下することがあります。パラメータ aurora_binlog_use_large_read_bufferaurora_binlog_replication_max_yield_secondsaurora_binlog_read_buffer_size を使用すると、このタイプの競合を最小限に抑えることができます。

例えばaurora_binlog_replication_max_yield_seconds が 0 より大きい値に設定され、ダンプスレッドの現在のバイナリログファイルがアクティブな状況にあるとします。この場合、バイナリログのダンプスレッドは、トランザクションによって現在のバイナリログファイルがいっぱいになるまで、指定された秒数待ちます。この待機期間により、各バイナリログイベントを個別にレプリケートすることによって発生する可能性のある競合が回避されます。ただし、それによりバイナリログレプリカのレプリカラグが増加します。これらのレプリカは、aurora_binlog_replication_max_yield_seconds 設定と同じ秒数だけ出典より遅れる可能性があります。

現在のバイナリログファイルとは、スレッドダンプがレプリケーションを実行するために現在読み込んでいるバイナリログファイルのことです。バイナリログファイルが更新中または受信トランザクションによる更新のために開かれているとき、バイナリログファイルはアクティブであると見なします。Aurora MySQL がアクティブなバイナリログファイルでいっぱいになると、MySQL が新しいバイナリログファイルを作成して切り替えます。古いバイナリログファイルは非アクティブになります。受信トランザクションによって更新されることはありません。

注記

これらのパラメータを調整する前に、トランザクションのレイテンシーとスループットを長期間測定してください。バイナリログレプリケーションのパフォーマンスは安定しており、競合が時折発生する場合でも低レイテンシーとなります。

aurora_binlog_use_large_read_buffer

このパラメータが 1 に設定されている場合、パラメータ aurora_binlog_read_buffer_size および aurora_binlog_replication_max_yield_seconds の設定に基づいて、Aurora MySQL がバイナリログのレプリケーションを最適化します。aurora_binlog_use_large_read_buffer が 0 の場合、Aurora MySQL はパラメータ aurora_binlog_read_buffer_size および aurora_binlog_replication_max_yield_seconds の値を無視します。

aurora_binlog_read_buffer_size

読み取りバッファが大きいバイナリログのスレッドダンプは、I/O ごとにより多くのイベントを読み取ることで、読み取り I/O オペレーションの数を最小化しています。読み取りバッファのサイズは、aurora_binlog_read_buffer_size パラメータで設定します。読み取りバッファが大きいと、大量のバイナリログデータを生成するワークロードのバイナリログの競合を減らすことができます。

注記

このパラメータは、クラスターにも設定 aurora_binlog_use_large_read_buffer=1 がある場合にのみ有効です。

読み取りバッファサイズを拡張しても、バイナリログのレプリケーションのパフォーマンスに影響はありません。バイナリログのダンプスレッドは、読み取りバッファを満たすトランザクションの更新を待ちません。

aurora_binlog_replication_max_yield_seconds

ワークロードに必要なトランザクションのレイテンシーが低く、レプリケーションラグを許容できる場合は、aurora_binlog_replication_max_yield_seconds パラメータを増やすことができます。このパラメータにより、クラスター内のバイナリログレプリケーションの最大収率のプロパティが制御されます。

注記

このパラメータは、クラスターにも設定 aurora_binlog_use_large_read_buffer=1 がある場合にのみ有効です。

Aurora MySQL は、aurora_binlog_replication_max_yield_seconds パラメータ値への変更をただちに認識します。DB インスタンスを再起動する必要はありません。ただし、この設定を有効にすると、現在のバイナリログファイルが最大サイズの 128 MB に達し、新しいファイルにローテーションされた場合にのみ、ダンプスレッドの生成がスタートされます。

関連パラメータ

次の DB クラスターパラメータを使用して、バイナリログの最適化を有効にします。

Parameter デフォルト 有効な値 Description
aurora_binlog_use_large_read_buffer 1 0、1 レプリケーション改善の機能を有効化するスイッチ。値が 1 のとき、バイナリログのダンプスレッドによって、バイナリログのレプリケーションに aurora_binlog_read_buffer_size が使用されます。それ以外の場合は、デフォルトのバッファサイズ (8K) が使用されます。Aurora MySQL バージョン 3 では使用されません。
aurora_binlog_read_buffer_size 5242880 8192-536870912 パラメータ aurora_binlog_use_large_read_buffer が 1 に設定されている場合に、バイナリログのダンプスレッドで使用される読み取りバッファサイズ。Aurora MySQL バージョン 3 では使用されません。
aurora_binlog_replication_max_yield_seconds 0 0~36000

Aurora MySQL バージョン 2.07.* の場合、受け入れられる最大値は 45 です。2.09 以降のバージョンでは、より高い値に調整できます。

バージョン 2 の場合、このパラメータは、パラメータ aurora_binlog_use_large_read_buffer が 1 に設定されている場合にのみ機能します。

バイナリログレプリケーションの最大収率メカニズムの有効化

次のように、バイナリログレプリケーションの最大収率の最適化を有効にすることができます。これにより、バイナリログの出典インスタンスでのトランザクションのレイテンシーが最小限に抑えられます。ただし、レプリケーションラグが大きくなる場合があります。

Aurora MySQL クラスターのバイナリログ最大収率の最適化を有効にするには
  1. DB クラスターパラメータグループを作成または編集するには、以下のパラメータ設定を使用します。

    • aurora_binlog_use_large_read_buffer: ON または 1 値で有効化します。

    • aurora_binlog_replication_max_yield_seconds: 0 より大きい値を指定します。

  2. DB クラスターのパラメータグループを、バイナリログの出典として機能する Aurora MySQL クラスターに関連付けます。そのためには、「Amazon Aurora のパラメータグループ」の手順に従います。

  3. パラメータの変更が有効なっていることを確認します。これを行うには、バイナリログの出典インスタンスで以下のクエリを実行します。

    SELECT @@aurora_binlog_use_large_read_buffer, @@aurora_binlog_replication_max_yield_seconds;

    出力は次のようになります。

    +---------------------------------------+-----------------------------------------------+ | @@aurora_binlog_use_large_read_buffer | @@aurora_binlog_replication_max_yield_seconds | +---------------------------------------+-----------------------------------------------+ | 1 | 45 | +---------------------------------------+-----------------------------------------------+

バイナリログのレプリケーションを無効化する最大収率の最適化

以下のように、バイナリログのレプリケーションの最大収率の最適化を無効化することができます。これにより、レプリケーションラグが最小限に抑えられます。ただし、バイナリログの出典インスタンスでのトランザクションのレイテンシーが高くなることがあります。

Aurora MySQL クラスターの最大収率の最適化を無効化するには
  1. Aurora MySQL クラスターに関連付けられている DB クラスターのパラメータグループで、aurora_binlog_replication_max_yield_seconds が 0 に設定されていることを確認します。パラメータグループを使用して設定パラメータの設定の詳細については、「Amazon Aurora のパラメータグループ」を参照してください。

  2. パラメータの変更が有効なっていることを確認します。これを行うには、バイナリログの出典インスタンスで以下のクエリを実行します。

    SELECT @@aurora_binlog_replication_max_yield_seconds;

    出力は次のようになります。

    +-----------------------------------------------+ | @@aurora_binlog_replication_max_yield_seconds | +-----------------------------------------------+ | 0 | +-----------------------------------------------+

大きい読み取りバッファを無効化する

以下のように、大きい読み取りバッファの機能全体を無効化することができます。

Aurora MySQL クラスターで大きいバイナリログの読み取りバッファを無効化するには
  1. aurora_binlog_use_large_read_bufferOFF または 0 にリセットします。

    Aurora MySQL クラスターに関連付けられている DB クラスターのパラメータグループで、aurora_binlog_use_large_read_buffer が 0 に設定されていることを確認します。パラメータグループを使用して設定パラメータの設定の詳細については、「Amazon Aurora のパラメータグループ」を参照してください。

  2. バイナリログの出典インスタンスで、以下のクエリを実行します。

    SELECT @@ aurora_binlog_use_large_read_buffer;

    出力は次のようになります。

    +---------------------------------------+ | @@aurora_binlog_use_large_read_buffer | +---------------------------------------+ | 0 | +---------------------------------------+