VoltDBクラスターはノード間の時間同期をどのように決定しますか
質問
複数のRHEL7.1vm(KVM)上のVoltDBクラスターに奇妙な痛みを伴う問題があります。
時間は、VMとそのハイパーバイザーの間で単一のローカルマスターNTPサーバーと同期されます-chronyを使用します。マスターサーバーは外部ntpプールと同期します。
VoltDBによって生成されたランダムエラーがあります:
\ nFATAL [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を実行するように設定したものと同じネットワークインターフェイスを使用していることを確認してください。