一行小错为何产生巨大破坏-Facebook史诗级故障大反思-阿里云开发者社区

开发者社区> 游客pq45jrzoavplw> 正文

一行小错为何产生巨大破坏-Facebook史诗级故障大反思

简介: 弱小从来不是生存的障碍,傲慢才是。10月4日FaceBook发生了一次史诗级中断事故,故障期间FaceBook所有旗下APP全面对外服务中断,而且故障的时间长达7个小时之久。根据Facebook最新的声明来看,故障的原因是由于工程师错误地发出了一条指令,切断了Facebook的数据中心“在全球范围内的所有网络连接”。
+关注继续查看

弱小从来不是生存的障碍,傲慢才是。10月4日FaceBook发生了一次史诗级中断事故,故障期间FaceBook所有旗下APP全面对外服务中断,而且故障的时间长达7个小时之久。根据Facebook最新的声明来看,故障的原因是由于工程师错误地发出了一条指令,切断了Facebook的数据中心“在全球范围内的所有网络连接”。

image.png

恰恰是这条简单的指令,造成的影响却是史诗级别的,本次宕机事故非常彻底,甚至Facebook自己的内网也完全报废,无法访问。笔者看到事件解决过程中不少运维方面的大牛都直接把故障的原因定位到了DNS和BGP方面。

从Cloudflare的博客中也能看到,问题的原因也确实出在了BGP指令方面,不过我们要问的是为什么这样一条小小的指令会造成如此之大的影响。
route-views>show ip bgp 185.89.218.0/23
% Network not in table
route-views>

上一次Facebook的全面中断事件还要追溯到7年的2014年6月当时Facebook在APP更新版本时出现了一些问题,随后就有一些用户开始无法登陆Facebook,不过Facebook方面很快就找到了问题所在并进行了修复,并在半小时之内就让服务100%恢复了正常。
image.png

这次史诗级故障也不是脆弱的BGP协议第一次出现问题,就在2020年1月23日,所有后缀为.net的域名也出现无法解析的情况,经DNS顶级根服务运营商ISC调查,发现.net域名缺失了关键的A记录和AAAA记录,所有.net后缀的互联网地址从ISC的F根服务器全部消失了,接下来美国宇航局(NASA)运营的E根服务器也遇到了类似的问题。
那次故障中ISC定位问题的时间也很快,在5分钟内就迅速将问题定位在他们与Cloudflare合作运营的节点上,后来Cloudflare很快查明原因是由于他们刚刚发布的变更代码所造成的问题。但最终问题的解决也花了近两个小时的时间,因为撤回导致该问题的BGP通告,出乎意料的长。

通过对比我们可以看到,本次Facebook的故障无论是从影响程度,还是故障时间上讲都堪称是负面教材的典型,而历史一再告诉我们,只要能从历史经验中总结一点教训就能避免悲剧的发生,因此复盘这次史诗级的故障,对于我们来说肯定也会是大有裨益。
BGP协议简介

BGP边界网关协议是EGP外部网关协议的一种, 顾名思义BGP处理外部网络区域的之间路由信息的协议,其主要功能是与其他网络自治区的BGP协议系统交换网络路由信息。我们看到EGP相对的IGP内部网关协议,拥有众多储如RIP、OSPF、IS-IS、IGRP、EIGRP的协议族实现不同。EGP家族当中几乎只有BGP这一根独苗是可用的,BGP几乎是唯一一个能够处理独立路由域间的多路连接的协议。
我们举个例子来说明一下这个BGP协议,比如互联网上有7个独立的网络自治区域AS (Autonomous System),他们分别是AS1-AS7,这7个AS之间相互的物理连接情况用橙色线段表示如下:
image.png

那么如果AS1区域内的设备想要与AS7区域内的设备产生连接,那么具体的路由路径应该选择AS1-AS4-AS5-AS6-AS7的蓝色路径,还是选择AS1-AS2-AS35-AS6-AS7的红色路径就是BGP协议要解决的核心问题,其实BGP之类的路由协议从宏观层面来看都有点像旅游规划,也就是可以把问题转化为从AS1到AS7的道路中哪条道路最快。BGP协议通过一系列的报文,Internet发布其前缀路由信息,并维护一个有限状态机,并以此来完成路由策略的收敛,但如果发布了错误的通告信息,那么就没有人能够知道如何连接这个错误区域了。当然本文不是要介绍BGP协议,这里各位读者对于BGP的有关概念性有所认识就可以了。
事件处理故障复盘
正如Facebook公告所说,事故的一开始,Facebook已经停他们DNS前缀路由的BGP通告也就是说Facebook的DNS无法访问,也就是说一条错误的指令让Facebook整体下线了。

route-views>show ip bgp 129.134.30.0/23
% Network not in table
route-views>

在故障期间通过dig、nslookup等命令解析Facebook的DNS域名全部返回SERVFAIL,而且正如我们上文介绍,如果发布了错误的BGP通告,那么没有人能够再从互联网上找到你,这和人工破坏了Facebook数据中心的连向互联网的光纤线路,从结果上看没有任何本质区别。
根据CloudFlare的博客显示,Facebook的故障差点把整个互联网搞崩,因为Facebook用户太多了,用户在无法正常登陆APP时会疯狂的发起重试,而且由于Facebook域名解析缓存已经在各级DNS服务器上全部失效了,这就给根DNS也就是1.1.1.1造成了巨大的压力。据说这使1.1.1.1的DNS解析查询的速度比平时高出30倍,所幸1.1.1.1顶住了压力,Facebook故障期间绝大多数的DNS解析请求的返回速度都稳定在10毫秒左右,否则一旦根DNS也崩溃那么后果将不堪设想。
最终在7个小时之后,Facebook终端重新向互联网通告了他们的路由,至此服务才最终恢复。
通过本次事件我们能学到了什么
笔者相信以Facebook那些大牛人物的实力,从发现故障到定位故障原因的时间不会超过1分钟,甚至很有可能在刚刚指行完那条错误的BGP通告命令之后就发现问题了,但是故障依旧持续了长达7个小时。再结合Facebook内网全部中断的细节,那么我们可以推出隐藏在这背后的重要结论,那就是相关的错误命令把Facebook的VPN通道也全部影响了,我们知道Facebook目前在疫情的影响下,美国区的员工还处在远程办公的状态,也就是说在错误指令生效之后,远程运维工程师自身的VPN以及逃生通道也全部失效了,而数据中心现场值班的人员可能只会加电、重启等简单操作,甚至不排除现场人员连登陆到核心网络设备的权限都没有,一切都得指望远程运维的人员到现场解决了。
假设自己不出现低级失误,才是最大的低级错误:从上述分析中我们可以看出,Facebook的网络工程师对于自身的能力太过自信了,以至于他们可能就没有认真分析过回退方案的可行性,而故障发生之后才发现网络设备已经无法通过远程方式登陆了,回退方案执行的前提已经崩溃。因此在发布任何版本之前都要根据其造成的最大负面影响制订预案,假定自身不会出现低级失误的想法是绝对错误的。
逃生通道是最后生命线,必须严格保持独立:从故障的时间上看,远程登陆的逃生通道也一定是受到了影响,从这里我们能吸取到的教训就是一定要在平时做好逃生通道的可用性验证,并且要尽量保证逃生通道的独立性,不能把逃生和日常运营的通道混为一谈。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6935 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4503 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7768 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5466 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9435 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2147 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16851 0
27
文章
0
问答
来源圈子
更多
阿里云最有价值专家,简称 MVP(Most Valuable Professional),是专注于帮助他人充分了解和使用阿里云技术的意见领袖阿里云 MVP 奖项为我们提供了这样一个机会,向杰出的意见领袖表示感谢,更希望通过 MVP 将开发者的声音反映到我们的技术路线图上。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载