我在安装云时遇到了问题。
我已经安装了 Ubuntu Server 11.04 CD 中的所有内容,然后将系统升级到最新版本(apt-get update && apt-get dist-upgrade),安装了 NTP,正确设置了它,并启动了所有内容。云运行一段时间后,云控制器/集群控制器将停止与其中一个节点控制器通信!
其中一个症状是euca-describe-availability-zones verbose
突然开始显示的资源少于适当(和初始)的值。
如果我查看cc.log
,它会显示:
[Mon Sep 19 19:09:07 2011][002531][EUCADEBUG ] DEBUG: requested URI http://10.20.200.10:8775/axis2/services/EucalyptusNC
[Mon Sep 19 19:09:07 2011][002531][EUCADEBUG ] ncClientCall(ncDescribeResource): ppid=13403 client calling 'ncDescribeResource'
[Mon Sep 19 19:09:07 2011][002531][EUCAERROR ] ERROR: DescribeResource() could not be invoked (check NC host, port, and credentials)
[Mon Sep 19 19:09:07 2011][002531][EUCADEBUG ] ncClientCall(ncDescribeResource): ppid=13403 done calling 'ncDescribeResource' with exit code '1'
然后,在相应的节点控制器中axis2c.log
,我看到了以下内容:
[Mon Sep 19 19:10:58 2011] [error] rampart_timestamp_token.c(179) [rampart]Timestamp not valid: Created time is not valid
[Mon Sep 19 19:10:58 2011] [error] rampart_sec_header_processor.c(612) [rampart]Timestamp is not valid
[Mon Sep 19 19:10:58 2011] [error] rampart_sec_header_processor.c(1911) [rampart]Timestamp processing failed
[Mon Sep 19 19:10:58 2011] [error] rampart_in_handler.c(143) [rampart][rampart_in_handler] Security Header processing failed.
[Mon Sep 19 19:10:58 2011] [error] phase.c(233) Handler RampartInHandler invoke failed within phase Security
[Mon Sep 19 19:10:58 2011] [error] engine.c(696) Invoking phase Security failed
[Mon Sep 19 19:10:58 2011] [error] engine.c(279) Invoking operation specific phases failed for operation ncDescribeResource
[Mon Sep 19 19:10:58 2011] [error] rampart_engine.c(159) [rampart][rampart_engine] Cannot get saved rampart_context
[Mon Sep 19 19:10:58 2011] [error] rampart_out_handler.c(136) [rampart][rampart_out_handler] ramaprt_context creation failed.
[Mon Sep 19 19:10:58 2011] [error] phase.c(233) Handler RampartOutHandler invoke failed within phase MessageOut
[Mon Sep 19 19:10:58 2011] [error] engine.c(696) Invoking phase MessageOut failed
所以:存在时间同步问题。
但是,NTP 已安装并正确配置。
通过发布大量ntpq -np
,我注意到的一件事是一旦时间偏移为正,NC 就会停止工作。如果偏移量保持为负值,则一切正常。偏移量非常小(大约 5ms,我能看到的绝对最大值是 10ms)。
通过谷歌搜索,我发现了这个城墙代码:http://wso2.org/project/wsf/php/1.1.0/docs/code-coverage/rampartc/src/util/.libs/rampart_timestamp_token.c.gcov.html
/*Check whether created is less than current time or not*/
current_val = rampart_generate_time(env, 0);
validity = rampart_compare_date_time(env, current_val, created_val);
if (validity == AXIS2_SUCCESS)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart][ts]Timestamp not valid: Created time is not valid");
AXIS2_FREE(env->allocator, current_val);
current_val = NULL;
return AXIS2_FAILURE;
}
正如我们所见,从某种意义上来说,它显然允许时间上的偏差,但从另一种意义上来说则不允许。
我是不是漏掉了什么?只有我一个人遇到这个问题吗?以毫秒精度验证时间戳并仅允许负偏差不是很愚蠢吗?!
人们如何处理这个问题?我该怎么做才能让我的云保持活力?
我想到了一些解决办法:
- 修补 Rampart,简单地删除时间戳验证
- 补丁壁垒,以允许正偏差
- 找到一种方法来使时间
ntp
调整ntpdate
为服务器参考时间之后的特定偏移量 - 编写自己的时间同步工具
你怎么认为?
编辑:看起来可以在 Axis2 配置中禁用 Rampart,但我不知道如何做到这一点!
编辑2:Ubuntu 存储库中提供的 Rampart 版本是 1.3.0,发布于 2007 年或 2008 年……最新发布的版本是 1.6.0 之类的,发布于 2011 年 6 月。显然,这个最新版本允许“来自未来”的数据包。我真的很想从 PPA 中找到这个最新版本!
编辑3:我发现了一些可以改变 Rampart 1.3.0 行为的参数:TimeToLive、ClockSkewBuffer 和 PrecisionInMilliseconds。我已将它们(分别为 360、60 和 false)添加到 EucalyptusNC.xml 和 EucalyptusCC.xml,情况正在好转。偶尔我仍然会在日志中看到时间戳错误消息,但现在这种情况非常少见。我还在 NC 上禁用了 NTP,并创建了一个 cron 脚本(每小时运行一次)来将时间(ntpdate -b)与 CC 同步。
编辑4:显然这是 Ubuntu Eucalyptus 打包中的一个错误。我已在 Launchpad 上提交了一个错误,并遵循了 Freenode 上 #eucalyptus 中人们的建议:https://bugs.launchpad.net/ubuntu/+source/eucalyptus/+bug/854946
答案1
据我了解,rampartc 的版本是 1.3.0,而 axis2c 的当前版本是 1.6.0。所以它是当前版本。
我们在同步中没有看到该问题:如果时间在 5 分钟以内,它通常会起作用。
答案2
您已经遇到了软件虚拟化(以及云虚拟化)的一个关键问题,时钟不以硬件时钟为基础,并且会根据底层主机操作系统的整体业务情况而浮动。有时,物理时钟和虚拟时钟会同步,从而导致时钟跳变。在许多应用程序中,这种时钟跳变可能会严重破坏应用程序的性能。如果您需要非常高精度的时钟用于计时或审计目的,您可能需要转移到物理托管,而不是互联网上的虚拟托管。