我在多个 RHEL7.1 虚拟机 (KVM) 上遇到 VoltDB 集群的奇怪问题。
时间在 VM 和它们的管理程序之间通过单个本地主 NTP 服务器同步 - 使用 chrony。主服务器与外部 ntp 池同步。
VoltDB 生成了一个随机错误:
FATAL [main] HOST:时钟偏差为 120,大于 100 毫秒限制。确保 NTP 正在运行。
已根据 VoltDB for ntpd 的性能指南尽可能多地设置 Chrony 配置 -这里。
我用我的“google-fu”搜索了高低 - 但我似乎无法找到关于 VoltDB 如何确定时钟偏差错误的答案。
我能找到的唯一最接近的代码是在这个 java 代码中: github 上的voltdb/SocketJoiner.java从第 603 行开始。
skew = System.currentTimeMillis() - currentTimeBuf.getLong();
我想知道为什么 VoltDB 不使用 java 函数调用 - System.nanoTime() 而不是精确计时。
任何帮助或见解都会很棒。
在启动时,VoltDB 将从集群的第一个节点向集群的所有加入节点发送一条往返消息。此消息查询每个节点的本地时间。
对于每个加入节点,计算其本地时间与第一个节点本地时间之间的差异。这包括时钟偏差和网络延迟。事实上,时钟偏差和网络延迟有可能相互抵消,但可能性不大。
在所有加入的节点中,VoltDB 报告时钟之间的最大差异。
在这种情况下,VoltDB 告诉您,对于一些节点对,包括一个加入节点和您启动的第一个节点(启动领导者),比较时钟之间的差异是 120 毫秒,这对于 NTP 上的机器来说是很多的同一个数据中心。
您可以使用节点之间的 ping 检查网络延迟,但请确保您使用的是与设置 VoltDB 运行时相同的网络接口。