ランポート クロック

ロジカルタイムスタンプを、サーバを超えた値の順序付けを可能にする値のバージョンとして使用

問題

値を複数のサーバに保存する場合、どの値が他の値よりも前に保存されたかを知る方法が必要です。システムタイムスタンプは使用できません。なぜなら単調増加でなく、 2台の異なるサーバのクロック値を比較すべきではないからです。

1日の時間を表すシステムタイムスタンプは、一般に水晶発振器で構築されたクロック機構によって測定されます。このメカニズムで知られている問題は、1日の実際の時間から逸脱する可能性があることです。これを修正するために、コンピュータには通常、インターネット上の基準時刻源とコンピュータクロックを同期させるNTPなどのサービスがあります。このため、特定のサーバでシステム時間の連続した2回の読み取りにより、時間が後退する場合があります。

サーバ間のクロックのドリフトに上限がないため、2台の異なるサーバのタイムスタンプを比較することは不可能です。

解決策

ランポート クロックは、タイムスタンプを表すために単一の数値を維持します。各クラスタノードは、ランポートクロックのインスタンスを保持します。

サーバが何らかの書き込み操作を実行するたびに、`tick()` メソッドを使用してランポート クロックを進める必要があります。

class LamportClock

  public int tick(int requestTime) {
      latestTime = Integer.max(latestTime, requestTime);
      latestTime++;
      return latestTime;
  }

このように、サーバは書き込みがリクエストの後、およびリクエストがクライアントによって開始されて以降サーバが行ったその他の操作の後にシーケンシングされることを確認できます。サーバは、値をクライアントに書き込むために使用されたタイムスタンプを返します。リクエストクライアントは、このタイムスタンプを使用して他のサーバセットにさらに書き込みを行います。このようにして、リクエストの因果関係の連鎖が維持されます。

詳細については、oreilly.com のオンライン電子書籍の章22を参照してください。

このパターンは分散システムのパターンの一部です。

2023年11月23日