TDSQL-C for MySQLの自動読み書き分離機能は、TDSQL-C for MySQLとアプリケーション間の接続を確立し、送信された各SQLを解析します。もしCREATE、ALTER、DROP、RENAMEなどのステートメントであれば、直接読み書きインスタンスに送信します。もしトランザクション外の読み取り(SELECT)ステートメントであれば、読み取り専用インスタンスに送信します。これにより、読み書き分離を実現します。しかし、データベースの負荷が高い場合、例えば大量データの挿入時には、遅延が非常に深刻になり、その結果、読み取り専用ノードから最新データを読み取ることができません。
TDSQL-C for MySQLの読み書きインスタンスでデータが更新されると、関連する更新内容は読み取り専用インスタンスに適用されます。データ同期の遅延時間はライト負荷に依存します。TDSQL-C for MySQLは、異なる整合性レベルを提供することで、ビジネスアクセスにおけるデータベースのデータ整合性要件を保証します。
TDSQL-C for MySQLは以下の三つの整合性レベルを提供し、さまざまなシナリオにおける整合性要件を満たします:
結果整合性
セッション整合性
グローバル整合性
結果整合性
機能概要
TDSQL-C for MySQLのデータベースプロキシは自動読み書き分離機能を実装しており、自動読み書き分離シナリオではデフォルトでデータの結果整合性を提供します。これにより、読み取り専用インスタンスが変更済みの書き込みデータを読み取る際、最終的に更新されたデータを取得できることを保証します。ただし、即時取得を完全に保証するものではありません。更新されたデータのプライマリ/セカンダリレプリケーション遅延により、異なるノードからクエリした結果が異なる場合があります。
適用シナリオ
読み書きインスタンスの負荷を軽減する必要があり、できるだけ多くの読み取りリクエストを読み取り専用インスタンスにルーティングしたい場合で、整合性の要件がそれほど高くないシナリオでは、結果整合性を選択できます。
セッション整合性
機能概要
整合性の要求が高いシナリオでは、結果整合性ではクエリ結果に差異が生じるため、通常はビジネスロジックの分割が必要となります。整合性要求の高いリクエストは直接読み書きインスタンスに送信し、結果整合性が許容できるリクエストは読み書き分離を通じて読み取り専用インスタンスに送信します。この方法では、読み書きインスタンスの負荷が増加して読み書き分離の効果が低下する一方、アプリケーション開発の負担も増加します。
上記の問題を解決するため、TDSQL-C for MySQLはセッション整合性を提供します。セッション整合性により、同一セッション内において、読み取りリクエスト実行前に更新済みのデータを確実にクエリできることを保証し、データの単調性を確保します。
TDSQL-C for MySQLのリンク中間層で読み書き分離を行う際、中間層は各ノードが適用済みのログ位置、すなわちログシーケンス番号(Log Sequence Number、略称LSN)を追跡します。同時に、データが更新されるたびにTDSQL-C for MySQLは当該更新の位置をSession LSNとして記録します。新規リクエストが到着すると、TDSQL-C for MySQLはSession LSNと現在の各インスタンスのLSNを比較し、LSNがSession LSN以上のインスタンスにのみリクエストを送信することで、セッション整合性を保証します。
上記のシナリオでは、更新が完了した後、クライアントに結果を返す際にレプリケーションも同時に進行しており、次の読み取りリクエストが到着する時点では、読み書きインスタンスと読み取り専用インスタンス間のデータレプリケーションがすでに完了している可能性があります。また、ほとんどのアプリケーションシナリオでは読み取りが多く書き込みが少ないため、このメカニズムによりセッション整合性が保証されます。
適用シナリオ
整合性の要求が高いシナリオに適用されます。TDSQL-C for MySQLの整合性レベルが高いほど、マスターインスタンスへの負荷が増大し、クラスタのパフォーマンスも低下します。セッション整合性の使用を推奨します。このレベルはパフォーマンスへの影響が非常に小さく、ほとんどのアプリケーションシナリオの要件を満たすことができます。
注意:
セッション整合性を有効にした後、読み書きインスタンスと読み取り専用インスタンス間のレプリケーション遅延が大きい場合、各読み取りノードのLSNがすべてSession LSNより小さくなると、SELECTリクエストが読み書きインスタンスに送信され、読み書きインスタンスの負荷が増加し、クラスタ全体の読み書きパフォーマンスが低下する可能性があります。
グローバル整合性
機能概要
一部のシナリオでは整合性の要求が極めて高く、セッション内部に論理的な因果依存関係が存在するだけでなく、セッション間にも依存関係が存在します。例えば、コネクションプールを使用するシナリオでは、同一スレッドのリクエストが異なる接続を介して送信される可能性があります。データベースにとってこれらのリクエストは異なるセッションに属しますが、ビジネスロジック上これらのリクエストには前後依存関係があるため、この場合セッション整合性ではクエリ結果の一貫性を保証できません。この問題を解決するため、TDSQL-C for MySQLはグローバル整合性を提供します。
適用シナリオ
整合性の要求が極めて高いシナリオに適用されます。マスター/スレーブ間の遅延が大きい場合、グローバル整合性を使用すると、より多くのリクエストが読み書きインスタンスにルーティングされる可能性があり、読み書きインスタンスの負荷増大を招き、ビジネス遅延も増加する可能性があります。したがって、読み取りが多く書き込みが少ないシナリオではグローバル整合性を選択することをお勧めします。
整合性レベルの設定
説明:
説明:
整合性レベルの設定には、まずデータベースプロキシの読み書き属性を「読み書き分離」に設定する必要があります。データベースプロキシの読み書き属性設定の手順でセッション整合性レベルを設定できます。整合性レベルを変更する場合は、以下の手順を参照してください。 一貫性レベルの変更は新規接続に対してのみ有効です。パラメータを即時適用するために接続を直ちにリセットする必要がある場合、再負荷分散機能の実行またはインスタンスの再起動が可能です。
2. クラスタ管理 > クラスタ詳細のトポロジ図で、マウスをデータベースプロキシセクションに移動させ、詳細をクリックするとデータベースプロキシ管理ページに遷移します。または、クラスタ管理ページで直接データベースプロキシタブを選択してデータベースプロキシ管理ページに入ります。
3. 接続アドレスの下で対象のアクセスアドレスを見つけ、操作列の設定調整をクリックします。
4. 設定ウィンドウで、必要な整合性レベルを選択し、確定をクリックします。
説明:
注記:
ご注意:現在、同一クラウドアカウント配下の複数のデータベースプロキシインスタンスに対して個別のタイムアウト時間を設定することはできません。複数のデータベースプロキシインスタンスのタイムアウト時間は統一設定が適用され、単一のデータベースプロキシインスタンスでタイムアウト時間を変更すると、すべてのデータベースプロキシインスタンスのタイムアウト時間が一括変更されます。
関連するAPI
|
| 本インターフェース(ModifyProxyRwSplit)はデータベースプロキシの読み書き分離を設定するために使用されます。 |