NadeshikoManju@薫る花は凛と咲く7月5日播出

统计数据

14
文章
0
粉丝
0
获赞
87
阅读
估计很多人在等我的技术复盘,那么聊聊 开宗明义,我们应该是目前 All in Cloudflare 公司中这次事故中恢复的最快的一批 Cloudflare 这次的事故其实应该分为两个 Part 来说,DNS 面和数据面。这次炸的实际上是数据面 早在10月20多号,Cloudflare 因为机房在维护而导致流量切换的时候,我们的跨洋访问线路就出现了问题。当时讨论后,我和同事达成一致,决定开始着手将我们的 DNS 和 CDN 分离开来,切换到不同的 vendor 上。 对我们来说 CDN 是 Cloudfront我们在某次冒烟的1h内完成了一条关键链路的迁移。实际上这为我们今天的处理奠定了一个良好的基础 而在本周一,我完成了我们核心域名 Cloudflare 上 DNS record 的 terraform 化。 所以回到事故本身,不同于 AWS 事故我们能做的会相对更少,而 Cloudflare 事故中,我们能尝试做的事情很多。所以我们按照预案,有 Plan A/B A. DNS 和 CDN 双切 B. 在 Cloudflare API 面恢复后仅切换 CDN 我们最后得出结论,选择 Plan B。当然我们也在 Route53 上做好了 Plan A 的准备 而之前准备的 Terraform 实际上在此时帮上了忙,在 Cloudflare API 恢复的第一时间,实际上 Dashboard 和 2FA 等 Auth 还是 failure 的状态。Terraform 帮助我们第一时间完成了切换。同时同事能帮我进行很严谨的 cross check。 分享一些能高效处理事故的 tips 吧 1. 及时拉会,我们事故处理会是一个全员 open 的会 2. 需要有人来承担一号位的职责,负责控场 3. 越忙越容易出错,所有变更一定要同步+cross check,我自己习惯是两次确认“同步:我将变更xx,内容为xxx,请xx帮我确认”,“确认执行,请xx协助验证” 4. 设置关键的时间点,并定时更新时间点。比如我们最开始切换 CDN 时间点定为 , 然后因为临时原因延后。而我们最开始对外恢复公告的时间点定为 UTC+8 ,然后结束前半小时我 reset timer ,定位 UTC+8 。明确的时间点能协助同事更明确知道我们当前在做什么,需要做什么,以及下一步做什么 说实话今晚再一次感受到了有一群很棒的同事是很爽的一件事。我们共同决策,执行指令,处理 corner case,制定接下来的 48h 的 action item,乃至考虑要不要升级数据库(不是(。 期间我有很多在我规划的预案中没有 cover 的部分,而每个同事都在帮助我查漏补缺,这无疑是非常爽的一件事。 如同我们结束了 5h 的全程 follow up 的事故复盘会后,CTO 发的全员感谢信一样“无论是在事先预案和技术实施文档上,还是在应急决策的果断和集体决策(快速信息补齐,临时分工合作,互相 review 找 bug),体现出来的专业性,技术能力,合作精神,都比之前上了不小的台阶” 是的,每个良好的团队,都会随着每一次事故而成长。 最后打个小广告,鄙司目前诚招前/后端/推荐算法/推理加速/infra 等方向的人,如果你想和我们一起成长,欢迎聊聊
简单复盘一下 AWS 这次事件作为一个 AIGC Startup SRE 的一些操作吧,希望能帮到大家 从入职开始发现我们主要的集群在 USE1 之后,我就开始做一些准备了。 我主要做的事情有这几件事 1. 将我们核心的几个数据库做了多地的备份,形成了 USE1,Tokyo,SG 三地备份。这样在极端情况下,我们损失一部分数据,但是也能保证服务的继续 2. 将我们 SG 的测试集群从原本的 EC2 自己简单搭的 K3S,重构为了一个标准的 AWS EKS 集群。这样可以在灾害时刻快速 warmup 一个集群,复用 AWS 已有组件。将 manifest 变更的代价降至最小 3. 简单梳理了一个 SOP,包含用户公告,DNS 切换,封版等事宜 回到今天,我大概在 AWS 事故发生后的10min,发现了我们容器中有新的 Pod 无法 setup。 在和 AWS 支持确认是 USE1 的问题后,我意识到 ECR 的事件必然关联其余事件,于是我就果断按照我自己规划的 Tier1 等级事件开始处理(对于 SRE 来说,这种事情宁可错,但是不能错过) T+0 min,我发布了全员公告,开始进入紧急模式。我 setup 了一个全员公开会议。所有人员可以随时加入 T+2 min,我确认事件如我所预期的一样,在逐渐扩大,我发出了两个指令,1. 全线禁止任何代码合入/提交(主要是避免新创建资源会导致 Pod rotate 进而影响流量),2. 请运营同学准备公告 T+3 min, 我开始按照 SOP,开始进行数据库在 SG 区域的恢复,并且级联创建诸如 OpenSearch / Redis 等在内的依赖 T+5 min,我们开始正式的确认上下游依赖的具体问题,确认一个新上线的核心服务受到影响 T+10min,我们停服公告和其余服务的受影响公告发出 T+10min,我请另外两位同时协助 setup 新的 ECR 以及清理测试环境已有资源,并同步 CTO ,在极端情况下,我们可能会存在保体验,丢数据的决策。 T+15min, 我们最终确认目前已创建的资源以及流量入方向不会受到太大影响。切换方案挂起,但是我们继续准备相关资源 T+30min,我们第一个数据库恢复完毕 T+40min,我们第二个数据库恢复完毕 T+1h,我们所有关联的核心 infra,RDS/ES/Redis 都 stand by,并且按照生产架构设置主从等优化选项。同时我们也开始正在新的集群启动新的服务 所幸,最终 AWS 的 crash 没有影响我们全部服务。我们无须面对切换流量后复杂的数据修复工作 大概 T+2h 到 T+3h 后,我正式通报全员,紧急状态解除。为保险起见,今晚依旧对 feature 封版。 回顾整个事故,我还可以做的更多 1. 将我之前为自己准备的极端 case SOP,对全员公开。这样确保我即便不在线,也有人能接替我 2. 我们可以做一些提前的预先演练 3. 指令下达可以更果断一些 差不多就是这样,一点分享,希望能帮到大家
深夜说一个最近的感想 其实也不算新,还是老生常谈的一个话题“做 infra 的人必须要去贴近业务,否则一切都是空中楼阁” 我介绍过很多次鄙司是 AIGC 头部玩家,主攻二次元赛道。 我们最近面临的一个问题是 Elasticsearch 带来的。 我们用户公开发布的 Artwork 和生成任务都是可以搜索的。 最近 Elasticsearch 频繁会出现部分 Data Node 被打满然后连锁搜索出现问题的情况。 那么我们需要去怎么样快速的解这个问题? 在进一步讨论之前我们需要思考在这个场景下,搜索这个操作的本质是什么? 我的看法是资产管理。在 AIGC 场景下,Prompt 毫无疑问是用户的核心资产,而对应的 Task 以及 Artwork 某种意义上算是资产的预览(or 属性) 那么有了这样一个推论后,我们便能清晰的知道,至少在目前的形态下,业务核心属性必然不能为了技术结果让步。 同时我们又有一个观察,我们用户公开发布的 Artwork 其的可见性和 Task 是不太一样的,Artwork 可公开检索,也会承担 SEO 的责任,而 Task 实际上仅用户可见。那么换句话讲,两者的数据的访问频率,资源需求都是不太一样的。 换句话说,我们对 ES 的 Index 存在了多租的需求。但是很遗憾,按照目前的 ES 的设计,是不具备多租的能力的。 虽然长远来说,优化查询会是一个必然的选项,但是在当下面对超高速发展的业务,拆分 Index 为不同的集群,按照 Index 不同的属性给不同的算力/磁盘,快速试错会成为我们的首选。 目前这项工作正在进行中,效果未知,但是整个思考博弈的过程其实是我前几年会很少考虑的。很多时候技术的最优解未必是业务的最优解。 最后的最后,再打一个广告。鄙司招人,ML Engineer,ML Data/Full Stack/Backend/Marketing 等职位虚位以待。如果你想一起做一些有趣的事情,欢迎 DM,帮你老板直达