故障案例-更改NTP时间引发的重大故障

更改NTP时间引发的重大故障

背景

应该是在 14 年的时候, 那时刚到某现场, 发现几十台主机的时间相差很多, 有些是差几分钟, 有些是几个小时, 还有差几天的;

大吃一惊, 这也能行;

后来了解核心业务里面只要 memcache 内有 key 就不算会话过期, 所以没啥大的影响;

当然看日志查数据等时候还是不方便, 于是提了个变更申请, 打算晚上把时间改一致了, 为了一劳永逸, 决定搭个 NTP服务。

上线

于是当天下午就搭好了 1 台 NTP, 并且将 NTP 主机的时间和北京时间进行了同步;
只不过因为是纯内网环境, 只能靠敲回车键时手的精度来同步了;

1
date -s 2014-03-26 16:20:00

敲了这条命令发现报错了, 很明显一眼就能看出来, 后面不应该有空格, 被理解为两个参数了

于是好吧, 就拆成两条来执行

1
2
1. date -s 2014-03-26
2. date -s 16:20:00

然后输入 date 命令, 显示当前时间是 2014-03-26 16:20:03

嗯, 就是这么神奇, 一条命令一分为二, NTP 服务器的时间和北京时间一致了,
计划晚上在上线窗口期间再把其它机器的时间源指向这台机器就可以了;

然后到了晚上的上线时间了, 开始逐台配置 ntpdate crontab 并重启一下业务服务; (因为有些机器的时间是快了, 觉得还是重启一下保险点)

很快所有机器都处理完了, 检测每台机器的系统时间和 NTP 机器的时间都是一致的了, 业务测试也没问题;

给观战的大伙报告了喜讯, 大伙提议一会儿去喝几杯, 于是开始收拾准备走了;

此时此刻我又看了一下 NTP 服务器的时间, 强迫症突然犯了, NTP 主机的时间和我手机看到的北京时间, 慢了 2 秒, 心理不大舒服;

想了一下, 如果我再设置一下 NTP 的时间, 也就 +2 秒的差异, 而且时间是增加也不是减少, 所以其它主机其实不用操作, 服务也是不需要重启的。

于是 我就找出之前的两条命令, 复制到记事本上, 并修改为即将到来的时间。

1
2
1. date -s 2014-03-26
2. date -s 23:47:00

然后 ’ 剪切 ’ 第二条命令后粘贴在 命令行上, 并盯着 手机秒表准备到点敲回车,

在 23 点 47 分 00 秒 即将到来前的 0.5 秒, 我开始手腕发力, 顺势敲下;

此时内心戏是我这一手真是绝了 !!

然后看到记事本上还剩下一条命令, 脑袋不知道咋在想的, 觉得既然时间已经同步了, 那就把日期也同步一下吧, 反正也是同一天。

于是剪切 剩下的第一条命令, 粘贴执行;

刚好此时已经收好包的同事们过来拍我说赶紧走去喝酒, 别磨蹭。

好咧, 我于是退出终端, 关闭电脑, 收包就和大家一起走了 !

晚上小酌几杯;

第二天早上还没起床就接到领导的电话, 说有周边业务系统反映说我们系统某业务有问题。

我隐约想到了啥, 立马翻身起床, 不到 60 秒完成 开机 +VPN+ 登陆一台主机, 一看系统时间, 和当前北京时间差了好像十几个小时。

然后赶紧登陆 NTP 主机, 设置最新的时间, 再批量到各主机执行同步时间任务, 然后业务就恢复了;

事故复盘

问题就出现在拆出来的这两条语句上了

1
2
1. date -s 2014-03-26
2. date -s 23:47:00

下午同步时, 先更新日期, 再更新时间, 对当时还空跑着的 NTP 服务器当然没啥问题;

最后走之前那次, 如果我是将这两条命令一起复制粘贴上去, 极大概率也不会有啥问题;

但偏偏我就先执行了第二条, 然后还没有忘了把第一条也执行了, 这就导致了问题;

原因:
当 date -s 选项的时间格式不完整的时候, “会被补全的!!!

例如当天是 2014-03-26, 则输入

1
2
3
4
5
6
7
date -s 23:47:00    会被补全为 2014-03-26 23:47:00
date -s 23:47       会被补全为 2014-03-26 23:47:00
date -s 23          会被补全为 2014-03-26 23:00:00
于是
date -s 2014-03-26  则被补全为 2014-03-26 00:00:00

date -s "2014-03-26 23:47:00"   # 带引号则可以同时设置日期和时间

后来我再使用 date 命令时, 脑袋第一反应就是 引号 在哪里!

经验教训

这次故障的教训颇深, 以至于隔这么多年还是记忆犹新, 恍然昨日;

一直提醒着我生产环境中 每条命令确定要看懂了再敲回车;

PS1:
当然我记得这么清楚, 还有就是因为我保留着当时 xshell 的终端日志(开有自动记录的), 每次看到这个日志文件我就又恍如昨日了。

PS2:
我后来反问自己了一个问题, 我为什么会进行 ‘剪切 - 粘贴’, 而不应该是 ‘复制 - 粘贴’ 呢?
如果是 ‘复制 - 粘贴’ 的话, 应该就不会触发"还剩一个, 干点啥吧"这种奇怪想法了吧。

触及灵魂的反问后,我得出结论,原因是新开且未保存的记事本中如果有内容,快捷键关闭时(alt+space+c),会’弹框+声音’提示是否保存,我潜意识里实际上是比较反感这种把手再挪一下去点鼠标,或者去按方向键+回车的行为,于是就有了把内容清空(用完)的强迫行为。
啧啧啧!(请叫我 弗洛伊德-陈),后来我就开始重度使用 sublime 了。

微信搜索IT运维小秋

Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2021-06-05 00:00 UTC