【えいちえるしー(はいぶりっどろんりくろっく)】
HLC(ハイブリッド論理クロック) とは?
最終更新:
💡 物理時計に基づく値とカウンタで、因果順序を保つ時計
分散システムで、物理時計に基づく値lと論理カウンタcを組み合わせる時計。メッセージなどによる因果順序を保つタイムスタンプを付ける。値の大小から因果関係を逆に断定することはできない。
📌 このページのポイント
- タイムスタンプは(l, c)。lは現在の物理時刻そのものとは限らない
- 送信や内部イベントでは、自分のlと物理時刻を比べて更新する
- 受信時は自分のl・送信側のl・現在の物理時刻の最大を使う
- 因果関係があれば値は増えるが、値の大小だけで因果関係は断定できない
分散システムでは、時刻の管理が難しいの?
HLCは何を組み合わせるの?
(l, c)というペアを使うよ。lは物理時計に基づく値、cは論理カウンタ。まずlを比べ、同じならcを比べる。lには自分が知った時刻の最大値を使うので、その瞬間の自分の物理時計と一致するとは限らないんだ。
メッセージを受け取ると、どう更新する?
新しいlは「自分の以前のl、受信したl、今の物理時刻」の最大だよ。以前のlと受信したlが両方その最大と同じなら、cは両方のcの最大に1を加える。片方だけ同じならその側のcに1を加え、物理時刻が両方より大きければcを0に戻すんだ。単に送信側と物理時計を比べるだけではないよ。
図の(100, 1)と(112, 0)はどうしてそうなるの?
図は単位を省いた時刻例だよ。Bは物理時刻99でAの(100, 0)を受け取り、(100, 1)にする。一方、Aが(110, 0)を受け取る時の物理時刻は112で、以前のlは105。112がどちらよりも大きいから、結果は(112, 0)なんだ。カウンタが小さくなっても、lが大きいのでペア全体は増えているよ。
値が小さいイベントが、大きいイベントの原因なの?
そうとは限らないよ。「同じノードで先に起きた」「送信に対応して受信した」などの因果関係があれば、タイムスタンプは増える。ただし、値の大小だけで原因や関係のない同時進行を判定できない。HLCは物理時計のずれそのものをなくす装置でもないんだ。CockroachDBやYugabyteDBでも、この時計を利用しているよ。
まとめ:ざっくりこれだけ覚えればOK!
「HLC」って出てきたら「物理時計に基づく値とカウンタで、因果順序を保つ時計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Hybrid Logical Clock」 = 混合した論理時計
💬 物理時計と論理時計の考え方を組み合わせることからHybrid(混合)と呼ぶ。2014年の論文でSandeep Kulkarni、Murat Demirbasらが提案しているよ。