分散システム読書会 06章-同期(前編)
- 3. ざっくり言えば
「プロセス間の協調動作のための手段・手順」
例えば
◦ 複数のプロセスがプリンタなどの共有リソースに同時にアク
セスせず、互いに排他的にアクセスすることに協力すること
◦ プロセス 𝑃 からのメッセージ 𝑚1 がプロセス 𝑄 からのメッ
セージ 𝑚2 よりも前または後である、といったイベントの順序
に関して複数のプロセスが同意すること
ただし
◦ 分散システムでの同期は非分散に比べて難しい
- 13. 答え:
ちゃんとグレゴリオ暦への改暦が実装されています
◦ プロテスタントの国のシステムなので1582年でなく1752年
◦ 昔とあるシステムのカレンダにこっそり実装しましたw
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
- 17. 受信機で測定される遅れ Δ𝑖 は、実際の信号の遅れと受信機のクロックの偏
差 Δ 𝑟 からなると言える
Δ𝑖 = 𝑇𝑛𝑜𝑤 − 𝑇𝑖 + Δ 𝑟
信号は光の速度 𝑐 で伝搬するので、受信機と衛星の距離 𝑑𝑖 は明らかに
𝑐Δ𝑖 である
𝑑𝑖 = 𝑐(𝑇𝑛𝑜𝑤 − 𝑇𝑖)
受信機で測定された距離は 𝑑𝑖 + 𝑐Δ 𝑟 となる
座標(𝑥𝑖, 𝑦𝑖, 𝑧𝑖)にある衛星𝑖への距離は次式で計算される
𝑑𝑖 = (𝑥𝑖 − 𝑥 𝑟)2+(𝑦𝑖 − 𝑦𝑟)2+(𝑧𝑖 − 𝑧 𝑟)2
4つの衛星がある場合、4つの未知変数に対して4つの方程式が得られ、受
信機の位置(𝑥 𝑟, 𝑦𝑟, 𝑧 𝑟)だけでなく Δ 𝑟 も求めることができる
実際には衛星の位置精度や地球が完全な球体でないことから、複雑な補正
計算をさらに行なっている
- 18. すべてのマシンの時間をあわせることが目標
各アルゴリズムは同じシステムモデルに基づいている
◦ 各マシンは1秒に𝐻回の割り込みを発生するタイマを持ち、過
去のある時点以来のティック数を追跡管理している
◦ あるUTC時間𝑡におけるマシン𝑝のクロック値を 𝐶 𝑝(𝑡) とする
完全な世界ではすべてのpとtに対して 𝐶 𝑝 𝑡 = 𝑡 である
言い換えると 𝐶 𝑝
′
𝑡 = 𝑑𝐶 𝑑𝑡 は理想的には1である
𝐶 𝑝
′ 𝑡 は時間 𝑡 における 𝑝 のクロック周波数と呼ばれる
◦ クロックスキューは 𝐶 𝑝
′ 𝑡 − 1 で定義される
◦ ある時間 𝑡 との偏差は 𝐶 𝑝 𝑡 − 𝑡 である
- 19. 実際のタイマは誤差がある
◦ 𝐻 = 60 のタイマは理論的には1時間に216,000のティック
を発生するが、一般的なタイマの相対誤差は10−5であり、1
時間に215,998から216,002の範囲でティックをとり得るこ
とがある
◦ タイマが仕様の範囲内で動作していることは以下で示される。
定数𝜌は製造者が規定する最大ドリフト率と言う
1 − 𝜌 ≤
𝑑𝐶
𝑑𝑡
≤ 1 + 𝜌
◦ 最大ドリフト率とはクロックスキューがどの程度許容されるか
を規定している
- 23. NTPの場合
◦ NTPではこのプロトコルはサーバ間で一対で行われる
◦ 偏差 𝜃 に加え、遅延時間 𝛿 が計算される
𝛿 =
𝑇2 − 𝑇1 + 𝑇4 − 𝑇3
2
◦ 8つの (𝜃, 𝛿) の値の対がバッファされ、2つのサーバ間の遅延時
間 𝛿 に対して誤差を最小にする最善の推定値が計算され、偏差
の最も信頼できる推定値としての 𝜃 が得られる... (?)
◦ NTPはサーバを階層(stratum)にわける。原子時計のような標準
時計(reference clock)を持つサーバは階層-1サーバ(stratum-
1 server)と呼ばれる。AがBに通信するとき、Bの階層レベルよりA
の階層レベルが高いときのみ時刻を調整する
- 28. RBSでの時間同期
◦ あるノードが基準メッセージをブロードキャストすると、各ノード 𝑝 は
メッセージ 𝑚 を受信した時刻 𝑇𝑝,𝑚 (𝑝 のローカルクロックから読ん
だ値)を記録する
◦ 2つのノード 𝑝 と 𝑞 は、その相互の相対的偏差を推定するために
互いの受信時刻を交換して、次式で求める。
𝑂𝑓𝑓𝑠𝑒𝑡 𝑝, 𝑞 =
(𝑇𝑝,𝑘 − 𝑇𝑞,𝑘)𝑀
𝑘=1
𝑀
◦ Mは送信されて基準メッセージの総数である
◦ しかし、互いのクロックは独立して離れていくので、次のような回帰
直線を用いて補償する
𝑂𝑓𝑓𝑠𝑒𝑡 𝑝, 𝑞 𝑡 = 𝛼𝑡 + 𝛽
◦ 𝛼 と 𝛽 は (𝑇𝑝,𝑘, 𝑇𝑞,𝑘) の組から計算される
- 29. 𝒌 𝒕 𝑻 𝒑,𝒌 𝑻 𝒒,𝒌 𝑻 𝒑,𝒌 − 𝑻 𝒒,𝒌 𝑶𝒇𝒇𝒔𝒆𝒕 𝒑, 𝒒
1 1050 10521 10431 90 90.00
2 1051 10534 10444 90 90.00
3 1052 10548 10456 92 90.67
4 1053 10561 10469 92 91.00
5 1054 10575 10481 94 91.60
6 1055 10589 10494 95 92.17
7 1056 10602 10506 96 92.71
8 1057 10616 10518 98 93.38
𝛼 = 1.1548
𝛽 = −1123.2
y = 1.1548x - 1123.2
88
90
92
94
96
98
100
1050 1052 1054 1056
𝑻 𝒑,𝒌 − 𝑻 𝒒,𝒌
𝒑 と 𝒒 のクロックが独立してい
ると平均で求める相対的偏差
は誤差が徐々に大きくなる
回帰直線で補償する
- 30. クロック同期とは
◦ みんなの時計をきちんと合わせたい
そもそも時間はどのように決められていたか
◦ 旧来、時間は地球と太陽の関係によって決まっていた
天体の動きは一定でなく、一日の長さも一定にならない
◦ 現代では、原子時計に基づいて時間が決まる
一秒の長さは一定になったが、一日の長さに合わない (TAI)
うるう秒の挿入・削除により微調整される (UTC)
みんなの時計を合わせよう
◦ みんなが原子時計を持つことはできないけど、GPSやネットワーク
タイムプロトコルを利用して、合わせられるようになった
◦ 時計の合わせ方には、環境に応じたいろんな方法がある
- 33. 事前発生(happens-before)
◦ 式 𝑎 → 𝑏 は、「𝑎 は 𝑏 以前に発生する」と読み、イベント 𝑎 がまず
発生し、次にイベント 𝑏 が発生する、ということにすべてのプロセス
が同意していることを表す
𝑎 および 𝑏 が同じプロセスにおけるイベントであり、𝑎 が 𝑏 以前に発生
するならば、𝑎 → 𝑏 は真である
𝑎 が1つのプロセスによって送信されたあるメッセージのイベントであり、
𝑏 が別のプロセスによって受信されたそのメッセージのイベントであるな
らば、𝑎 → 𝑏 はまた真である
◦ 事前発生関係は遷移関係である
𝑎 → 𝑏 かつ 𝑏 → 𝑐 ならば、 𝑎 → 𝑐 である
◦ 並行イベント
2つのイベント 𝑥 および 𝑦 が、メッセージを交換しない異なるプロセスで
発生するならば、 𝑥 → 𝑦 は真ではない、 y → 𝑥 も真ではない
- 34. クロック時間
◦ 論理クロックで必要なのは、イベント 𝑎 に対して、すべてのプ
ロセスが合意する時間値 𝐶(𝑎) を測定する方法である
◦ 𝑎 → 𝑏 ならば、 𝐶(𝑎) < 𝐶(𝑏) でなければならない
◦ クロック時間 𝐶 は常に前向き(増加方向)でなければならな
い。すなわち時間の訂正は正の値の加算に限る
◦ 事前発生の関係はクロック時間の関係に換言できる
𝑎 および 𝑏 が同じプロセスにおけるイベントであり、𝑎 が 𝑏 以前
に発生するならば、𝐶(𝑎) < 𝐶(𝑏) である
𝑎 が1つのプロセスによって送信されたあるメッセージのイベント
であり、 𝑏 が別のプロセスによって受信されたそのメッセージの
イベントであるならば、𝐶(𝑎) < 𝐶(𝑏) であることを誰もが合意でき
るように割り当てなければならない。
- 37. 各プロセス 𝑃𝑖 はローカルカウンタ 𝐶𝑖 を保有して以下
のステップでカウンタを更新する
◦ イベント(メッセージの送信、配信、または内部イベント)を実
行する前に、 𝑃𝑖 は 𝐶𝑖 ← 𝐶𝑖 + 1 を実行する
◦ プロセス 𝑃𝑖 が 𝑃𝑗 にメッセージ 𝑚 を送信するとき、先のス
テップの実行を完了した後に 𝑃𝑖 は 𝑚 のタイムスタンプ
𝑡𝑠(𝑚) を 𝐶𝑖 に等しくセットする
◦ メッセージ 𝑚 を受信すると、プロセス 𝑃𝑗 は自己のローカルク
ロックカウンタを 𝐶𝑗 ← max{ 𝐶𝑗, 𝑡𝑠 𝑚 } に調整する。その後、
第1のステップを実行しアプリケーションにメッセージを渡す
2つのイベントが完全に同じ時刻では発生しないようにする必要がある
場合は、時間にプロセス番号を小数点で付加するなどで対処する
例)時間40でプロセス𝑃𝑖 でのイベントのタイムスタンプは40. 𝑖 とする
- 40. 𝑃1 𝑃2 𝑃3
0 0 0
𝑚1: 1.1
1
𝑚2: 1.2
1
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚1 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
受信メッセージと各プロセ
スからの確認通知の状態
を持つ待ち行列。一番下
の行が先頭を示す
- 41. 𝑃1 𝑃2 𝑃3
0 0 0
𝑚1: 1.1
1
𝑚2: 1.2
1
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
(𝑚1) 𝑜𝑘
𝑎𝑐𝑘 𝑚2,𝑝1
2
2
𝑎𝑐𝑘 𝑚1,𝑝2
1
2
𝑎𝑐𝑘 𝑚2,𝑝3
2
- 42. 𝑃1 𝑃2 𝑃3𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑎𝑐𝑘 𝑚2,𝑝1 𝑎𝑐𝑘 𝑚1,𝑝2
𝑎𝑐𝑘 𝑚2,𝑝3
𝑚1
𝑎𝑐𝑘 𝑚1,𝑝3
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
待ち行列の先頭の
メッセージ 𝒎 𝟏 が、
すべてのプロセス
によって確認された
のでアプリケーショ
ンに配信できる
すべてのプロセスがメッ
セージ 𝒎 𝟐 を確認した
が、待ち行列の先頭では
ないので配信できない
- 43. 𝑃1 𝑃2 𝑃3 𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑎𝑐𝑘 𝑚2,𝑝1
𝑎𝑐𝑘 𝑚2,𝑝3
𝑎𝑐𝑘 𝑚1,𝑝3
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑅𝑥𝑄 𝑎1 𝑎2 𝑎3
𝑚2 𝑜𝑘 𝑜𝑘 𝑜𝑘
𝑚1 𝑜𝑘 𝑜𝑘 𝑜𝑘
- 44. Lamportの論理クロックの弱点
◦ 𝑎 が 𝑏 より前に発生したなら 𝐶 𝑎 < 𝐶(𝑏) と導かれるが、
𝐶 𝑎 < 𝐶 𝑏 のとき 𝑎 が 𝑏 より以前に発生したとは限らない
◦ 下図で 𝑇𝑟𝑐𝑣(𝑚1) < 𝑇𝑠𝑛𝑑(𝑚2) であることが分かっても、𝑚2 の送信
は 𝑚1 の受信とはなんら関係がない(ことが判断できない)
→ Lamportのクロックは因果性(causality)を把握していない
- 45. ベクトルクロックの特性
◦ イベント 𝑎 のベクトルクロック 𝑉𝐶(𝑎) は、イベント 𝑏 に対して
𝑉𝐶(𝑎) < 𝑉𝐶(𝑏) ならば、イベント 𝑎 は 𝑏 に因果的に先行す
るという特性を持つ
𝑉𝐶 𝑎 = 𝑎1, 𝑎2, … , 𝑎 𝑛 , 𝑉𝐶 𝑏 = (𝑏1, 𝑏2, … , 𝑏 𝑛)
𝑉𝐶 𝑎 < 𝑉𝐶 𝑏 ⇔ (∀𝑖 1 ≦ 𝑖 ≦ 𝑛 : 𝑎𝑖 ≦ 𝑏𝑖) ∧ (𝑎 ≠ 𝑏)
◦ 𝑉𝐶𝑖[𝑖] は 𝑃𝑖 において今まで発生したイベントの数を表す
◦ 𝑉𝐶𝑖 𝑗 = 𝑘 ならば、𝑃𝑗 において 𝑘 個のイベントが発生したと
𝑃𝑖 は判断する
http://fan.naist.jp/~kounoe/lecture/compII/2006/slide/compII7_12.pdf
- 46. プロセス 𝑃𝑖 はベクトル 𝑉𝐶𝑖 を次のように維持する
1. イベントを実行する前に、 𝑃𝑖 は 𝑉𝐶𝑖 𝑖 ← 𝑉𝐶𝑖 𝑖 + 1 する
2. プロセス 𝑃𝑖 が 𝑃𝑗 にメッセージ 𝑚 を送信するとき、 𝑃𝑖 は先行す
るステップを実行した後に、 𝑃𝑖 は 𝑚 の(ベクトル)タイムスタンプ
𝑡𝑠(𝑚) を 𝑉𝐶𝑖 に等しくなるように設定する
3. メッセージ 𝑚 を受信すると、プロセス 𝑃𝑗 は最初のステップを実
行し、アプリケーションにメッセージを配信した後に、自己のベクト
ルを各 𝑘 について、𝑉𝐶𝑗 𝑘 ← max{ 𝑉𝐶𝑗 𝑘 , 𝑡𝑠(𝑚)[𝑘]} に調整す
る
特性
◦ イベント 𝑎 がタイムスタンプ 𝑡𝑠(𝑎) を持つならば、 𝑡𝑠 𝑎 𝑖 − 1 は
因果的に 𝑎 に先行する 𝑃𝑖 で処理されてイベントの数を示す。
◦ メッセージ 𝑚 が他のプロセスで因果的に依存しているか可能性が
あるかを知らせている
- 47. 𝑃1 𝑃2 𝑃3
(0,0,0)
𝑚1(1,0,0)
(0,0,0) (0,0,0)
(1,0,0)
(1,1,0)
(2,5,3)
(0,0,1)
𝑚2(0,0,1)
(1,2,1)
(1,3,1)
𝑚3(1,3,1) (1,3,2)
(1,3,3)
𝑚3(1,3,3)(1,4,3)
(1,5,3)
𝑚4(1,5,3)
各プロセスが持つVC
メッセージにピギーバックされる
(ベクトル)タイムスタンプ