啊!你的服务又挂了?

译者前言

Troubleshooting 即故障排查检修,这绝对不是一项简单的任务,不同技术体系之间天差地别,这个问题可有统一答案?因为具体的技术终将过时,所以本文不谈任何具体的技术细节,而是针对 troubleshooting 提出十条方法论。

本文原作者:Steve Mushero

原文链接:

https://medium.com/faun/shit-breaks-dao-of-troubleshooting-6cc1b3869ce0

1. 故障无法避免

啊,你的服务又挂了,很不幸。

更不幸的是,因为负载高、业务复杂,它挂掉是常事。

它以一种不能被 “自动扩容”、“加容器”、“重启” 等手段轻易 “解决” 的方式挂掉,花里胡哨的调度系统此时也起不到作用。当然我不是说这些方法没用,毕竟它们各有各的场景。

有时候,你面对一个故障,5 分钟就能定位原因,但作为 “老兵” 的你一定懂得这背后需要多少经验积累和努力,常言道 “功夫都在戏外”。

如果你恰好用了微服务(micro-service)、无服务器(server-less)、无限可分割(infinitely-divisible)、无处不在的松散连接组件(loosely-connected pieces and parts)之类的新玩意,修复起来就更难了。

何解?具体技术早晚会过时,而方法论则具备长久生命力。唯有 “道”(指方法论)才是应对复杂系统的指路明灯。

2. 对一切建模

要能说出每个部件在模型中的位置,它们如何交互、如何配置。条件允许的话,连它的行为也要弄清楚。

拿到并看懂逻辑架构图,有必要的话,物理架构图、网络架构图也一样。搞清楚不同尺度上的分层、分组。

3. 可知则尽知

尽你所能,弄清楚所有的配置和状态。

这确实很难,看懂仓库里的代码、配置文件、.env、基础结构即代码(infrastructure-as-code systems)只是毛毛雨,更不要说运行时动态的部分。但不管你喜不喜欢,真正运行着的系统就是一切真相的源头。

4. 谁动了环境?

最近有什么被动过?由谁?何时?操作对象是什么?效果是什么?谁登过服务器?谁 push 过代码?改了什么配置?诸如此类。

然后,哪些行为发生了变化。例如谁的延迟发生了变化,相关部分的动力学[1]变化,错误率是否有变化,哪些资源负载或可用性发生了变化?哪些变化重要呢?

5. 请专家

直接或间接地应用知识和经验,了解事物之间的关系、依赖,尤其是动力学及与之关联的失效模式[2]。动用一切资源去找最懂行的人,问朋友同事、在论坛社区发帖、在社交网络提问、在 IRC 或邮件列表提问……如果专家是“鬼魂”,那就“作法招魂”[3]。到现场指导是最好的、实在不行就远程。条件允许的话,使用可用的专家系统或规则引擎,这些都是被编码过的专业知识。

6. 提问要清晰准确

提问前请务必再三观察和思考,虽然提供给专家的信息永远是片面的,但错误的提问神仙难救,而某些低风险的、清晰而准确的提问,则连人脑都不需要,可以直接被规则引擎快速地自动解答,这就是提问质量的差距。

7. 局部小规模实验

可对系统做微小的改动或调整,观察其影响。

这招非常好用,尤其是使用排除法时、探究组件之间的关系、验证某些东西不生效的猜想时。

8. 提前做排除

别浪费时间在明显错误的方向上,它会吞噬掉大量的时间和精力,注意力被转移,资源被浪费,不要等到最后才懊悔没早点排除错误选项。问题 “是” 什么固然重要,但永远别忽视问题 “不是” 什么,要持续不断地根据逻辑和经验做排除。

9. 小心求证

排查到最后可能以自相矛盾的结论收尾,某些部分似是而非,最终问题无解。用马克 · 吐温的话说:“麻烦的不是未知,而是你深信不疑,却发现事实并非如此”。

所以在排查过程中要乐于不断挑战和测试自己的基本假设、基本事实与真相,因为似是而非的部分往往埋藏在其中。

10. 寻求慰藉

排查问题是困难的,时间和工具永远都不够,并且总是伴随着巨大压力。时常停下来,重新思考和审视已知的一切,观察它们如何连接与相互影响,真相经常以这样匪夷所思的方式被发现……

故障无法避免,遵循以上十条真理,答案终将到来。

注解:

[1] Dynamics 即动力学,这里理解为需要分辨指标中谁是因,谁是果,以及影响程度。对指标的解读是关键。

[2] Failure Modes 即失效模式,详见百科 https://en.wikipedia.org/wiki/Failure_mode_and_effects_analysis。这里强调的是有效利用前人的经验。

[3] 原文是 Ouija 即通灵板,流行在欧美的一种占卜方式类似笔仙,这里的意思是从一切来源寻求专业知识,有必要的话连鬼魂都要问。

必 看

 加入我们 

岗位名称:云操作系统研发工程师

工作职责:

1. 使用容器化技术解决大数据产品在私有化部署及 SaaS 场景下面临的多种技术挑战;

2. 开发基于 Kubernetes 的自动化部署及基础应用平台,提升产品的运维效率和稳定性。

岗位要求:

1. 计算机或相关专业毕业,本科及以上学历;

2. 对操作系统、网络等底层基础知识有深入的理解;

3. 至少熟练掌握 C/C++/Java/Python/Go 中的一种编程语言,有良好的编码习惯;

4. 熟悉 Kubernetes、Docker 原理及应用;

5. 熟练掌握 Linux Shell/Python/Go 语言开发者优先;

6. 熟悉 Hadoop 生态,有分布式系统开发经验者优先;

7. 做事积极主动,责任心强,有快速学习能力。

这里有完全扁平的管理,这里有一群专注做事的伙伴,这里有开放的沟通文化,这里有轻松舒适的办公环境,这里有我们,这里欢迎你!

扫码二维码投递简历

✎✎✎

更多内容

▼ 点击“阅读原文”,查看更多岗位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值