运维老手血泪总结:5大服务器部署深坑
|
去年4月,我蹲在三号机房角落换SSD,机柜顶上滴水,不是空调漏水,是楼顶检修口没盖严,雨水顺着桥架缝往下渗,一滴一滴砸在散热格栅上,咚、咚、咚——像倒计时。李工站我旁边啃冷掉的肉夹馍,油蹭到工单打印纸上,他伸手抹了下鼻子,又去拧螺丝,指节发白。我原以为就换块盘,二十分钟收工。结果拆完旧盘,发现RAID卡固件是2017年3月的,连新盘都不认。厂商文档写“兼容NVMe”,呸,它只认自己亲儿子型号,还是带后缀-A2的那种。 坑一:把“兼容”当“能用”。测试环境跑通≠生产能扛住流量突刺。我们上线前压测,全链路走K8s Service转发,指标漂亮得像PS过的。真切流那天凌晨三点,网关Pod疯狂OOMKilled——不是内存不足,是内核conntrack表爆了。iptables里一堆TIME_WAIT状态的连接卡着不放,netstat看一眼就知道是谁家祖宗写的初始化脚本。那个脚本还在/etc/rc.local里活着,注释写着“by zhangsan 2016”,没人动过。张三早转岗做售前去了,现在见我都绕着走。我说不准他当年是不是真测过四层负载突增场景,但我知道,那行“sysctl -w net.netfilter.nf_conntrack_max=65536”后面,少了个“-p”。 老王接电话那会儿,背景音全是咳嗽声。他捂着听筒说“再等两天”,挂了就往嘴里塞薄荷糖,糖纸折了三次才撕开。其实不是等补丁,是等运维总监签字批钱换硬件。我们仨盯着监控大屏,CPU曲线在37%和92%之间抽搐,像心电图快停跳前的室颤。没人说话。机房风扇噪音忽然变大了——其实是空调主循环停了,备用机还没启,热风慢慢糊上来,汗从后颈往脊椎沟里淌。我就盯着屏幕右下角时间:十八秒。整整十八秒没人动鼠标。直到告警邮件弹出来第三封,小陈才伸手去点刷新。我敢打包票,他点的是F5,不是Ctrl+R。 坑二:日志级别设成INFO还配个logrotate每天轮转,等于给火场装装饰性喷淋头。出问题时grep半天,只看到“service started”、“config loaded”,连线程池打满都懒得吐句WARN。有个服务崩了三次,每次都是堆外内存泄漏,但日志里只有两行:“init finished”、“shutdown hook triggered”。我翻源码才发现,作者把OOME捕获后吞掉了,还打了句debug:“ignore jvm crash, let container restart”。我当场把这段注释抄进周报附件,加粗标红,附上截图。第二天开发组开会,对面那个穿灰卫衣的实习生低头猛戳咖啡杯拉花,泡沫散了三次,他都没抬眼。 上周五我去隔壁团队帮忙调集群脑裂问题,他们用etcd自建高可用,证书用的Let’s Encrypt自动续期——对,就是那种默认90天的。到期前三小时,脚本跑失败,没告警,因为cron里重定向被改成>/dev/null 2>&1,连错误码都不留。更绝的是,续期失败后,etcd进程居然还在跑,只是所有写请求返回“context deadline exceeded”。查集群健康时,curl -k https://xxx:2379/health 返回{“health”: “true”}……它真这么写的。我念出来的时候,对面戴黑框眼镜的姑娘突然笑出声,手里的保温杯盖子没拧紧,“啪”地弹到地上滚了半圈,停在配电柜影子里。她弯腰捡,我接着说:“这个health字段是硬编码的。”她点头,又摇头,头发扫过耳垂。我没问她信不信。
文章配图,仅供参考 坑三:用容器当虚拟机使,镜像里塞JDK、Python、gcc、vim、wget……甚至还有Chrome Headless。部署时拉取一个镜像要十二分钟,重启一次等于重装系统。有次磁盘满,df -h一看,/var/lib/docker/overlay2 占了九百多G,进去ls -S | head -5,全是八百多MB的layer。后来查到是某位同事在Dockerfile最后COPY了一个本地node_modules.tar.gz,解压后再删——但tar包本身还留在镜像层里。删?删不掉。Docker build缓存太聪明,他删那一行,被上一层RUN直接无视。你说气不气?我气,但我改完之后,顺手帮他们配了buildkit,加了--squash(虽然官方说deprecated,可它真管用)。现在build快了六分钟。他们请我吃了顿麻辣香锅,老板没来,就三个后端,辣椒面撒多了,辣得人鼻尖冒汗,谁也没提“squash”这词。 昨天整理旧部署手册,在共享盘根目录下翻出个叫“prod-fixes-2021”的文件夹。打开,里面全是带日期的shell脚本,命名规则是fix-xxxx-xx-xx.sh,最早的日期是三年前。最晚的那个是去年4月的,跟我换SSD同一天。我点开看了眼,开头是#!/bin/bash —— 没错,shebang写对了;第二行是set -e —— 好家伙,还懂容错;第三行是source /etc/profile.d/java.sh。我手指停在键盘上,没往下翻。楼下送外卖的在按门禁,嘀嘀嘀按了七下。我想起那天机房滴水的声音,又想起张三写的rc.local脚本。有些东西不会坏,只是没人修;有些坑不会填,只是被新坑盖住了。 坑四和坑五,今天先不说了。我把那叠旧手册塞回U盘,插进自己笔记本。USB口有点松,插了两次才亮灯。回去路上买了盒牛奶糖,含了一颗在嘴里,甜得发腻。明天上午九点,跟DBA约了聊归档策略,他们坚持用rsync推归档日志,理由是“稳定”。我答应了,没提inotifywait或者change data capture的事。反正他们库表没加rowid,日志格式也没统一,聊也是白聊。我先睡两小时。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


站长必修:SQL Server运维12大坑及避坑指南
鸿蒙开发者必修:MySQL高并发运维实战
边缘AI工程师亲授:MySQL实战手册,设计运维一册通
网站上线流量归零?运维盲区正 silently 蚕食用户
Unix调试总卡壳?9年运维揭5大隐性陷阱
站长自说自话?容器运维视角看评论客观性
网站合规运维的7大致命盲区,90%团队竟浑然不觉