タイムスタンプの範囲

はじめに

読み取り専用トランザクションまたは単一の読み取り呼び出しで Spanner のデータを読み取る場合は、タイムスタンプ バウンドを設定できます。これにより、データを読み取る際のタイムスタンプの選択方法を Spanner に対して指示できます。

タイムスタンプ バインドを設定するのはなぜでしょうか。データベースが地理的に分散している場合(つまり、マルチリージョン インスタンス構成を使用して Spanner インスタンスを作成した場合)、アプリケーションがデータの読み取り時にある程度のステイルネスを許容できれば、強力な読み取りではなくステイル読み取りを実行することで、レイテンシのメリットを得ることができます(これらの読み取りタイプの詳細については、読み取りをご覧ください)。

タイムスタンプ バウンドのタイプ

タイムスタンプ バウンドのタイプは次のとおりです。

  • 強力(デフォルト): 最新のデータを読み取ります。
  • バウンド ステイルネス: バウンドよりも古くないデータのバージョンを読み取ります。
  • 正確なステイルネス: 未経過の時間のタイムスタンプを指定できますが、タイムスタンプと一致するバージョンのデータ(過去の特定の時点のデータ)を読み取ります。(将来のタイムスタンプを指定すると、Spanner はその時間が来るまで読み取りを行いません。)

注:

  • 読み取り / 書き込みトランザクションでは、これらのタイムスタンプ バウンドを使用した読み取りを使用しませんが、使用すると、同時実行の読み取り / 書き込みトランザクションの commit をブロックできます。バウンド ステイルネス読み取りは、ブロックを回避するためにタイムスタンプを取得しますが、引き続きブロックされる可能性があります。

  • ステイル読み取り(バウンドまたは正確なステイルネス)は、ステイルネスの期間が長いほどパフォーマンスが向上します。ステイルネスの最小値は 10 秒に設定すると、効果があります。

  • Spanner は、データベースの earliest_version_time を追跡します。これは、古いバージョンのデータを読み取ることができる最も古い時間を示します。最も古いバージョンよりも前のタイムスタンプのデータを読み取ることはできません。

以下では、Spanner タイムスタンプ バウンドのタイプを詳しく説明します。

Spanner では、バウンドタイプに強力読み取りを設定できます。強力な読み込みでは、読み取りが開始される前に実行されたすべてのトランザクションの結果確認を保証します。また、1 回の読み込みで作成されたすべての行はお互いに一致します。読み取りの一部でトランザクションが確認されると、読み取るすべての部分でそのトランザクションが確認されます。

強力な読み込みは繰り返せません。同時に書き込みが行われた場合、2 つの連続する強力な読み取り専用トランザクションで矛盾した結果が返されることがあります。読み込み全体で一貫性を保たなければならない場合、その読み込みを同じトランザクション内か正確な読み取りスタンプで実行する必要があります。

バウンド ステイルネス

Spanner では、バウンドタイプにバウンド ステイルネスを設定できます。バウンド ステイルネス モードで Spanner は、ユーザーが提供したステイルネス バウンドを対象とする読み取りタイムスタンプを取得できます。Spanner は、ブロックすることなく最も近くにある利用可能なレプリカで読み取りを許可する、ステイルネス バウンド内の一番新しいタイムスタンプを取得します。

作成されたすべての行はお互いに一致します。読み取りの一部でトランザクションが確認されると、読み取るすべての部分でそのトランザクションが確認されます。バウンド ステイル読み取りは繰り返せません。バウンド ステイル読み取りで同じステイルネス バウンドを使用していたとしても、2 つのステイル読み取りを異なるタイムスタンプで実行できます。この場合、矛盾した結果になります。

バウンド ステイルネス読み取りはそれに相当する正確なステイルネス読み取りより少し遅くなります。

正確なステイルネス

Spanner では、バウンドタイプに正確なステイルネスを設定できます。ユーザーが指定したタイムスタンプで、このタイムスタンプのバウンドを読み取ります。読み取り用タイムスタンプで、必ずグローバル トランザクションの履歴の一貫性のあるプレフィックスを見られるようになります。読み取り用タイムスタンプより少ない、あるいは同等の commit したタイムスタンプを用いてすべてのトランザクションが行う修正を観測します。また、より大きい commit したタイムスタンプを用いてトランザクションが行う修正は一切観測しません。読み取り用タイムスタンプより少ない、または同等の commit されたタイムスタンプが割り当てられる可能性があるすべてのコンフリクトするトランザクションが終了するまで、ブロックします。

タイムスタンプは完全な Cloud Spanner コミット タイムスタンプ、または現在の時間に関連するステイルネスとして表されます。

このモードでは、タイムスタンプを取得するための「ネゴシエーション フェーズ」を必要としません。そのため、このモードは同等のバウンド ステイル読み取り同時モードよりも少し速く実行されます。それに対し、バウンド ステイル読み取りは通常、より新しい結果を返します。

タイムスタンプ ステイルネスの最大値

Spanner はストレージ スペースをリクレームするため、バックグランドにある削除されたデータや上書きされたデータを継続的にガベージ コレクションします。この処理はバージョン GC として知られています。バージョン GC は、データベースの version_retention_period(デフォルトでは 1 時間、最大で 1 週間まで設定可能)を過ぎたらバージョンを再利用します。この制限は、実行されている間に古くなったタイムスタンプの進行中の読み取り / SQL クエリにも適用されます。タイムスタンプが古すぎる読み取りや SQL クエリは失敗し、FAILED_PRECONDITION エラーとなります。ただ、パーティション トークンを使用したパーティションの読み取り / クエリだけは例外です。これにより、セッションがアクティブな間は期限切れのデータのガベージ コレクションを防ぐことができます。