【前情提要】 小林转正了。老周说:“你可以出师了。”但小林知道,出师不是终点,是起点。半年后,小林遇到了一个他没想到的挑战。
一、半年后的工位
半年后,小林的工位换了。
从靠墙的小桌子,搬到了靠窗的位置。桌上多了一台显示器,一个机械键盘,和一个保温杯——老周同款。
他每天的工作,不再是“搭博客、配监控、分析日志”这三件事。他开始接手公司的真实服务器,一共 12 台,跑着 Web、数据库、缓存、消息队列。
“小林,你现在是正式运维了。”老周说,“但我要提醒你一句。”
“什么?”
“虚拟机和真实服务器,是两回事。”
小林不信:“不都是 Linux 吗?”
“都是 Linux。”老周说,“但虚拟机里,你搞坏了,快照恢复。真实服务器上,你搞坏了,业务就挂了。虚拟机的错误,是‘学费’。真实服务器的错误,是‘事故’。”
小林把这句话记在了笔记本第一页。
二、第一次真实故障
入职第五个月,小林遇到了第一次真实故障。
周五下午 5 点,快下班了。监控群里弹出一条告警:
[FIRING:1] InstanceDown (critical)
实例 10.0.0.23 离线
小林看了一眼,心跳加速。
“10.0.0.23 是那台数据库服务器。”他自言自语,“不是我的博客,是真实业务。”
他打开 Grafana,确认 CPU、内存、磁盘全断了。up 变成 0。
“数据库挂了。”
他深吸一口气,想起老周说的“全链路排错清单”。
第一步:网络通不通?
ping 10.0.0.23
输出:
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
“不通。”
第二步:SSH 能连吗?
ssh devops@10.0.0.23
输出:
ssh: connect to host 10.0.0.23 port 22: Connection timed out
“也不通。”
第三步:这台机器在不在?
他联系机房同事:“10.0.0.23 那台物理机,电源正常吗?”
“稍等,我看一下。”
一分钟后:
“电源正常,但系统没起来。”
“能连 KVM 吗?”
“能,我给你开。”
小林通过 KVM 看到屏幕——系统卡在启动阶段,报了一行:
/dev/sda1: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
“文件系统不一致。”小林说,“需要手动 fsck。”
第四步:处理。
他在 KVM 里执行:
fsck -y /dev/sda1
等了五分钟,修复完成。重启。
系统起来了。数据库自动启动,监控恢复,告警变成 [RESOLVED]。
小林看了一眼时间:下午 5 点 40 分。从告警到恢复,25 分钟。
老周走过来,拍了拍他肩膀:“处理得不错。但你知道为什么会文件系统不一致吗?”
小林摇头。
“因为这台机器上次断电,是直接拔电源的。没有正常关机。文件系统没来得及把缓存写入磁盘,就断电了,导致不一致。”
“那怎么办?”
“两个改进。”老周说,“第一,机房加 UPS,断电时能撑 10 分钟,够系统正常关机。第二,关键数据做定期备份。你 fsck 能修好这次,下次可能就修不好了。”
小林记下:
- 文件系统不一致:
fsck -y /dev/sdaX - 根本原因:异常断电
- 改进:UPS + 定期备份
- 虚拟机可以快照,真实服务器只能靠备份
三、老周的“最后一杯枸杞”
晚上 6 点,办公室只剩下小林和老周。
老周端着保温杯走过来,坐在小林旁边的椅子上。
“今天处理得不错。”老周说,“但我想问你一个问题。”
“什么?”
“你觉得,运维这行,最难的是什么?”
小林想了想:“技术更新太快?”
“对,但这不是最难的。”老周说,“最难的,是‘背锅’。”
小林愣了一下。
“业务挂了,第一个被问的是运维:‘怎么挂了?’‘为什么没监控到?’‘什么时候能恢复?’ 但很多时候,不是运维的问题——是开发代码有 bug,是产品需求变更没通知,是网络运营商光纤被挖断。”老周说,“但老板不管这些,老板只看结果。运维是最后一道防线,也是第一个被问责的人。”
“那怎么办?”
“三个字:留证据。”老周说,“你监控有数据,日志有记录,变更有时序。出了事,你先查,查完拿出证据:什么时候出问题、什么原因、谁改的、改了什么。证据在手,责任分清。”
小林在笔记本上写下:运维不是背锅的,是查真相的。
“还有,”老周说,“别把系统搞得太复杂。 你今天加一个组件,明天加一个插件,后天加一个脚本。组件越多,故障点越多。简单,是运维的最高境界。”
小林记下:
- 留证据:监控数据、日志记录、变更时序
- 简单:组件越少,故障越少
老周喝了一口枸杞水,站起来:“好了,我该走了。你早点回去。”
“周哥。”小林叫住他,“谢谢你。”
老周回头,笑了笑:“别谢我。你以后带新人的时候,把这句话传下去就行。”
“什么话?”
“运维不是学命令,是学怎么扛事。”
四、小林的新博客
那天晚上,小林回到家,打开自己的博客。
半年了,博客还在跑。访问量从每天的 10 次,涨到了 300 次。有人留言,有人提问,有人感谢。
他打开编辑器,写了一篇新文章。
标题是:《从“会敲命令”到“能扛事”:我的运维半年》。
他写道:
半年前,我写了一篇文章,叫《三个月,从 Mac 小白到运维入门》。
那时候我以为,会敲命令就是运维。
半年后我才知道,命令只是起点。
真实运维,是凌晨 2 点的告警电话。
是 5 点 40 分的数据库故障。
是老板问“什么时候能恢复”时的冷静。
是问题解决后,写复盘报告时的诚实。
运维不是一份工作,是一种责任。
你在虚拟机上搞坏了,快照恢复,没人知道。
你在生产环境搞坏了,业务停了,所有人都在看你。
所以,运维的第一课,不是命令,是敬畏。
敬畏生产环境,敬畏每一行配置,敬畏每一次变更。
你可以不懂所有技术,但你必须对每一次操作负责。
这就是我这半年,学到的最大一课。
写完,他点了发布。
几分钟后,收到一条评论:
老周:写得不错。但别忘了,敬畏归敬畏,该动手时还得动手。
小林笑了,回复:
收到,周哥。明天见。
五、给读者的最后一封信
亲爱的读者:
如果你读完了这本书,恭喜你。
你跟着小林,从一台 MacBook 开始,装了虚拟机、搭了博客、配了监控、分析了日志、处理了故障。你学会了 200 多条命令,踩了 50 多个坑,看了无数遍 Permission denied。
但我想告诉你,这只是开始。
真实运维,比书里复杂得多:
- 书里你监控 1 台机器,真实环境你监控 100 台。
- 书里你处理磁盘满,真实环境你处理数据库死锁。
- 书里你分析 Nginx 日志,真实环境你分析全链路日志。
- 书里你一个人做,真实环境你和一个团队做。
但有一点不变:
遇到问题,先看日志。 遇到报错,先查文档。 遇到故障,先按顺序排查。
这三个习惯,是你最宝贵的财富。
最后,送你一句话,是老周送给小林的,也是我想送给你的:
“运维不是学命令,是学怎么扛事。”
愿你,扛得住。
——作者
全书完。
感谢你陪小林走完这三个月。
接下来,轮到你了。