跳至正文

Cloudflare故障,又是BGP惹的祸

也难怪每次背锅的都是网工,真是哀其不幸,又怒其不争,BGP协议估计要改名叫不敢碰协议了…

至于故障的原因么,老外的故障报告一般都会说,我们做这个变更有ticket,有dry-run,并且有roll-out的流程,同时还进行了大量的peer review. 流程都对,但是结果错了?那么就不得不去更深层次的挖这个原因了。所以这也是渣为什么要搞Nimble Network和Ruta来设计基于声明式的策略控制平面,具体可以参考几年前的文章:

意图网络的语言学思考

而这也是2018年设计Nimble Network的两大关键业务属性 Declarative Programming和Declarative Assurance,然后基于Declarative的策略引擎在全局完成K-V一致性后,由本地的pattern matching engine来处理,这也是后面衍生出Ruta的原因。

其实原因很简单,这些生产系统是没法写测试范例的,很多时候需要FP来做一些形式化的定义,但做网络的人对于计算机体系结构的理解常年停留在基于命令式的语法上,即便有SDN,本质上也就是对命令式执行的网络设备外面包个Yang的壳而已,所以对于技术路线的选择上,就像夏老师以前讲的,一个架构师肯定是探索了很多种可能性都到了边界后,才会取舍的。

例如昨天杨总提到 

答案很简单:CIPU 随路异构计算 = 近网络计算 + 近存储计算 

再回过头来看看NetDAM论文的Abstract

Cloudflare故障,又是BGP惹的祸

本质上两者是殊途同归的,只是顺带解决了夏老师提的5.5us和FPGA成本高的问题,P4为什么也解决不了,为什么要一套新的ISA,本质上是一个数学问题

> 向上,点亮未来:DPU的若干代数问题

而Cloudflare的故障也算是一个代数问题,某种意义上就是执行策略语句是否满足一个阿贝尔群的问题。顺便吐个槽,任老爷子重视数学可惜下面有些人把数学当成了黄金屋和颜如玉,以简单的事情弄复杂为荣,以复杂的事情搞简单为耻,没事瞎折腾…


故障概述

官方的事故报告参见Cloudflare[1], 事故的原因是Cloudflare在业务繁忙时做流量工程的配置变更而导致的,总共影响了19个主要数据中心,故障时间从UTC 06:27 ~ UTC07:42持续了一个半小时.

Cloudflare故障,又是BGP惹的祸

背后的故障原因就是,它们在过去十八个月在Spine上增加了一个路由层,用于构建mesh连接来进行运维和处理故障隔离,但是特tmd搞笑的是把整个网络搞挂了,关键是挂了以后又tmd没有带外管理…

广告时间:赶紧问思科买点console server吧,上面还可以启动container跑堡垒机和做一些自动化的恢复…

表面上看是在更新BGP策略的时候,加一些BGP community属性

[edit policy-options policy-statement 4-COGENT-TRANSIT-OUT term ADV-SITELOCAL then]
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add TLL01;
+ community add EUROPE;
[edit policy-options policy-statement 4-PUBLIC-PEER-ANYCAST-OUT term ADV-SITELOCAL then]
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add TLL01;
+ community add EUROPE;
[edit policy-options policy-statement 6-COGENT-TRANSIT-OUT term ADV-SITELOCAL then]
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add TLL01;
+ community add EUROPE;
[edit policy-options policy-statement 6-PUBLIC-PEER-ANYCAST-OUT term ADV-SITELOCAL then]
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add TLL01;
+ community add EUROPE;

但是在Spine上的变更

[edit policy-options policy-statement AGGREGATES-OUT]
term 6-DISABLED_PREFIXES { ... }
! term 6-ADV-TRAFFIC-PREDICTOR { ... }
! term 4-ADV-TRAFFIC-PREDICTOR { ... }
! term ADV-FREE { ... }
! term ADV-PRO { ... }
! term ADV-BIZ { ... }
! term ADV-ENT { ... }
! term ADV-DNS { ... }
! term REJECT-THE-REST { ... }
! term 4-ADV-SITE-LOCALS { ... }
! term 6-ADV-SITE-LOCALS { ... }
[edit policy-options policy-statement AGGREGATES-OUT term 4-ADV-SITE-LOCALS then]
community delete NO-EXPORT { ... }
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add AMS07;
+ community add EUROPE;
[edit policy-options policy-statement AGGREGATES-OUT term 6-ADV-SITE-LOCALS then]
community delete NO-EXPORT { ... }
+ community add STATIC-ROUTE;
+ community add SITE-LOCAL-ROUTE;
+ community add AMS07;
+ community add EUROPE;

很有趣的是term REJECT-THE-REST { … }被排到了前面

!    term REJECT-THE-REST { ... }
! term 4-ADV-SITE-LOCALS { ... }
! term 6-ADV-SITE-LOCALS { ... }

顺便说一句,这原因估计要去问祝你怕了,是不是软件有bug啥的.当然还有一个梗就是HMC导致祝你怕Trio某代芯片的产品大规模EOL,想起当年思科做第三代QFP Procyon的时候选择DDR4就提过那个年代HMC各种问题…祝你怕其实是一个蛮值得尊敬的企业就是太技术化了,不大懂得和市场和解…

深层次的原因

因为基于命令式的策略很容易出现今天这种故障,这些东西测试例永远无法完全cover,而且通常还有网络本身的失效等原因导致整个策略执行的全局不一致的情况很容易出现。所以你看吧,国内最喜欢扯函数式编程的就是前端了,也是一个复杂的I/O不稳定的场景为了页面显示的一致性,使用React一类的框架以及NodeJS本身的一些异步执行的东西.这些都是业务场景决定了的.

可惜网工们只会XXIE,包括某司的一些Distinguish、Fellow也不太懂这一块,摊手…

敲黑板:基于声明式的路由协议才是未来,至于某云去跟某大学魔改BGP完全就是扯淡,不B敢G碰P协议会让你们把这口黑锅背到底的..

不跟你们网工玩了,等你们想清楚把Nimble和Ruta落地估计还有四五年,我先去研究¥PU去了~

Reference

[1]

Cloudflare outage on June 21, 2022: https://blog.cloudflare.com/cloudflare-outage-on-june-21-2022/


纳闻 | 真实新闻与历史:Cloudflare故障,又是BGP惹的祸