古い読み取りの使用シナリオ

このドキュメントでは、StaleReadの使用シナリオについて説明します。 Stale Readは、TiDBがTiDBに保存されているデータの履歴バージョンを読み取るために適用するメカニズムです。このメカニズムを使用すると、特定の時点または指定された時間範囲内の対応する履歴データを読み取ることができるため、ストレージノード間のデータレプリケーションによってもたらされる遅延を節約できます。

Steal Readを使用している場合、TiDBはデータ読み取り用のレプリカをランダムに選択します。これは、すべてのレプリカがデータ読み取りに使用できることを意味します。アプリケーションが非リアルタイムデータの読み取りに耐えられない場合は、StaleReadを使用しないでください。そうしないと、レプリカから読み取られたデータがTiDBに書き込まれた最新のデータではない可能性があります。

シナリオ例

  • シナリオ1:トランザクションに読み取り操作のみが含まれ、データの古さをある程度許容する場合は、古くなった読み取りを使用して履歴データを取得できます。 TiDBは、Stale Readを使用して、リアルタイムのパフォーマンスを犠牲にして任意のレプリカにクエリ要求を送信するため、クエリ実行のスループットが向上します。特に、小さなテーブルがクエリされる一部のシナリオでは、強一貫性のある読み取りが使用されると、リーダーが特定のストレージノードに集中し、クエリの負荷がそのノードにも集中する可能性があります。したがって、そのノードがクエリ全体のボトルネックになる可能性があります。ただし、Stale Readを使用すると、全体的なクエリスループットが向上し、クエリのパフォーマンスが大幅に向上します。

  • シナリオ2:地理分散展開の一部のシナリオでは、強一貫性のあるフォロワー読み取りが使用されている場合、フォロワーから読み取られたデータがリーダーに格納されているデータと一致していることを確認するために、TiDBは検証のためにさまざまなデータセンターからReadindexを要求します。クエリプロセス全体のアクセスレイテンシが増加します。 Stale Readを使用すると、TiDBは現在のデータセンターのレプリカにアクセスして、リアルタイムパフォーマンスを犠牲にして対応するデータを読み取ります。これにより、クロスセンター接続によってもたらされるネットワーク遅延が回避され、クエリ全体のアクセス遅延が減少します。詳細については、 3つのデータセンター展開でのローカル読み取りを参照してください。

使用法

TiDBは、ステートメントレベルおよびセッションレベルでStaleReadを実行する方法を次のように提供します。

  • ステートメントレベル
    • 正確な時点の指定(推奨):分離レベルに違反することなく、特定の時点からグローバルに整合性のあるデータを読み取るためにTiDBが必要な場合は、クエリステートメントでその時点の対応するタイムスタンプを指定できます。詳細な使用法については、 AS OF TIMESTAMPを参照してください。
    • 時間範囲の指定:分離レベルに違反することなく、時間範囲内で可能な限り新しいデータを読み取るためにTiDBが必要な場合は、クエリステートメントで時間範囲を指定できます。指定された時間範囲内で、TiDBは対応するデータを読み取るために適切なタイムスタンプを選択します。 「適切」とは、このタイムスタンプより前に開始され、アクセスされたレプリカでコミットされていないトランザクションがないことを意味します。つまり、TiDBはアクセスされたレプリカで読み取り操作を実行でき、読み取り操作はブロックされません。詳細な使用法については、 AS OF TIMESTAMP条項の時点TIDB_BOUNDED_STALENESS関数の紹介を参照してください。
  • セッションレベル
    • 時間範囲の指定:セッションで、TiDBが分離レベルに違反することなく、後続のクエリの時間範囲内で可能な限り新しいデータを読み取る必要がある場合は、 tidb_read_stalenessシステム変数を設定することで時間範囲を指定できます。詳細な使用法については、 tidb_read_stalenessを参照してください。

このページは役に立ちましたか?