ApsaraDB RDS for MySQL は、読み書き(読み書き分離)モードのデータベースプロキシに対して、結果整合性、セッション整合性、グローバル整合性という整合性レベルを提供しています。このトピックでは、整合性レベルと、整合性レベルのシナリオについて説明します。ビジネス要件に基づいて、ApsaraDB RDS for MySQL インスタンスの整合性レベルを指定できます。
背景情報
ApsaraDB RDS for MySQL は、バイナリログレプリケーションを使用して、プライマリ RDS インスタンスと読み取り専用 RDS インスタンス間でデータを同期します。プライマリ RDS インスタンスでトランザクションがコミットされると、生成された binlog イベントが読み取り専用 RDS インスタンスに送信されます。読み取り専用 RDS インスタンスは、binlog イベントを受信して適用し、プライマリ RDS インスタンスとデータを同期します。バイナリログレプリケーションにより、結果整合性が確保されます。ただし、高並列または高負荷のシナリオでは、読み取り専用 RDS インスタンスでレプリケーションの遅延が発生する可能性があります。その結果、読み取り専用 RDS インスタンスから読み取られたデータは、プライマリ RDS インスタンスのデータと異なります。
データの不整合を解決するために、ApsaraDB RDS for MySQL は、データベースプロキシに対して、結果整合性、セッション整合性、グローバル整合性という整合性レベルを提供しています。ビジネス要件に基づいて整合性レベルを選択できます。
整合性について
結果整合性(デフォルト)
説明
デフォルトでは、RDS インスタンスのデータベースプロキシは結果整合性を使用します。これにより、バイナリログレプリケーションが中断されない場合、読み取りリクエストを直接読み取り専用 RDS インスタンスに送信できます。バイナリログレプリケーションが使用されている場合、読み取り専用 RDS インスタンスのデータは最終的に整合性が保たれ、データベースプロキシの読み取りリクエストも最終的に整合性が保たれます。読み取り専用 RDS インスタンスの最大遅延を制限するために、RDS インスタンスのデータベースプロキシの遅延しきい値を指定できます。詳細については、「データベースプロキシエンドポイントへのアクセス ポリシーの設定」をご参照ください。読み取り専用 RDS インスタンスの遅延が遅延しきい値を超えると、読み取りリクエストは読み取り専用 RDS インスタンスに送信されなくなります。
レプリケーションの遅延により、異なる読み取り専用 RDS インスタンスでデータの不整合が発生する可能性があります。たとえば、次のクエリを連続して実行するセッションを開始した場合、クエリ結果は異なる場合があります。
SET AUTOCOMMIT = 1;INSERT INTO t1(id, price) VALUES (111, 96);UPDATE t1 SET price = 100 WHERE id = 111;SELECT price FROM t1;レプリケーションの遅延により、クエリ結果は異なる場合があります。
シナリオ
ワークロードは整合性に依存しません。読み取り専用 RDS インスタンスに転送される読み取りリクエストを増やすために、プライマリ RDS インスタンスの負荷を軽減したいと考えています。
セッション整合性
説明
結果整合性による不正確なクエリ結果を防ぐために、業務システムは整合性要件に基づいて読み取りリクエストを転送します。業務システムは、高い整合性を必要とする読み取りリクエストをプライマリ RDS インスタンスに転送し、低い整合性を必要とする読み取りリクエストを読み取り専用 RDS インスタンスに転送します。これにより、アプリケーションの複雑さが増し、プライマリ RDS インスタンスがより多くの読み取りリクエストを処理することになり、読み書き分離の効果に影響します。
この問題を解決するために、ApsaraDB RDS for MySQL はセッション整合性を提供しています。結果整合性と比較して、セッション整合性では、データベースプロキシがプライマリ RDS インスタンスで以前に更新されたデータの位置を記録できます。データの位置は、グローバルトランザクション ID(GTID)に基づいて決定されます。データベースプロキシは、必要な位置のデータが同期されている読み取り専用 RDS インスタンスにのみ読み取りリクエストを送信します。これにより、読み取りリクエストは現在のセッションで更新されたデータにクエリを実行して、セッション内のデータ整合性を確保できます。
シナリオ
セッション内に整合性の依存関係が存在します。この場合、セッション整合性を使用することをお勧めします。この整合性レベルはパフォーマンスにわずかな影響を与え、ほとんどのシナリオに適しています。
グローバル整合性
説明
一部のシナリオでは、セッション内に因果関係が存在し、異なるセッション間に依存関係が存在し、各セッションによって読み取られるデータが同一である必要があります。この場合、セッション整合性では要件を満たすことができません。ApsaraDB RDS for MySQL は、要件を満たすためにグローバル整合性を提供しています。セッション整合性と比較して、グローバル整合性では、データベースプロキシが各読み取り操作の前にプライマリ RDS インスタンス上のデータの位置を記録し、必要な位置のデータが同期されている読み取り専用 RDS インスタンスに読み取りリクエストを送信できます。これにより、読み取りリクエストはすべてのセッションで更新されたデータにクエリを実行して、グローバルデータ整合性を確保できます。データの位置は、GTID に基づいて決定されます。
シナリオ
セッション間に整合性の依存関係が存在し、より多くの読み取りリクエストとより少ない書き込みリクエストを処理する必要があります。
セッション整合性とグローバル整合性の実装方法の詳細については、「付録:セッション整合性とグローバル整合性の実装」をご参照ください。
整合性レベルの選択
整合性レベルが高いほど、読み書き分離のパフォーマンスが低下します。次の整合性レベルは降順にソートされています:グローバル整合性、セッション整合性、結果整合性。
ほとんどの場合、セッション整合性を使用することをお勧めします。この整合性レベルはパフォーマンスにわずかな影響を与え、ほとんどのシナリオに適しています。
異なるセッション間で高い整合性が必要で、少数の書き込み操作を処理する必要がある場合は、グローバル整合性を選択できます。
整合性レベル | 読み書き分離のパフォーマンスへの影響 | データ整合性の強度 | データ整合性の範囲 |
結果整合性 | なし | 低 | 最終結果の整合性 |
セッション整合性 | 中 | 中 | セッション内の整合性 |
グローバル整合性 | 高 | 高 | セッション間の整合性 |
整合性レベルの設定
前提条件
データベースプロキシ機能が有効になっており、データベースプロキシのバージョンが 2.25.1 以降であること。詳細については、「データベースプロキシ機能の有効化」および「データベースプロキシバージョンのリリースノート」をご参照ください。
データベースプロキシの属性が 読み書き(読み書き分離) であること。詳細については、「読み書き属性と読み取り重みの設定」をご参照ください。
RDS インスタンスが、次のマイナーエンジンバージョンの MySQL 5.7 または MySQL 8.0 を実行していること。
MySQL 5.7: 20210630 以降。
MySQL 8.0: 20210930 以降。
注意事項
セッション整合性またはグローバル整合性を使用する場合、データベースプロキシは必要な位置のデータの同期を待つ必要があります。これにより、サービスの遅延が増加する可能性があります。データベースプロキシの最大待機時間は、読み取り整合性タイムアウト期間と同じです。
読み取り専用 RDS インスタンスでレプリケーションの遅延が発生し、グローバル整合性が使用されている場合、より多くの読み取りリクエストがプライマリ RDS インスタンスに転送される可能性があります。これにより、プライマリ RDS インスタンスの負荷が増加し、サービスの遅延がさらに増加します。
デフォルトの整合性レベルは結果整合性です。
手順
[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、RDS インスタンスを見つけて、インスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、データベースプロキシ をクリックします。
[接続情報] セクションで、変更するデータベース プロキシ エンドポイントを探し、[アクション] 列の [構成の変更] をクリックします。
要件に基づいて整合性レベルを選択します。
説明結果整合性またはセッション整合性を選択した場合は、遅延しきい値を指定できます。デフォルトの遅延しきい値は 30 秒です。
セッション整合性またはグローバル整合性を選択した場合は、読み取り整合性タイムアウト期間 を指定できます。タイムアウト期間を指定しない場合、デフォルト値は 10 ミリ秒です。
付録:セッション整合性とグローバル整合性の実装実装
セッション整合性とグローバル整合性を実現するために、RDS インスタンスのデータベースプロキシは、各読み取り専用 RDS インスタンスの Executed_Gtid_Set の値を記録して、各読み取り専用 RDS インスタンスのデータの位置を決定します。 Executed_Gtid_Set は、コミットされたトランザクションのセットを指定します。データの位置は、GTID に基づいて決定されます。読み取りリクエストが開始される前に、データベースプロキシは読み取りリクエストに必要な GTID を指定し、GTID の位置に到達した読み取り専用 RDS インスタンスに読み取りリクエストを転送します。読み取り専用 RDS インスタンスが GTID 要件を満たしていない場合、データベースプロキシは、必要な GTID 位置のデータが読み取り専用 RDS インスタンスに同期されるまで読み取りリクエストを転送します。 ApsaraDB RDS for MySQL では、読み取り整合性タイムアウト期間 を指定して、最大待機時間を制限できます。タイムアウト期間内に GTID 要件を満たす読み取り専用 RDS インスタンスがない場合、リクエストはプライマリ RDS インスタンスに送信されます。
読み取りリクエストの GTID は、整合性レベルによって異なります。
セッション整合性:読み取りリクエストの GTID は、現在のセッションで最後に実行されたトランザクションに対応する GTID と同じです。
グローバル整合性:読み取りリクエストの GTID は、現在のクラスタで最後に実行されたトランザクションに対応する GTID と同じです。
関連操作
操作 | 説明 |
RDS インスタンスの詳細なデータベースプロキシ設定をクエリします。 | |
データベースプロキシエンドポイントに関する情報をクエリします。 | |
データベースプロキシエンドポイントの接続設定を変更します。 |