Skip to main content

那些年,云厂商宕机教会我们的事

北京时间 6 月 27 日下午,阿里云挂了。市场占有率 47.6% 的阿里云宕机,影响的是中国互联网的半壁江山。对此,坊间传闻伴着吐槽声起伏不断,甚至有人声称此次事故是由两个实习生造成:
事件发生后,阿里云的态度非常诚恳,在迅速人肉修复故障后,发表说明:
“对于这次故障,没有借口,我们不能也不该出现这样的失误!我们将认真复盘改进自动化运维技术和发布验证流程,敬畏每一行代码,敬畏每一份托付。”
云厂商宕机故障,这些年一直不是什么新闻。
2017 年 2 月 28 日,云计算巨头 AWS S3 故障,事件的起因是 AWS S3(云存储)团队在进行调试时输入了一条错误指令,本应该将少部分的 S3 计费流程服务器移除,可是最终意外移除了大量服务器。被错误移除的服务其中运行着两套 S3 的子系统,从而导致 S3 不能正常工作,S3 API 处于不可用状态。
由于 S3 负责存储文件,为 AWS 体系中的核心组成部分,这导致北弗吉尼亚日(美国东一)服务区中,依赖于 S3 存储服务的其他 AWS 的 S3 控制台、Amazon 弹性计算云(简称 EC2)新实例启动、Amazon 弹性块存储(简称 EBS)分卷(限于需要读取 S3 快照的数据)以及 AWS Lambda 均受到影响。
2017 年 3 月 22 日,微软云服务又一次宕机了。Outlook、 Hotmail、 OneDrive、 Skype 和 Xbox Live 都出现了网络故障,全球用户都无法登录。英国海岸和美国海岸城市的 Outlook 邮箱系统的用户受到的影响特别严重,同样悲惨的还有西欧与美国海岸线的美国 OneDrive 用户,西欧和巴西的 Skype 用户,及 Xbox 的英国、美国、西欧用户。Azure 用户的一天也不好过,一大批工程师无法登录系统。这不是微软最近第一次出现这种问题,上次是 3 月 7 日。
2015 年 6 月 6 日,QingCloud 广东 1 区全部硬件设备因遭遇雷暴天气引发电力故障,造成 QingCloud 官网及控制台短时无法访问、部署于 GD1 的用户业务暂时不可用。在业务恢复后,青云方面披露了合作运营商针对事故的调查原因:
  1. 直击雷导致电力系统出现瞬时浪涌,UPS 启动自我保护,从而释放电流导致瞬间断电;
  2. 虽然机房配备了四级防雷,但主要是防止感应雷,对于此次直击雷,机房完全没有招架之力。
2014 年 11 月 2 日,腾讯云服务器出现了六分钟的访问故障。腾讯云平台部方面表示,此次访问故障主要是上海和广州机房的服务器出现故障,机房网络出口抖动造成的,而网络抖动是源于运营商网络信道阻塞,导致用户连接服务器出现丢包等现象。“这是网络上游的问题,并非机房本身硬件故障,所以无法避免该情况的发生。”云平台部方面负责人如是说。
纵观以上云厂商宕机案例,有的是天灾(机房被雷劈了),有的是人祸(误删除操作),但可以肯定的是:宕机这事儿,预计在很长的一段时间里都无法避免。那么对于吃瓜群众们来说,看完热闹了,要看会什么门道呢?
以 AWS S3 故障为例。InfoQ 整合了三位技术专家陈皓、陈天、Nick Kephart 给出的思考整理如下:
要注意Error Handling
当问题出现时,一个普通的 S3 GET 返回什么:
所以AWS 告诉你Internal Error 了。
从 error handling 的角度,陈天认为在写代码的时候都应该捕捉这个异常,然后做合适的错误处理。很遗憾的是,S3 这样的服务是如此基础,就像互联网的水和电一样,大家默认为它永远不会出错。因此,好多工程师干脆不做错误处理。
除了代码编写层面的处理,当云服务商的宕机发生时,尽量控制它影响面。像 Trello连 landing page 都一并挂掉实在不可取,因为起码 S3 影响不到的页面,如 landing page,用户注册 / 登录页面,应该还保持正常服务;而像 Quora的服务,其实是可以准备一个静态化的镜像,一旦出问题,起码让读者可以无障碍地阅读。
尽可能地把动态内容缓存起来,甚至静态化
Redis cache、Nginx cache、HAProxy、CDN 都是把内容缓存甚至静态化的一些手段。陈天认为:尽管多级缓存维护起来是个麻烦,但当底层服务出现问题时,它们就是难得的战略缓冲区。cache 为你争取到的半个小时到几个小时几乎是续命的灵芝,它能帮你撑过最艰难的时刻(这次 S3 宕机前后大概 4 小时,最严重的时候是 11点到1点),相对从容地寻找解决方案,紧急发布新的页面,或者迁移服务,把损失降到最低。否则,只能像这次事件中的诸多公司一样,听天由命,双手合十祈祷 AWS 的工程师给力些解决问题。
云用户应检查核心依赖关系,提升关键性服务的冗余水平
S3是多种Amazon服务的核心组成部分之一。无论是利用其进行简单文件存储、对象存储抑或是用于存储网站或者应用程序中的内容,其间复杂的依赖性都必须会引发级联效应。S3能影响到的组件包括用户会话管理、媒体存储、内容存储、用户数据、第三方对象和自动化机制等。
在Thousandeyes公司的Nick Kephart看来,云用户应检查核心依赖关系,提升关键性服务的冗余水平。AWS的系统在构建当中具备冗余特性,能够实现跨数据中心自动复制存储对象与文件。而作为另一种冗余层,云用户需要利用额外AWS服务区或者其它云服务供应商以彻底避免此类事故;不过这会增加大量管理复杂性与成本支出,因为跨环境间的数据同步工作需要由云用户负责打理。大多数企业并没有选择上述选项,可是单纯的数据备份在数小时的短周期内并不能发挥作用。
虽然面向云环境的迁移确实能够在稳定性与弹性方面为企业带来巨大帮助,但是各种不易被发现的依赖性也因此增加,单一服务失败可能引发大规模服务瘫痪。Nick建议云用户的开发与运营团队审查与云服务供应商间的核心依赖关系,制定策略以监控各项服务可能受到的影响,同时调整现有架构以提升关键性用户的冗余水平。
故障演习很重要
对于这次事件,陈皓在其博客中表示美国东一区作为老牌的服务区拥有海量对象,能在数小时恢复已属不易,并且幸运的是没有丢失重要数据。
陈皓重申了其观点:一个系统的高可用的因素很多,不仅仅只是系统架构,更重要的是——高可用运维。并且,他认为对于高可用的运维,平时的故障演习是很重要的。AWS 平时应该没有相应的故障演习,所以导致要么长期不出故障,一出就出个大的让你措手不及。比如,Facebook每个季度扔个骰子,随机关掉一个IDC一天。Netflix 有 Chaos Monkey,路透每年也会做一次大规模的故障演练——灾难演习。
在陈天看来,这种容错的操练适合大一些且工程团队有余力的公司。为什么Netflix 重度使用 AWS,却在历次 AWS 的宕机中毫发无损?其实Netflix之前也深深地被云的「不稳定性」刺痛过,而如今他们的 Chaos Monkey(之后发展为 simian army)服务,会随时随地模拟各种宕机情况,扰乱生产环境。比如说对于此次事件的演练,可以配置 simian army 去扰乱 S3:simianarmy.chaos.fails3.enabled = true。
这样,这群讨厌的猴子就会在不知情的情况下随机把服务器的 /etc/hosts 改掉,让所有的 S3 API 不可用。如此就可以体验平时很难遇到的 S3 不可访问的场景,进而找到相应的对策(注意:请在 staging 环境下谨慎尝试)。
处理危机的方式能看出一个公司的高度
陈皓表示非常喜欢GitLab、AWS这样向大众公开其故障及处理流程,哪怕起因是一个低级的人为错误,也不会掩盖、不会文过饰非。
如果你是一个技术公司,你就会更多的相信技术而不是管理。相信技术会用技术来解决问题,相信管理,那就只会有制度、流程和价值观来解决问题。没有人愿意看到问题的发生;但是问题出现后,最重要的解决反思并从中汲取教训:这难道不是技术人应有的傲骨吗?
你觉得呢?


Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...