时钟回调我们服务器的时间校准一般都是通过ntp进程来校准的。但是,由于这个动作的校准,会导致时钟跳变。在这种情况下,回调往往会给我们带来最大的麻烦。回调如下:会造成什么问题?情况和时钟回调的情况如下图所示:针对这种情况,笔者要求业务调整调度触发时间,不要精确到时间,避免出现这个问题。唯一的序号(雪花算法)时钟回调情况也会影响雪花算法的使用,需要单调的时间戳。很明显,回调时间戳后,很容易形成重复的序号。对于这种情况,我们使用保留序列号段。检测到这种情况后,我们分配预留序列号来解决这个问题。ntpd的时钟回调(跳转)条件其实ntpd本身还有另一种解决方案,就是通过调整tick频率,让我们本地的时钟慢慢匹配到精确的时间。但是如果本地时间和精确时间(从ntpd服务器获取的时间)相差过大(>stepoutthreshold128ms),ntpd会直接跳转校正时间。代码如下:ntp_loopfilter.cdoubleclock_max=CLOCK_MAX;//.128为128msintlocal_lock(...){//gap>128ms后,选择transitionif(fabs(fp_offset)>clock_max&&clock_max>0){......//Fixsimclock.local_timestep_systime(fp_offset);...}}在我们的线上,经常可以在/var/log/message中看到时钟跳变的输出。-x选项我们使用-x选项将步出阈值(128ms)增加到600s。这样,如果情况不是太极端,应该不会触发时钟回调。但是这样会导致长时间时间戳不准的问题(毕竟调整tick频率慢匹配比较慢)。stepbackstepback在更高版本的ntpd中,还有一个stepback选项,如果设置为0,则不会回调。本文转载自微信公众号《Bug解决之路》,作者的Bug解决之路。转载本文请联系BUG解决公众号。
