Monzo 是英国的一家仅提供移动端服务的数字银行。近日,该银行的活期账户支付和预付信用卡系统出现了服务中断。Monzo 工程部门负责人 Oliver Beattie 交由 Monzo 社区论坛来提供服务中断的事后分析。
在最初架构设计的时候,Monzo 就将在全球范围内提供服务作为核心前提之一。久而久之,这使得他们开发了数以百计的微服务。
这些微服务被打包进 Docker 容器,使用 Kubernetes 部署到 AWS 上。服务的编排是由 etcd 完成的,kubernetes 就是用它来识别服务的部署位置以及每个服务的状态。服务间的路由和负载均衡是使用 linkerd 实现的。
服务中断既影响了预付信用卡,又影响了活期账户持有者。造成此次服务中断的原因有多个。
首先,Kubernetes 的一个 Bug 会导致请求在集群重新配置后超时。在服务实际中断导致这些超时出现之前一周,他们进行了集群重新配置,使 linkerd 接收不到 Kubernetes 的更新。
再者,当服务中断发生时,他们的一个直接反应是重启所有的 linkerd 实例,这暴露出了一个问题,Monzo 使用的 Kubernetes 和 linkerd 版本不兼容,情况变得更加糟糕,从服务中断变成了整个平台的故障。Monzo 社区论坛的相关主题里也列出了事件的完整时间表。
从这样一次服务中断里可以汲取一些有价值的教训。除了修复Bug、检查不同库的版本兼容性及其他问题外,Monzo 认识到了改进内部或外部通信中断的处理措施的必要性。
此外,另一个教训是认识到了报警、控制面板、对应用程序的每一层进行健康检查从而及早发现人为错误及其他错误的重要性。总而言之,重要的是,以后要采取一切措施防止服务中断,既能解决问题,又能就正在发生的事清晰地沟通,这样,将来就可以构建起更好的保障措施。
查看英文原文: Monzo Outage Post Mortem
评论