ピーク時間帯には、多数のワークロードがデータベースを高い同時実行性で更新します。プライマリインスタンスにおけるトランザクションスループット(TPS)が、レプリカインスタンスの I/O スレッドおよび SQL スレッドのスループットを上回ると、レプリケーションレイテンシが発生する可能性があります。この問題に対処するため、ApsaraDB RDS for MySQL では、I/O スレッド、SQL スレッド、およびワーカースレッド間のロック待ちロジックを最適化し、ロック待ちの回数を削減します。この最適化により、高同時実行性の小規模トランザクションを対象としたワークロードにおいて、レプリケーションレイテンシが解消されます。
概要
レプリケーションレイテンシ

レプリケーションレイテンシ:ピーク時間帯には、多数のワークロードがデータベースを高い同時実行性で更新します。プライマリインスタンスにおけるトランザクション適用の同時実行数が、レプリカインスタンスを上回る場合、レプリカのトランザクションスループットが遅れ、レプリケーションレイテンシが発生します。ワーカースレッド数を増加させたり、Writeset 機能を有効にしたりしても、I/O スレッドまたは SQL スレッドがスループットボトルネックに達しているため、レプリカの適用同時実行数が依然として不十分となる場合があります。

I/O スレッドおよび SQL スレッドのスループットボトルネック:MySQL のマルチスレッドレプリケーションでは、I/O スレッド、SQL スレッド、および複数のワーカースレッドの 3 種類のスレッドが使用されます。I/O スレッドは、プライマリインスタンスから binlog イベントを取得します。SQL スレッドは、これらの binlog イベントをワーカースレッドに配信します。その後、ワーカースレッドが並列でトランザクションを適用します。
I/O スレッドと SQL スレッド間、および SQL スレッドとワーカースレッド間の協調動作は、ロック保護された待機・通知操作に依存しています。各 binlog イベントに対して、1 回のロック・通知サイクルが必要です。1 つのトランザクションは、複数の binlog イベントで構成されます。たとえば、一般的な sysbench write_only テストスクリプトでは、1 つのトランザクションで 2 行の更新、1 行の挿入、1 行の削除が行われ、合計 11 個の binlog イベントが生成されます。高い同時実行性下では、これらのロックが頻繁にパフォーマンスボトルネックとなり、I/O スレッドおよび SQL スレッドのスループットが制限されます。
I/O スレッドまたは SQL スレッドがスループットボトルネックに達すると、ワーカースレッドは適用すべきトランザクションを迅速に受信できなくなります。レプリカインスタンスのワーカースレッドによる適用同時実行数が、プライマリインスタンスのワークロード同時実行数を下回る場合、レプリケーションレイテンシが発生します。
小規模トランザクションのバッチ処理最適化
高同時実行性の小規模トランザクションにおけるレプリケーションレイテンシを最適化するため、AliSQL では小規模トランザクションのバッチ処理最適化を導入しています。この最適化により、小規模トランザクションに含まれる複数の binlog イベントが、I/O スレッドおよび SQL スレッド向けに単一のロック・通知サイクルにバンドルされます。これにより、ロック操作の回数が大幅に削減され、I/O スレッドおよび SQL スレッドのスループットが向上します。
前提条件
この最適化を利用するには、インスタンスが以下の要件を満たす必要があります:
DB エンジンバージョン:インスタンスは、マイナーエンジンバージョンが 20260228 以降の ApsaraDB RDS for MySQL 8.0 を実行している必要があります。該当しない場合は、マイナーエンジンバージョンのアップグレードまたはDB エンジンバージョンのアップグレードを行ってください。
操作手順
この機能は、プライマリインスタンスまたは読み取り専用インスタンスのグローバルパラメーターを設定することで有効化できます:
まず、インスタンスページに移動します。上部のナビゲーションバーから、RDS インスタンスが配置されているリージョンを選択します。次に、対象の RDS インスタンスを見つけ、その ID をクリックします。
左側のナビゲーションウィンドウで、パラメーター設定をクリックします。
変更可能なパラメータータブで、
loose_replica_package_transaction_limit_sizeパラメーターを検索し、値を設定します。パラメーターの説明:値が 0 の場合、この機能は無効になります。値が 0 より大きい場合、binlog サイズがこの値より小さいトランザクションが最適化の対象となります。
有効な値の範囲:0 ~ 1 MB。
推奨値:1 MB。
OK をクリックし、続いて パラメーターの送信 をクリックします。表示されるダイアログボックスで、有効期間 を選択します。パラメーターの変更は即時反映され、インスタンスの再起動は不要です。
最適化結果
プライマリインスタンス上で、128 並行スレッド(80,000 トランザクション/秒、TPS)で sysbench write_only スクリプトを実行し、60 秒間のピーク書き込みワークロードを模擬しました。テストの結果は以下のとおりです:
最適化前:レプリカインスタンスのレプリケーションレイテンシが継続的に増加し、スループットは非常に低くなりました。
最適化後:レプリカインスタンスでレプリケーションレイテンシは発生せず、スループットはほぼ 2 倍になりました。
