web-dev-qa-db-ja.com

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

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

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

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

致命的[メイン]ホスト:クロックスキューは120で、100ミリ秒の制限を超えています。 NTPが実行されていることを確認してください。

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

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

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

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

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

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

1
Muhammad

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

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

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

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

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

2
John Hugg