-
Googleが作った、大規模データに対するインクリメンタル処理のためのシステム
-
Googleの検索インデックス構築で使われている
-
TiKVの分散トランザクションでもアイデアが使われている
-
Percolatorでは、Snapshot isolationを保証
仕組み
- カラムCは、以下のカラム群に細分化され、BigTableに載る
c:lock
,c:write
,c:data
,c:notify
,c:ack_0
- こんな感じで書かれる
- example, ,,, ,,,, ,,,, ,,,
- タイムスタンプ値はTimestamp Oracleから取る
- c:notifyは変更されたセルがdirtyであることを示す
- ユーザーはPercolatorにオブザーバを追加することができ、オブザーバが処理をしたらその時のタイムスタンプをc:ack_0に書く
- オブザーバのread onceを保証するためという感じかな(kekeho)
write
- 2PCで書く
- prewrite
- commit
- TSOから
commit_ts
を取得 commit_ts
、c:write
に書き込む。Primary lockを取る。すべてのSecondary lockに対してもこれを繰り返す- PrimaryのCommitが完了すればトランザクションはおしまい。セカンダリロックのコミットが失敗しても問題ない
- なんで? というか、いまいちprimary lock, secondary lockがわかっていない(kekeho)
- PrimaryのCommitが完了すればトランザクションはおしまい。セカンダリロックのコミットが失敗しても問題ない
- TSOから
- read
- TSOからタイムスタンプ
ts
を取得 - 読み込もうとしているrowが、の範囲でロックされていないかチェック
- ロックがないか、tsより大きなタイムスタンプでロックされていればOK
c:write
のcommit_ts
がの範囲の中で最新のレコードを取得する- そこで指している
start_ts
のc:data
を読む
- そこで指している
- lock-free readとhistorical readを提供
- TSOからタイムスタンプ
参考