【えいちえるしー(はいぶりっどろんりくろっく)】

HLC(ハイブリッド論理クロック) とは?

最終更新:
💡 物理時計に基づく値とカウンタで、因果順序を保つ時計

分散システムで、物理時計に基づく値lと論理カウンタcを組み合わせる時計。メッセージなどによる因果順序を保つタイムスタンプを付ける。値の大小から因果関係を逆に断定することはできない。

📌 このページのポイント
HLC:メッセージの因果順序を保つ A B msg1 送信 pt=100 (100, 0) msg1 受信 pt=99 (100, 1) 内部イベント pt=105 (105, 0) msg2 送信 pt=110 (110, 0) msg2 受信 pt=112 (112, 0) 内部イベント pt=115 (115, 0) pt:その瞬間の物理時計 (l, c):lを先に比べ、同じならc 下ほど後のイベント。時刻の単位は省略
初期値(l, c)=(0, 0)の数値例。矢印はメッセージの送信→受信で、全イベントを同じ実時刻に揃えた図ではない。lは物理時計ptそのものとは限らず、値の大小から因果関係を逆に断定できない。
ひよこ ひよこ
分散システムでは、時刻の管理が難しいの?
ペンギン先生 ペンギン先生
複数のサーバーの物理時計を完全に一致させるのは難しいんだ。NTPなどで合わせても、誤差や時刻の補正があり得る。時計の表示だけでは、ある処理を受けて別の処理が起きた、という因果順序を正しく表せないことがあるよ。
ひよこ ひよこ
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らが提案しているよ。

参考資料

← 用語集にもどる