Jack's Field Notes
← 返回索引
工程 5 min read

给长期运行的系统留一点余地

稳定不是把资源用到刚刚好,而是在变化到来时,系统仍有空间完成下一步动作。

一台刚装好的服务器总是很干净:磁盘几乎是空的,服务只有几个,配置文件的用途也记得清清楚楚。半年以后,日志、缓存、临时脚本和“先留着”的备份会慢慢堆起来。系统没有突然变坏,只是余地一点点消失了。

余地首先是容量。磁盘不能等到百分之百才处理,因为日志轮转、软件更新和数据库整理本身也需要临时空间;内存不能长期贴着上限,因为一次流量波动就可能触发交换或杀死进程;连接数也不能只按平时计算,因为故障重试会让压力在最糟糕的时候放大。

能回滚,才算真正完成一次变更

配置服务时,我越来越在意“如果这一步错了,怎么回来”。修改 SSH 端口前保留现有会话,切换防火墙规则前确认恢复入口,替换证书前备份旧文件。对于远程服务器,错误并不可怕,失去操作通道才可怕。

一个实用的方法是给高风险变更设置自动回滚:先安排几分钟后的恢复任务,再应用新配置;只有当新端口、服务状态和实际请求全部验证通过,才取消回滚。它不高级,却把“希望不会出错”变成了一个明确的恢复机制。

上线不是进程显示 active,而是旧路径可恢复、新路径能从用户一侧被证明。

安全也需要呼吸空间

安全加固常被理解成不断关闭入口。默认拒绝的防火墙、密钥登录和失败尝试封禁当然重要,但规则越多,维护者越需要知道哪些端口属于谁、证书由什么续期、重启顺序会影响哪些服务。

所以好的加固还应该减少隐含状态:把服务交给 systemd 管理,让更新有固定节奏,让证书续期带着可测试的部署钩子,清理已经失去用途的常驻进程。系统的攻击面变小,理解它所需的脑力也会变少。

我会定期确认四件事:磁盘是否留有更新空间;安全更新是否真的执行;公网监听端口是否都能解释;备份配置是否仍能恢复当前版本。监控数字很多,但这四件事通常最先暴露长期维护的问题。

不要把今天的峰值当成永远

余地并不等于无止境地买更多资源。它更像一种设计态度:承认负载会变化、依赖会失败、未来的人可能不记得今天的决定。容量预留、超时、重试上限、日志轮转和恢复文档,都是在为未知留位置。

我喜欢那些运行很久却很少需要被想起的系统。它们通常不是因为配置最复杂,而是因为每个边界都留了一点空间:足够观察,足够恢复,也足够让下一次改变发生。