Slide 1

Slide 1 text

Resolving Tx Conflicts in CockroachDB \ ミジカイ / ~ Short Version ~

Slide 2

Slide 2 text

● Name: Takanori Yokoyama ○ @kota2and3kan (Twitter, GitHub) ● Job: Technical Support ● Like: DB ○ PostgreSQL, CockroachDB ● Dislike: Real Cockroach @kota2and3kan こたつ&&みかん Who am I.

Slide 3

Slide 3 text

※Note※ https://speakerdeck.com/kota2and3kan/how-commit-works-in-cockroachdb このスライドは、以下のスライドの続編的な位置づけです。 CockroachDB の概要等については以下のスライドをご参照ください。 \ ゾクヘン /

Slide 4

Slide 4 text

※Note※ ちょっと自信が無いとこもあります! 間違ってたらごめんさない!!! \ ユルシテ /

Slide 5

Slide 5 text

目次 ● Node 間の時刻差 (clock offset) について ● Timestamp (HLC) を使った Tx の動作 ● 宣伝 ● まとめ

Slide 6

Slide 6 text

Node 間の時刻差 (clock offset) について \ ジコクサ / Max clock offset enforcement

Slide 7

Slide 7 text

Max clock offset enforcement \ t1 / ● CockroachDB では MVCC や Tx の Isolation のために Timestamp (Hybrid Logical Clocks) を使っている。 \ t1 / \ t1 / \ t1 / \ t1 /

Slide 8

Slide 8 text

Max clock offset enforcement ● クラスタ内の各 Node では、常に (定期的に) “他の Node との時刻差 (clock offset)” を確認 している。 ● クラスタ内で許容される clock offset の最大値 (max offset) は、Node 起動時に指定するオプ ション “--max-offset” で指定できる (デフォルト 500ms)。 \ t1 + 100ms / \ t1 - 50ms / \ t1 + 150ms / \ t1 - 50ms / \ t1 + 50ms /

Slide 9

Slide 9 text

Max clock offset enforcement \ t1 / \ t1 - 200ms / \ t1 / \ t1 / ● クラスタ内の過半数の Node と比較し、max offset * 0.8 以上の時刻のずれを検知した Node は PANIC する。 ○ https://github.com/cockroachdb/cockroach/blob/v21.1.0-beta.2/pkg/rpc/c lock_offset.go#L242 ● このようにして、クラスタ内で発生する clock offset が一定の範囲に留まるようにしている。 ~ \ t1 - 400ms /

Slide 10

Slide 10 text

Max clock offset enforcement \ !? / \ !? / \ !? / \ t1 + 2000ms ! / ● ただし、何らかの理由で Node の時刻が突然 大きくずれてしまうと、依存関係のある Tx 間で single-key linearizability が保証できなくなる可 能性があるので注意が必要。 ● max offset の範囲内では single-key linearizability が保証される、らしい。 \ !? /

Slide 11

Slide 11 text

Timestamp (HLC) を使った Tx の動作 \ タイムスタンプ /

Slide 12

Slide 12 text

Timestamp (HLC) を使った Tx の動作 \ ケーヴィ / Tx と KV の Timestamp

Slide 13

Slide 13 text

k1 ~ k10 Tx と KV の Timestamp ● CockroachDB はいわゆるシェアー ドナッシング方式 (ただし、各データ の Replica は分散して保持) なの で、各 Node が担当するデータ (key) の範囲が決まっている。 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 14

Slide 14 text

Tx1 : Write (k45, v7) Write OK k15=v5, Write OK Tx1 : Read (k15), Write (k45, v7) k1 ~ k10 ● クエリを受け取った Gateway Node (Coordinator) は、当該 key を担当 する Node (Leaseholder) にクエリ をルーティングする。 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 Client Tx と KV の Timestamp Tx1 : Read (k15) k15=v5 ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 15

Slide 15 text

Tx1 : Write (k45, v7) Write OK k15=v5, Write OK Tx1 : Read (k15), Write (k45, v7) k1 ~ k10 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 Client Tx と KV の Timestamp Tx1 : Read (k15) k15=v5 ● この時、Tx1 の Timestamp は Gateway Node の Timestamp であ る t4 になる。 \ t4 / \ t5 / \ t3 / \ t1 / \ t2 / ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 16

Slide 16 text

Tx1 : Write (k45, v7) Write OK k15=v5, Write OK Tx1 : Read (k15), Write (k45, v7) k1 ~ k10 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 Client Tx と KV の Timestamp Tx1 : Read (k15) at t4 k15=v5 ● Read (k15) は t4 の時点での k15 の最新の値を Read する。 ● Write された KV (k45=v7) の Timestamp は、Tx1 の Timestamp である t4 になる。 \ t4 / \ t5 / \ t3 / \ t1 / \ t2 / ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 17

Slide 17 text

Tx1 : Write (k45, v7) Write OK k15=v5, Write OK Tx1 : Read (k15), Write (k45, v7) k1 ~ k10 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 Client Tx と KV の Timestamp Tx1 : Read (k15) at t4 k15=v5 \ t4 / \ k45=v7 at t4 / \ k45=v7 at t4 / \ k45=v7 at t4 / \ k45=v7 at t4 / ● つまり、他の Node から見ると “k45 の最新の値 v7 は時刻 t4 で書き込 まれた” というふうに見える。 ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 18

Slide 18 text

\ Read (k1) at t4 / \ Write (k1) at t5 / \ Read (k1) at t3 / \ オチツケ / \ Write (k1) at t2 / ● CockroachDB では全ての Node が Gateway Node (Coordinator) にな れる。 ● そのため、各 Node の Timestamp を基にした複数の Tx が同時に実行 される。 ● この時、Node 間に clock offset が あると、Timestamp を基にした Tx や KV の 順序が、実際の (Real Time の) Tx の実行順番と異なって しまう可能性がある。 k1 ~ k10 k31 ~ k40 k41 ~ k50 k11 ~ k20 k21 ~ k30 Tx と KV の Timestamp ※Replica は図から省略※ ※lease のみ図中に記載※

Slide 19

Slide 19 text

Timestamp (HLC) を使った Tx の動作 \ リード / Read の動作

Slide 20

Slide 20 text

Timestamp (HLC) を使った Tx の動作 \ ズレテナイ / Clock Offset が無い世界での Read の動作

Slide 21

Slide 21 text

Timestamp (HLC) を使った Read (Clock Offset 無し) Tx1 (key1 への Write) と Tx2 (key1 を Read) の 2つが、Tx1 -> Tx2 の順番で実行され る。Tx1 / Tx2 で Write / Read する key1 の Leaseholder は Node3。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) < ライト t0 t Tx1’s Gateway Node (Node1) < リード t0 t Tx2’s Gateway Node (Node2) < リースホルダー t0 t key1’s Leaseholder (Node3) x0

Slide 22

Slide 22 text

Tx1 を受け取った Node1 (Tx1 の Gateway Node) は、ローカルの Timestamp を基 に、Tx1 に t1 を設定する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < Tx1.ts = t1 t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 23

Slide 23 text

t1 Node1 は key1 の Leaseholder である Node3 に Write を送る。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < ヨロシク t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) < OK t0 t key1’s Leaseholder (Node3) x0 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 24

Slide 24 text

t1 Node3 (Leaseholder) は x1 を t1 で Write し、Node1 (Gateway Node) にレスポンスを 返す。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < サンクス t0 t Tx1’s Gateway Node (Node1) < ヒマダナ... t0 t Tx2’s Gateway Node (Node2) < カイタヨ t0 t key1’s Leaseholder (Node3) x0 x1 t1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 25

Slide 25 text

t1 Node1 (Gateway Node) は、Client に “Write OK” を返す。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < Write OK t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) x0 x1 t1 t0 t key1’s Leaseholder (Node3) Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 26

Slide 26 text

t1 Tx1 完了後に、Tx2 (Read) が実行される。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) < デバンカナ? t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 x1 t1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 27

Slide 27 text

t1 Tx2 を受け取った Node2 (Tx2 の Gateway Node) は、ローカルの Timestamp を基 に、Tx2 に t2 を設定する。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) < Tx2.ts = t2 t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 x1 t1 t2 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 28

Slide 28 text

t1 Node2 は key1 の Leaseholder である Node3 に Read を送る。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) < ヨロシク t0 t Tx2’s Gateway Node (Node2) < OK t0 t key1’s Leaseholder (Node3) x0 x1 t1 t2 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 29

Slide 29 text

t1 Node3 (Leaseholder) は、t2 の時点での key1 の最新の値である x1 を Node2 (Gateway Node) に返す。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) < ヒマデスワ... t0 t Tx1’s Gateway Node (Node1) < サンクス t0 t Tx2’s Gateway Node (Node2) < x1 ダヨ t0 t key1’s Leaseholder (Node3) x0 x1 t1 t2 t2 x1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 30

Slide 30 text

t1 Node2 (Gateway Node) は、Client に “key1 = x1” を返す。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) < key1 = x1 t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 x1 t1 t2 t2 t0 t Tx1’s Gateway Node (Node1) x1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 31

Slide 31 text

t1 Tx1 -> Tx2 の順番で Tx が実行された時、Node 間に Clock Offset がなければ、Tx2 は正しく Tx1 で Write された値 (最新の値) を Read できる。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) < ライトシタヨ t0 t Tx1’s Gateway Node (Node1) < リードシタヨ t0 t Tx2’s Gateway Node (Node2) < イロイロシタヨ t0 t key1’s Leaseholder (Node3) x0 x1 t1 t2 t2 x1 Timestamp (HLC) を使った Read (Clock Offset 無し)

Slide 32

Slide 32 text

Timestamp (HLC) を使った Tx の動作 \ ズレテル / Clock Offset に起因して発生する問題

Slide 33

Slide 33 text

Clock Offset に起因して発生する問題 先程と同じように Tx1 と Tx2 が、Tx1 -> Tx2 の順番で実行される。Tx1 / Tx2 で Write / Read する key1 の Leaseholder は Node3。また、Node1 の時刻がずれており、 Cluster 内に Clock Offset がある。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) < ズレテル t0 t Tx1’s Gateway Node (Node1) < リード t0 t Tx2’s Gateway Node (Node2) < リースホルダー t0 t key1’s Leaseholder (Node3) x0 Clock Offset

Slide 34

Slide 34 text

Tx1 を受け取った Node1 (Tx1 の Gateway Node) は、ローカルの Timestamp を基に (自分自信のずれた時刻を基に)、Tx1 に t3 (t2 < t3) を設定する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < Tx1.ts = t3 t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Clock Offset に起因して発生する問題

Slide 35

Slide 35 text

Node1 は key1 の Leaseholder である Node3 に Write を送る。この時、Tx1 の Timestamp t3 を基に Node3 で key1 の Write が実行される。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < ヨロシク t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) < OK t0 t key1’s Leaseholder (Node3) x0 t3 t3 Clock Offset Clock Offset に起因して発生する問題

Slide 36

Slide 36 text

x1 t3 Node3 (Leaseholder) は x1 を t3 で Write し、Node1 (Gateway Node) にレスポンスを 返す。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < サンクス t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) < カイタヨ t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Clock Offset に起因して発生する問題

Slide 37

Slide 37 text

x1 t3 Node1 (Gateway Node) は、Client に “Write OK” を返す。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) < Write OK t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Clock Offset に起因して発生する問題

Slide 38

Slide 38 text

x1 t3 Tx1 完了後に、Tx2 (Read) が実行される。この時、Tx2 には “Tx1 が Write した値 (key1 = x1) を Read すること” (一貫性があること) が期待されるが... Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Clock Offset に起因して発生する問題

Slide 39

Slide 39 text

x1 t3 Tx2 を受け取った Node2 (Tx2 の Gateway Node) は、ローカルの Timestamp を基 に、Tx2 に t2 (t2 < t3) を設定する。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 < Tx2.ts = t2 Clock Offset Clock Offset に起因して発生する問題

Slide 40

Slide 40 text

x1 t3 Node2 は key1 の Leaseholder である Node3 に Read を送る。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 < ヨロシク t2 < OK Clock Offset Clock Offset に起因して発生する問題

Slide 41

Slide 41 text

x1 t3 しかし、Node3 (Leaseholder) には t3 (t2 < t3) で Write された x1 と、t0 (t0 < t2) で Write された x0 がある。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 t2 < チョットマテ... Clock Offset Clock Offset に起因して発生する問題

Slide 42

Slide 42 text

x1 t3 Tx1 -> Tx2 の順番で実行されているため、Tx1 で Write された key1 = x1 を返すことが 期待されるが、単純に Timestamp の値を比較すると t0 < t2 < t3 であるため、t0 で Write された x0 (古い値) を返すことになる。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 t2 < ドッチダ...? Clock Offset Clock Offset に起因して発生する問題

Slide 43

Slide 43 text

x1 t3 Node3 (Leaseholder) には、Tx2 の Timestamp (t2) の情報と key1 = x1 (t3) の情報し か見えず、Tx の実行順序の情報 (Tx1 -> Tx2) を知り得ることはできないので、x0 (t0) と x1 (t3) のどちらの値を返すべきなのか判断できない。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 t2 < ナンモワカラン... < マダー? Clock Offset Clock Offset に起因して発生する問題

Slide 44

Slide 44 text

x1 t3 この時、x0 (t0) の値を返してしまうと、先に実行された Tx1 で Write された最新の値 x1 ではなく、古い値を Read してしまうことになり、Tx 間での一貫性がなくなってしまう。 Tx1: Write (key1, x1) Tx2: Read (key1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 t2 t2 < タブン x0… < ホントニ? Clock Offset Clock Offset に起因して発生する問題

Slide 45

Slide 45 text

Timestamp (HLC) を使った Tx の動作 \ フメイリョウ / Uncertainty Intervals

Slide 46

Slide 46 text

用語概要 (Uncertainty Intervals) ● Tx には Gateway Node の Timestamp が設定される。 ● この時、Tx には 2つの Timestamp が設定される。 ○ commit_ts ■ Gateway Node の Local HLC を基にした仮の Timestamp。 ○ commit_ts + max_offset ■ commit_ts に Cluster 内の Clock Offset を加算した Timestamp。 ● つまり、Tx は [commit_ts, commit_ts + max_offset] という “時刻の幅” の 情報を持っている。 ● この “時刻の幅” を “Uncertainty Interval” という。

Slide 47

Slide 47 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) 先程と同じように、時刻がずれた Node1 が Tx1 の Write (x1 を Write) を t3 で実行し、 Tx1 完了後に Tx2 (Read) を実行する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) < ライトシタヨ

Slide 48

Slide 48 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) Tx2 を受け取った Node2 (Tx2 の Gateway Node) は、ローカルの Timestamp を基 に、Tx2 に t2 (t2 < t3) と “t2 + max_offset” を設定する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset < Tx2.ts = [t2, t2 + max_offset]

Slide 49

Slide 49 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) Node2 は key1 の Leaseholder である Node3 に Read を送る。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 < ヨロシク < OK

Slide 50

Slide 50 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) この時 t2 + max_offset の Timestamp を基にした Uncertainty Interval が設定される。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 Uncertainty Interval

Slide 51

Slide 51 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) Node3 (Leaseholder) での処理で、Uncertainty Interval の範囲に収まる Timestamp t3 (t2 < t3 < t2 + max_offset) で Write された値 x1 が存在することを検知する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 < オヤ? Uncertainty Interval

Slide 52

Slide 52 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) この Uncertainty Interval の範囲に収まる Timestamp t3 で Write された値 x1 は、 Cluster 内の Clock Offset に起因して順序 (時刻) が逆転している可能性が有る “不確 実な値” であると判断される。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 < ズレテルカモ Uncertainty Interval

Slide 53

Slide 53 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) この “不確実な値” を検知した Node3 (Leaseholder) は、(t2 に対して確実に過去である t0 の値 x0 ではなく) その “不確実な値” である t3 の値 x1 を Node2 (Gateway Node) に返す。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 < タブン x1 (t3) < ナルホド?

Slide 54

Slide 54 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) Node2 (Gateway Node) は、Node3 (Leaseholder) から受け取ったレスポンス (x1) の Timestamp が “Tx2 の Timestamp より大きい (Tx2.ts < x1.ts) か否か” を確認する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 t2 + max_offset t2 < “Tx2.ts < x1.ts“ or Not? t3

Slide 55

Slide 55 text

t3 x1 t3 Timestamp を使った Read (Uncertainty Interval) Node2 (Gateway Node) は、Node3 (Leaseholder) から受け取ったレスポンス (x1) の Timestamp を確認し、”Tx2.ts = t2” < “x1.ts = t3” だった場合、Tx2 の Timestamp を t2 から t3 に変更 (push) する。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 + max_offset t2 < Tx2.ts = t3

Slide 56

Slide 56 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) Node2 (Gateway Node) は、Tx2 (Read) の結果として key1 = x1 を Client に返す。 Tx2 は “t3 で実行された” という扱いになる。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 + max_offset t2 < key1 = x1 t3

Slide 57

Slide 57 text

x1 t3 Timestamp を使った Read (Uncertainty Interval) 結果として、Tx1 -> Tx2 の順番で Tx が実行された時に、Node 間で Clock Offset が あった場合でも、Tx2 は Tx1 で Write された値 (最新の値) を Read できる (一貫性のあ る Read が実行される)。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 + max_offset t2 < ライトシタヨ < リードシタヨ < イロイロシタヨ t3

Slide 58

Slide 58 text

t3 x1 t3 Timestamp を使った Read (Uncertainty Interval) 言い換えると、Uncertainty Interval の上限である t2 + max_offset 以下の Timestamp T (T < t2 + max_offset) で Write された値は、Tx2 から見て “全て過去の値である” もの として扱われる。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 + max_offset t2 < ライトシタヨ < リードシタヨ < イロイロシタヨ

Slide 59

Slide 59 text

t3 x1 t3 Timestamp を使った Read (Uncertainty Interval) ただし、この処理 (単純な Timestamp の変更) のみではカバーしきれない問題が有るの で、実際には Read Refresh という処理も併せて実行される。 Tx1: Write (key1, x1) Tx’s Real Time Order (Clients) t0 t Tx1’s Gateway Node (Node1) t0 t Tx2’s Gateway Node (Node2) t0 t key1’s Leaseholder (Node3) x0 t3 Clock Offset Tx2: Read (key1) t2 + max_offset t2 < ホカニモ < ショリガ < アルヨ

Slide 60

Slide 60 text

宣伝 \ センデン /

Slide 61

Slide 61 text

こちら、前回の LT で得た「LT で分散 Tx を語るの is 無理」という知 見を活かして「LT には収まらないだろうなぁと思いながら作成した 172 ページあるスライド」です。ご査収ください。 Resolving Tx Conflicts in CockroachDB https://speakerdeck.com/kota2and3kan/resolving-tx-conflicts-in-cockroachdb ● Tx の Timestamp を未来の値に変更 (push) した際に実行される Read Refresh や、未来の Timestamp t1 で Read された key を過去の Timestamp t0 (t0 < t1) で 上書きしてしまうことを防ぐための Timestamp Cache 等についても解説しています。 宣伝

Slide 62

Slide 62 text

まとめ \ マトメ /

Slide 63

Slide 63 text

まとめ LT で分散 Tx を語るの is 無理! \ ムリ / (37日ぶり 2回目)

Slide 64

Slide 64 text

Thank you!