タイムスタンプの範囲

はじめに

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

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

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

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

  • 強力(デフォルト): 最新のデータを読み取ります。
  • バウンド ステイルネス: バウンドよりも古くないデータのバージョンを読み取ります。
  • 正確なステイルネス: 正確なタイムスタンプ(例えば、過去の特定の時点)におけるデータのバージョンを読み取ります。ただし、まだ経過していない時間のタイムスタンプを指定することもできます(未来のタイムスタンプを指定した場合、Spanner はそのタイムスタンプを待ってから読み取り処理を実行します)。

注:

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

  • ステイル読み取り(バウンドまたは正確なステイルネス タイプを使用)は、ステイルネス間隔が最も長い場合にパフォーマンス上のメリットが最大になります。メリットを得るには、最低でも 10 秒のステイルネスを使用してください。

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

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

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

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

バウンド ステイルネス

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

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

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

正確なステイルネス

Spanner には、正確なステイルネスのためのバウンドタイプが用意されています。これらのタイムスタンプ バウンドは、ユーザーが指定したタイムスタンプで読み取りを実行します。タイムスタンプでの読み取りでは、グローバル トランザクション履歴の一貫したプレフィックスが参照されることが保証されます。つまり、読み取りタイムスタンプ以下の commit タイムスタンプを持つすべてのトランザクションによって行われた変更を監視し、読み取りタイムスタンプより大きい commit タイムスタンプを持つトランザクションによって行われた変更は一切監視しません。読み取り用タイムスタンプより少ない、または同等の commit されたタイムスタンプが割り当てられる可能性があるすべての競合するトランザクションが終了するまで、ブロックします。

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

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

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

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