腾讯架构大佬万字精炼高可用架构设计要点
分享概要
前言:海恩法则和墨菲定律
一、可用性
二、高可用架构设计总体思想
三、代码架构高可用
四、容量评估和规划
五、高可用系统架构设计
六、高可用的数据层架构
七、服务运营
八、高质量的服务管理
九、能力和职责
前言:海恩法则和墨菲定律
事故的发生是量的积累的结果。 再好的技术、再完美的规章 , 在实际操作层面也无法取代人自身的素质和责任心 。
“薛定谔的猫”告诉我们,事物发展不是确定的,而是量子态的叠加。
任何事情都没有表面看起来那么简单 。 所有事情的发展都会比你预计的时间长 。 会出错的事总会出错。 如果你担心某种情况发生,那么它更有可能发生 。
世界会因一些微小因素的变动,而发生很大的变化。
“热力学第二定律”(熵增原理)告诉我们,世界总是在变得更加混乱无序。
标准化。 流程自助化。 可视化:可观测系统各项指标、包括全链路跟踪。 自动化:ci/cd 自动化部署。 精细化:监控平台、数据分析精细化。
一、可用性
| 类别 | 描述 | 权重 |
| 高危S级事故故障 | 一旦出现故障,可能会导致服务整体不可用 | 100 |
| 严重A级故障 | 客户明显感知服务异常:错误的回答 | 20 |
| 中级B级故障 | 客户能够感知服务异常:响应比较慢 | 5 |
| 一般C级故障 | 服务出现短时间内抖动 | 1 |
| 类别 | 服务 | 可用性要求 | 描述 |
| 一级核心服务 | 核心产品或者服务 | 99.99%(全年53分钟不可用) | 系统引擎部分:一旦出现故障,整个系统瘫痪 |
| 二级重要服务 | 重要的产品功能 | 99.95%(全年260分钟不可用) | 类比汽车轮子:该服务出现问题,该重要功能不可用。 |
| 三级一般服务 | 一般功能 | 99.9%(全年8.8小时不可用) | 类比汽车倒车影像:该部分出现问题,稍微影响用户体验 |
| 四级工具服务 | 工具类是服务 | 0.99 | 非业务功能:比如爬虫、管理后台、运维工具 |
二、高可用架构设计总体思想
故障事前:故障预防,总结经验,做到有智慧的绕开问题。 故障发现:及时发现,通过完善观测平台及时发现问题吧。 故障恢复:快速恢复,做好应急预案降低故障影响。 故障总结:复盘总结故障问题,层层剖析问题产生的原因,由表及里分析问题发生的本质。
三、代码架构高可用
API 数据传输采用随机、不可预测、复杂的 Token 机制; 对 API 调用的数据、功能等实施严格访问控制,并严格设置白名单清单; 严格定义 API 输入数据类型,并校验、过滤所有传入数据; 对 API 的请求采用公开密码算法进行数字签名和校验; 加密 API 请求流量,可采用非对称加密算法逐个加密敏感信息字段,加密结果需做 Base64 编码等; 设置 API 请求频率限制策略。
代码逻辑 bug。 超时配置不合理。 新老版本功能兼容性问题。 代码缺陷引发 core 或者内存溢出。 代码安全漏洞:如 sql 注入等。 日志不规范导致无法快速定位问题,小问题演变故障。
四、容量评估和规划
五、高可用系统架构设计
接入层:主要流量入口,经过简单 应用层:直接对外提供产品功能,例如网站、API 接口等。应用层不包含复杂的业务逻辑,只做呈现和转换。 服务层:根据业务领域每个子域单独一个服务,分而治之。 数据层:数据库和 NoSQL,文件存储等。
dns 被劫持:域名是否使用 https。 黑客攻击:是否有弱密,服务器权限,数据库权限。 ddos 攻击:是否有必要使用高防 IP 接入流量。 CC 攻击:免费和收费版域名分开,网关是否有限流和防刷措施。
服务代码 bug。 服务引发 core/内存溢出。 依赖第三方服务不可用。 自身没有做好监控告警,不能及时发现问题。 上线变更操作导致故障。 流量过载导致服务不可用。 服务没有做好性能压测,无法应对流量高峰影响。
数据一致性问题。 数据误操作(如误删除)。 数据库损坏,如服务器磁盘损坏导致数据库不可用等。
服务器故障。 系统整体架构容量规划不合理,无法应对流量高峰影响。 缺少切流工具无法降低故障影响。
域名规范解析和规范化管理,应该制定《域名规范管理说明》,例如根据产品重要等级,制定使用高防 IP 的策略。 域名解析 DNS 防劫持:必须使用 https。 ddos 攻击:是否有必要使用高防 IP 接入流量。
可以水平扩展:通过接入层的负载均衡,实现故障自动转移。 无状态设计:无状态的系统更利于水平扩展,更利于做负载均衡。状态是系统的吞吐量、易用性、可用性、性能和可扩展性的大敌,要尽最大可能避免。 回滚设计 :确保系统可以向后兼容,如果应用服务上线后出现 bug,可以紧急回滚。 灰度发布:结合接入层设计 A/B 功能,实现灰度发布,比如按 ip,请求参数等分发流量。 幂等设计:系统中的多次操作,不管多少次,都应该产生一样的效果,或返回一样的效果。 调用设置超时:调用服务一旦超时,通信框架应该返回异常,调用方根据调度策略选择重试或者请求转移。 异步调用:调用不重要的服务同步变为异步。 降级处理:服务具备降级能力。 运行环境隔离:对于生成式大模型的远程代码执行设计原则:在独立且无敏感数据的环境中执行代码任务,同时限制资源,任务执行完成后将环境销毁。
服务内部出错、异常。 服务响应超时。 服务负载过高; 网络链路延迟或中断; 服务依赖链中部分依赖 SLA 不达标,造成整体服务不可用; 服务链条过长,造成 SLA 整体不可控;
服务分级治理:将服务分级管理,对于核心/重要的,使用更好硬件并隔离部署,避免连锁的故障响应。 服务隔离措施:依据服务重要性分级或流量特点、用户画像等,从物理上隔离服 务。将服务使用的资源(CPU、线程、IO 等)隔离,主要使用舱壁模式;比如核心服务单独部署,三级服务可以混合部署。 自我保护措施:快速失败(failfast)、限流、调用超时、熔断(Resilience4j); 失效转移机制:失效检测、失效重试、失效转移(failover)、失效恢复(failback); 服务降级措施:在流量高峰,服务可能由于大量的并发调用导致性能下降,最后引起服务不可用。为了保证网络和核心流程可用,需要服务降级。
同步变异步:低优先级服务调用同步变异步,比如日志存储等。 降级开关,拒绝部分服务:通过流量网关做相应的限流甚至直接拒绝服务。
各级服务的部署原则:核心服务:独立服务器且 N+1 部署。三级和四级服务可以共享服务器部署。 各级服务上线发布原则:核心和重要服务:晚上12点上线。,三级和四级随时可上线。 各级服务监控原则。
服务自身可用性:99.99%。 依赖数据资源服务可用性要求:(应用服务研发方自定义)。 依赖第三方服务可用性要求:(应用服务研发方自定义)。 需要部署的服务器数:N 台。
冗余 N+1 部署:故障自动转移到多部署一个节点,避免单点问题。 可监控:服务流量预警、端口存活、进程占用的资源、服务接口功能逻辑是否正常,应用 FGC 等情况。 可回滚、灰度:灰度部署服务,部署的服务出现问题可快速回滚。 可独立部署:可以直接在运维平台打包部署,而不需要依赖其他服务部署完成后才能部署运行。 可独立测试:可以单独测试。 水平扩展:流量激增可快速扩容。 异步设计:服务需要通知第三方服务,必须通过消息队列进行异步方式完成。 幂等设计:服务可以重复调用,不影响结果。
可容错:自身有容错和修复能力:
服务自身可用性:99.95%。 依赖数据资源服务可用性要求:(应用服务研发方自定义)。 依赖第三方服务可用性要求:(应用服务研发方自定义)。 需要部署的服务器数:N 台。
冗余 N+1 部署:故障自动转移到多部署一个节点,避免单点问题。 可监控:监控进程、端口存活、进程占用的资源,应用 FGC 等。 可回滚、灰度:灰度部署服务,部署的服务出现问题可快速回滚。 故障隔离:服务器只部署唯一该应用服务,该应用服务出现问题,只影响自身服务问题。 可独立部署:可以直接在运维平台打包部署,而不需要依赖其他服务部署完成后才能部署运行。 可独立测试:可以单独测试。 水平扩展:流量激增可快速扩容。 可容错:自身有容错和修复能力。
服务自身可用性:99.95%。 依赖数据资源服务可用性要求:(应用服务研发方自定义)。 依赖第三方服务可用性要求:(应用服务研发方自定义)。 需要部署的服务器数:N台。
冗余 N+1 部署:可以单点部署。
可监控:可监控服务进程、端口存活是否正常。
可回滚、灰度:灰度部署服务,部署的服务出现问题可快速回滚。
故障隔离:一个服务器上可以部署多个应用,但保证服务器资源充足。
可独立部署:需要独立部署。
可独立测试:可以单独测试。
水平扩展:流量激增可快速扩容。
可容错:需要具备一般的容错能力。
服务自身可用性:99.9%。 依赖数据资源服务可用性要求:(应用服务研发方自定义)。 依赖第三方服务可用性要求:(应用服务研发方自定义)。 需要部署的服务器数:N 台。
冗余 N+1 部署:可以单点部署,进程存活就可以。 可监控:不需要监控。 可回滚、灰度:只要部署成功就可以。 故障隔离:哪个服务器有资源就可以部署。 可独立部署:不用考虑。 可独立测试:不用考虑。 水平扩展:不用考虑。 可容错:不用考虑。
六、高可用的数据层架构
C 一致性(Consistency):说的是每一个更新成功后,分布式系统中的所有节点,都能读到最新的信息。即所有节点相当于访问同一份内容,这样的系统就被认为是强一致性的。 A 可用性(Availability):是每一个请求,都能得到响应。请求只需要在一定时间内返回即可,结果可以是成功或者失败,也不需要确保返回的是最新版本的信息。 P 分区容错性(Partition tolerance):是说在网络中断,消息丢失的情况下,系统照样能够工作。这里的网络分区是指由于某种原因,网络被分成若干个孤立的区域,而区域之间互不相通。
基本可用:分布式系统出现故障的时候,允许损失一部分可用性。比如,阿里双十一大促的时候,对一些非核心链路的功能进行降级处理。 柔性可用:允许系统存在中间状态,这个中间状态又不会影响系统整体可用性。比如,数据库读写分离,写库同步到读库(主库同步到从库)会有一个延时,这样实际是一种柔性状态。柔性事务和刚性事务对立,刚性事务也叫强一致性,比如 ACID 理论。 最终一致性:例如数据库主从复制,经过数据同步延时之后,最终数据能达到一致。
原子性:严格遵循。 一致性:事务完成后的一致性严格遵循,事务中的一致性可适当放宽。 隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽。 持久性:严格遵循。
两阶段型:就是分布式事务两阶段提交,对应技术上的 XA、JTA/JTS。这是分布式环境下事务处理的典型模式。 补偿型:TCC 型事务(Try/Confirm/Cancel)可以归为补偿型。服务器A 发起事务,服务 B 参与事务,服务 A 的事务如果执行顺利,那么事务 A 就先行提交,如果事务 B 也执行顺利,则事务 B 也提交,整个事务就算完成。但是如果事务 B 执行失败,事务 B 本身回滚,这时事务 A 已经被提交,所以需要执行一个补偿操作,将已经提交的事务 A 执行的操作作反操作,恢复到未执行前事务 A 的状态。这个需要服务 A 可以幂等操作。 异步确保型:将一些同步阻塞的事务操作变为异步的操作,避免对数据库事务的争用。 最大努力通知(多次尝试):交易的消息通知与失败重试(例如商户交易结果通知重试、补单重试)
七、服务运营
运营操作失误 缺乏应急机制。 缺乏故障处理机制。 缺乏故障演练,导致切流后引发更大故障。
金丝雀发布:在原有部署版本可用的情况下,同时部署新版本应用作为金丝雀。 滚动发布:一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。 蓝绿发布:蓝绿部署是不停老版本,部署新版本然后进行测试。确认 OK 后将流量切到新版本,然后老版本同时也升级到新版本。
备份:数据备份(热备,冷备(冗余),异地) 过载保护 同城多活-》异地多活 流量切换 重试,防雪崩(概率很小,成本很高)
网络流量监控 。 系统监控:服务器资源和网络相关监控(CPU、内存等) 。 日志监控:统一日志收集(各个服务)监控,跟踪(log2) 。 应用监控:端口存活、进程占用的资源,应用 FGC 等情况。 业务监控:服务接口功能逻辑是否正常。 立体监控:监控数据采集后,除了用作系统性能评估、集群规模伸缩性预测等, 最终目标是还可以根据实时监控数据进行风险预警,并对服务器进行失效转移,自动负载调整,最大化利用集群所有机器的资源。
八、高质量的服务管理
服务规范管理:CMDB 对项目、服务、服务器进行统一管理。 代码质量管理:通过 ci 工具流程快速检测代码规范和安全隐患。 自动化发布:发布不影响用户,完善发布流程,自动化发布,可以及时回滚 。 自动化测试:上线完成后进行全面自动化测试。 性能压测:通过对服务压测,了解服务可以承载并发能力,以致可以让运维通过预警进行服务器扩容 。 代码控制:测试环境使用测试分支,beta 环境发布 tag,线上使用该 tag 发布。 发布流程:规范上线发布流程。 灰度发布:灰度发布服务 。 应急处理机制 。 故障处理规范。
九、能力和职责