AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

为技术系统打“疫苗”,爱奇艺攻防演练平台的探索实践

  • 2021-07-15
  • 本文字数:2740 字

    阅读完需:约 9 分钟

为技术系统打“疫苗”,爱奇艺攻防演练平台的探索实践

在程序员的江湖里,流传着一些经典的老梗:

编程第一法则:如果代码莫名运行成功了,那就别动了~

架构第一法则:稳定运行多年的老系统,千万不要碰~

图片来自网络


初入行的程序员们接受前辈的洗礼,将如上的法则深深印入脑海,并广泛应用于日后的职业生涯中。

对于正在运行中的线上生产环境,不仅不敢乱碰,恨不得烧香供奉起来。


然而,技术系统的脆弱性来源是多方面的,不仅包含硬件的故障代码的 Bug,还有架构和逻辑的漏洞线上流量的各种突发性与不确定性等等。随着各个技术系统向云原生架构的迁移,架构中引入的依赖和不确定性也越来越多。


如何在日益复杂的技术架构下,实现系统的反脆弱,成为了一个程序员向架构师提升之路上的必修课。

2010 年,NetFlix 的工程师提出了混沌工程的概念,通过对线上生产系统主动注入故障,来验证系统在各种故障场景下的响应行为,提前识别并修复系统隐患。


它就像“疫苗”一样,故意将有害物质注入体内以防止未来疾病。对于复杂的技术系统,工程师们同样可以通过注入有限可控的故障,提前发现系统的弱点并进行修复,从而规避可能产生严重后果的大型故障。

混沌工程的引入,既是一个技术上的革新,也是一个观念上的突破。它抛弃行业前辈们过去死守的“线上系统千万不能碰”的老旧维稳观念,提出了“以攻代守”的稳定性建设的新思路,开启了在生产环境做攻防演练的新时代。

混沌工程在爱奇艺的发展

爱奇艺的攻防演练工作,最早是由各个业务自行组织开展的。如金融支付团队,因其业务特点对稳定性要求极高,很早就开展混沌工程相关工作。详见之前的文章《攻防大战的背后》


在这个阶段,各个团队攻防演练使用的方法和工具都比较分散多样,没有形成一个统一的平台和工具标准。


在 2020 年初的疫情流量高峰期间,爱奇艺发生了一次播放失败故障。


在复盘后总结发现,这个大型故障其实是由一个小的网络抖动和代码 bug 引发的雪崩。这样的小问题平时隐藏在复杂的技术架构中很难被一般的测试发现,然而庞大的系统却因为这一个小的异常,触发巨大的连锁反应。


自此,爱奇艺的技术团队开始大规模地在重点服务的生产环境里,推动落地常态化,标准化的攻防演练工作,同时建设了公司级的攻防演练平台小鹿乱撞平台,用于支持各业务攻防演练的相关需求,提升攻防演练的安全性和执行效率。


截止到 2021 年 Q2,爱奇艺内部已有 20+重点业务通过小鹿乱撞平台进行攻防演练,平均每个重点服务的线上环境都经历了 3 到 4 轮的真实故障攻击演练。

小鹿乱撞平台的使用介绍

小鹿乱撞平台在爱奇艺承担着两个角色


(1)业务自测:各业务系统的 Owner 可以通过小鹿乱撞平台,对自己系统的生产或测试环境进行故障自测,检验自己在服务中预设的各类高可用保障措施(报警/降级/熔断/灾备切流等)是否生效。

(2)红蓝攻防:由公司成立的独立的架构评估团队,从第三方视角,用随机化的攻击实验,验证重点业务系统的高可用水平,对关键服务进行第三方检验保障。


小鹿乱撞平台模块图


小鹿乱撞平台参考了公有云攻防演练优秀产品的设计,用户可以通过如下简单步骤来进行攻防配置

1.选择攻击对象

2.配置攻击方式

3.编排演练方案

按照上面编排好的演练方案,提交审批之后就可以执行了。

4.演练观测

小鹿乱撞平台除了配置和编排演练方案之外,还打通了公司内部各个资源管理和监控观测系统,解决攻防演练中的权限,流程,可观测性等问题,为用户输出简洁有效的故障演练报告。


攻防演练进行中的观测:监控和告警

重点业务攻防演练案例介绍

案例一:视频播放服务 Couchbase 缓存故障演练

1.演练背景

在上文提到的播放故障里,其中一个原因是由于网络抖动导致播放服务访问 Couchbase 的 SDK 连接使用异常,引发后续的连锁反应。


在故障后,播放服务的同学对架构中的依赖进行了一系列的熔断加固,当服务访问 Couchbase 依赖超时会触发自动熔断,服务请求改成访问备用 KV 数据库,并通过攻防演练重放网络故障验证熔断加固的效果。


2.演练过程

在攻防演练中,我们选择攻击的方式是注入点对点网络故障,使视频播放服务所在的服务器与 Couchbase 集群之间增加 1000ms 延迟,模拟网络故障造成业务访问 Couchbase 超时。

3.演练效果

顺利触发熔断,Couchbase 访问超时后,业务请求立即切换到 HiKV。


案例二:会员服务 Redis 分布式锁攻防演练

1.演练背景

爱奇艺会员服务团队统一切换到新的 Redis 分布式锁,并通过攻防演练检验新的分布式锁在各种故障极端场景下的可靠性。


2.演练过程

对 Redis 分布式锁进行三种不同故障攻击,分别检验分布式锁在这三类不同攻击下的效果表现:

(1)场景 1:业务服务和 Redis 之间的网络断开,5 分钟后恢复

(2)场景 2:Redis 主库故障,触发主从切换到 Redis 从库

(3)场景 3:Redis 主库故障,不进行主从切换,经过 5 分钟后,重启 Redis 服务


3.演练效果

验证了 Redis 分布式锁在这三种极端场景下的业务影响,确定了业务侧在分布式锁故障期间的等待/重试等机制。根据 Redis 故障期间的分布式锁请求响应状况,指导业务调用方按照各自业务场景设置合理的等待间隔和重试配置等。

演练中常见的隐患和经验

回顾过去一年,在 20 多个业务线的生产环境里做攻防演练的经验,我们总结了一些具有普遍性或者较大危害性的问题,这里简单整理如下:

场景
常见隐患
数据库
客户端缓存了数据库地址,在数据库Failover主从切换后,客户端仍然在访问故障的主库。
异常数据
一些攻击依赖的场景下,会造成服务响应异常数据(如空JSON,非法格式的结果),并将错误数据返回给线上。各层健康检查和监控机制很少关注响应数据的格式正确性。
慢节点识别
在大集群(或者多容器)应用中,对少量节点注入攻击产生的少量慢节点,没有监控或者健康检查机制去发现。慢节点可以一直留在线上扛流量。
报警失效
报警长期失效,业务无感知。一些系统的关键报警是很久前设置的,在某次迭代/运维后报警已经失效了。缺乏对关键报警有效性的验证和测试。

总结

在爱奇艺,经过一年多的混沌工程文化布道和系统性的线上攻防实操,核心业务的一线技术 Leader 都已经具备了相当的攻防意识。作者这里总结了各业务优秀的架构师们的两个共同特点:

1.零信任

任何一个服务都不是孤立的,包括 DNS、负载均衡、网关、虚机/容器、数据库、中间件、存储、网络、Cache 等大量基础服务依赖,以及大量的外部接口依赖,即使每个单独的依赖都有 99.99%的可用性,几十项依赖叠乘在一起的可用性也是不高的。


优秀的架构师从不会抱着一种 “某某依赖是基础服务,我的架构里假设它 100%可用,出了故障我直接给它甩锅” 的想法来做技术服务,而是尽量假设任意一个环节都可能出问题,以此来设计自己系统的高可用方案。

2.探索欲

优秀的技术负责人,对自己的服务架构的可靠性做到心中有数,能够明确地对着架构图中的任意一个点回答,这里的异常能抵挡,那里的异常会让服务故障。如果有不确定的异常点,会主动通过攻防演练进行探索。测试/灰度等环境验证过的各类灾备/切流/熔断/降级机制,同样也敢去线上环境做攻击验证。


敢于对自己负责的线上服务进行真实攻击,是对未来云原生时代下架构师们的新要求,体现了技术 Leader 们的架构自信和技术自信。


自信源于对代码逻辑的深刻把握,对架构原理的理性思考,对业务责任的勇敢担当。


在未来云时代复杂的技术架构中,坚持这种技术自信,积极地参与到攻防演练的工作中,有利于加深架构理解,发现和修复服务隐患,为技术同学的能力成长开辟新前景,为公司业务的稳定发展保驾护航。


本文转载自:爱奇艺技术产品团队(ID:iQIYI-TP)

原文链接:为技术系统打“疫苗”,爱奇艺攻防演练平台的探索实践

2021-07-15 08:001804

评论 1 条评论

发布
用户头像
有多点细节介绍就好了
2021-08-10 09:22
回复
没有更多了
发现更多内容

Eureka可用性解读

赵镇

Eureka

Mtail导致Nginx报警延迟

BUG侦探

运维 监控 日志

闭关三月!啃透美团保姆级分布式进阶技术手册,终入美团定L8

Java 面试

从零开始学习3D可视化之摄像机投影方式

ThingJS数字孪生引擎

大前端 可视化 3D 数字孪生

一文读懂大数据实时计算

五分钟学大数据

实时计算 7月日更

架构实战营-模块八-作业

大可

全美第四大无线运营商 DISH 和亚马逊云科技开展战略合作

亚马逊云科技 (Amazon Web Services)

亚马逊云科技和 Verizon 利用专有 MEC 解决方案扩大 5G 合作

亚马逊云科技 (Amazon Web Services)

架构实战营模块8作业

eoeoeo

架构实战营

点通生活系统软件开发搭建

铂金10:能工巧匠-ThreadLocal如何为线程打造私有数据空间

MetaThoughts

Java 后端 多线程 并发

FIL币最新价格怎么样?FIL币最新消息是什么?

发布60分钟!霸榜Github的阿里面试参考指南,啃透涨薪10k

Java架构师迁哥

你见过最具有代表性的面试是什么样的?大三4面上岸腾讯(Java岗)

Java架构师迁哥

所有前端都要看的2D游戏化互动入门基础知识

蚂蚁集团移动开发平台 mPaaS

大前端

直击技术最前沿 | Amazon S3增加新的存档访问层

亚马逊云科技 (Amazon Web Services)

我用Vanilla JS重写了一遍项目,结果……

Faye

大前端 js 原生

CodeDay 北京站报名倒计时

蚂蚁集团移动开发平台 mPaaS

移动开发

理解Linux 终端、终端模拟器和伪终端

mazhen

Linux Shell SSH Linux Kenel

hdfs 的集群间拷贝、归档、回收站等功能剖析

大数据技术指南

hdfs 7月日更

工商银行:应用多k8s集群管理及容灾实践

华为云开发者联盟

容器 多云 工商银行 k8s集群 Karmada

夏令营|第五届埃文网络安全技能训练营火热报名中

郑州埃文科技

程序员的自我修养-用科学的方法提高交付质量

刘绍

程序员 软件工程 软件质量 TDD 单元测试

阿里P7大牛手把手教你!卧薪尝胆70天内推入职阿里

欢喜学安卓

android 程序员 面试 移动开发

阿里新出炉爆款的顶配版Spring Security笔记,肝完变秃也变强

Java spring 编程 架构

喜马拉雅亿级用户量的离线消息推送系统架构设计实践

JackJiang

消息推送 即时通讯 IM push

阿里P7亲自讲解!Android大厂面试真题解析大全

欢喜学安卓

android 程序员 面试 移动开发

经过一年的不懈努力社招进了阿里,我总结了50个Java面试必考题

Java 程序员 架构 面试

鸿蒙轻内核源码分析:掌握信号量使用差异

华为云开发者联盟

鸿蒙 数据结构 信号量 结构体 OpenHarmony

阿里P9看了都说牛B!阿里巴巴史上最牛的分布式核心原理深度解析全彩手册

Java架构追梦

Java 阿里巴巴 架构 面试 分布式核心原理解析

高并发应对策略系列文章阶段汇总,提供离线文档下载

Coder的技术之路

为技术系统打“疫苗”,爱奇艺攻防演练平台的探索实践_架构_爱奇艺技术产品团队_InfoQ精选文章