VoltDBクラスターはノード間の時間同期をどのように決定しますか

dba.stackexchange https://dba.stackexchange.com/questions/128103

  •  29-09-2020
  •  | 
  •  

質問

複数のRHEL7.1vm(KVM)上のVoltDBクラスターに奇妙な痛みを伴う問題があります。

時間は、VMとそのハイパーバイザーの間で単一のローカルマスターNTPサーバーと同期されます-chronyを使用します。マスターサーバーは外部ntpプールと同期します。

VoltDBによって生成されたランダムエラーがあります:

\ n

FATAL [main] HOST:クロックスキューは120で、100ミリ秒の制限を超えています。NTPが実行されていることを確認してください。

\ n

Chrony configは、VoltDB forntpd-ここのパフォーマンスガイドに従って可能な限りセットアップされています。

「google-fu」で高低を検索しましたが、VoltDBがそのクロックスキューエラーをどのように判断するかについての答えが見つからないようです。

私が見つけることができる唯一の最も近いものは、このJavaコードにあります:603行目以降のgithubのvoltdb / SocketJoiner.java

skew = System.currentTimeMillis() - currentTimeBuf.getLong();

VoltDBが正確なタイミングのためにJava関数呼び出し--System.nanoTime()を代わりに使用しないのはなぜだろうか。

どんな助けや洞察も素晴らしいでしょう。

役に立ちましたか?

解決

起動時に、VoltDBはクラスターの最初のノードからクラスターのすべての参加ノードにラウンドトリップメッセージを送信します。このメッセージは、各ノードの現地時間を照会します。

参加しているノードごに、その現地時間最初のノードの現地時間の差が計算されます。これには、クロックスキューネットワーク遅延が含まれます。実際、クロックスキューネットワーク遅延が互いに打ち消し合う可能性はありますが、可能性はほんどありません。

参加しているすべてのノードで、VoltDBはクロック間の最大差を報告します。

この場合、VoltDBは、参加ノードと最初に起動したノード(スタートアップリーダー)を含むノードのペアについて、比較されたクロックの差が120msであったことを示しています。これは、NTP上のマシンの場合はかなりの量です。同じデータセンター。

ノード間のpingを使用してネットワーク遅延を確認できますが、VoltDBを実行するように設定したものと同じネットワークインターフェイスを使用していることを確認してください。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top