降级预案在同程艺龙的工程实践

2020-02-23 169浏览

  • 1. 降级预案在同程艺⻰龙的⼯工程实践 演讲者 / 王俊翔 同程艺龙
  • 2. ⾃自我介绍
  • 3. 搜索故障 缺乏熔断设计 微信⼩小程序 ⼤大量量请求超时 API⽹网关 搜索引擎 统⼀一资源⽹网关 ⼤大量量超时 资源1 资源2 资源3 资源4 ……
  • 4. 交易易故障 缺乏降级设计 第三⽅方⽀支付 ⽀支付时限任务 ⽀支付回写 ⽀支付中⼼心 ⽀支付通知 交易易中台 ⽀支付超时 消息队列列 订单取消 出票处理理 队列列故障 已⽀支付订单被取消
  • 5. 稳定性之路路到底有多远 如何设计⾯面向容错的系统,如何提升系统的可⽤用性
  • 6. 强弱依赖 什什么是强弱依赖,如何确定强弱依赖 • ⽤用户是否强烈烈感知 • 核⼼心业务是否有损 serviceA 熔断、限流 ⽤用户请求 service 弱依赖 serviceB 强依赖 降级 serviceC- degrade 备选服务 serviceC 强依赖 • 弱依赖 - 熔断限流,有损服务 • 强依赖 - 备选服务,降级实现
  • 7. 业界解决⽅方案 - HYSTRIX Netflix开源的一款容错框架,支持多种降级熔断技术 资源隔离 断路路器器 降级操作 请求缓存 请求合并
  • 8. 实践过程中遇到的问题 • 业务改造成本⾼高,代码耦合,维护成本增⾼高 • 固化策略略,需线下修改代码,测试,发布,线上应急策略略响应不不 友好 • ⽆无法⽀支撑多系统的复合指标计算,业务降级⽀支持不不友好 • ⼤大量量应⽤用各⾃自实现降级熔断,代码散落在各应⽤用,没有统⼀一的管 理理和治理理。久⽽而久之,⽆无⼈人知道系统内有多少降级点,降级是如 何实现的 • 缺乏UI、没有灵活的参数、策略略配置,没有预案制定管理理能⼒力力
  • 9. 业务保障平台建设之路路
  • 10. 业务保障平台建设之路路 服务管理理 • 降级服务统⼀一注册管理理,通过降 策略略管理理 • 降级策略略集中管理理,通过参数 预案制定 线上演练 • 依据服务重要程度,从全局制定 • 发现潜在故障,多维度验证预案 级服务质量量数据从整体反映各应 化、配置化、脚本化⽅方式实现线 分级预案,对降级点进⾏行行预案编 有效性,评估系统可靠性,提供 ⽤用的降级点和可⽤用性保障措施 上策略略的灵活调整 排,并跟踪监控降级链路路的执⾏行行 降级策略略、参数调整的优化依据
  • 11. 整体架构 数据采集、计算、存储 KAFKA ⽇日志数据 脚本引擎 ETL 熔断降级计算(Flink) ⽇日志中⼼心 熔断降级接⼊入 应⽤用JVM进程 Attach Application Application Application SDK 故障动态注⼊入 Agent 熔断 流控 降级 隔离 降级⽇日志(ES) 查 询 服 务 业务异常数据快照(ES) 熔断降级通知 数据采集 故障注⼊入 指标(Redis) 指标明细(ES) 指标计算(Flink) 指标(HBase) Application Application Application SDK Application Application Application SDK 服务降级注册 降级熔断通知 实时策略略推送 降级控制中⼼心 TurboMQ 熔断降级监听 ETCD ETCD ETCD ETCD 服务注册监听 控制 中⼼心 元数据 元数据存储 降级服务管理理 故障代码注⼊入 业务保障管理理后台 应⽤用管理理 策略略管理理 流控管理理 指标管理理 预案管理理 脚本开发 故障演练 数据⼤大盘 ETCD管理理 监控告警 指标聚合查询
  • 12. 降级服务注册设计 • 使⽤用ETCD实现注册中⼼心 serviceA • 简单 - Go语⾔言编写部署维护简单,定义良好的API serviceB register proxy etcd watch center service metadata degrade strategy serviceC • 安全 - SSL认证机制 • 快速 - ⽀支持上万次写⼊入操作 • 可信 - Raft算法保证强⼀一致性,Proxy反向代理理模式⽀支持 mysql sharding • 服务数据存储 • 应⽤用、服务元数据、状态数据,etcd、mysql双份存储 admin • 后台实时监控应⽤用、服务,实时变更更降级策略略
  • 13. 服务质量量数据采集 通过本地⽇日志⽂文件,实时采集降级服务质量量数据 • 单⼯工直连数据通道 应⽤用数据采集 应⽤用数据 • ⻓长链接,数据流⽅方式实时发送 ⽅方法数据 执⾏行行结果 执⾏行行耗时 异常数据 JVM线程 JVM内存 GC数据 业务数据 SDK数据 ⾃自定义数据 数据采集 Proxy • 本地多队列列轮循,数据缓冲,合并异步发送 … ⽇日志 ⽂文件 数据通道(⻓长链接单通道) 采集 Agen t ⽇日志 采集 ⽂文件 Agen t 系统数据采集 容器器数据 CPU数据 内存数据 磁盘数据 ⽹网络数据 … 业务数据采集 ⽇日志中⼼心 KAFKA 数据处理理
  • 14. 指标如何计算处理理 数据平台 产品化 指标脚本开发 数据采集 开发 告警策略略 指标配置 指标查询 流处理理集群(Flink) KAFKA ⾃自定义指标 复合指标 系统指标 业务指标 指标脚本计算 指标规则计算 数据服务 落地存储 HBase 数据 Redis 存储 熔断 降级消息 降级 条件 计算 控制中⼼心 实时告警 ES ETL 规则配置 指标脚本 ⽇日志解析规则 规则表达式 降级处理理 降级服务 ETCD 开发 实时告警
  • 15. 复合指标计算如何处理理 指标池 AppA ServiceA ServiceB 指标1 指标2 指标1 指标2 指标3 指标N 指标3 指标N AppB ServiceD ServiceC 指标1 指标2 指标1 指标2 指标3 指标N 指标3 指标N 指标引⽤用 (AppA.ServiceA.指标1 - AppB.ServiceD.指标2) / AppB.ServiceC.指标1 表达式计算 MVEL 表达式引擎
  • 16. 降级服务管理理 • 降级服务管理理 • 应⽤用、服务、策略略产品化、数据化 • 应⽤用、服务指标实时监控,健康状态评估 • 实时监测服务降级执⾏行行状态,降级发⽣生点数据 快照及时回溯 • 降级策略略管理理 • 多种策略略⽅方案:失效备援、服务熔断、资源隔 离、延迟处理理 • 策略略灵活调整,实时监控策略略运⾏行行状态
  • 17. 降级代码管理理 • 线上代码开发、测试、发布 • 降级代码统⼀一管理理 • 脚本代码动态编译,对象管理理 业务保障平台应 降级⽅方法使⽤用 策略略配置 线下开发 降级代码 应⽤用 / 服务 SDK 线上开发 测试 发布 WEB IDE 脚本 线下代码管理理 Git
  • 18. 降级服务如何⾃自动探测恢复 指标计算 正常流程 • 降级保护期窗⼝口内,不不进⾏行行恢复试探 降级触发/恢复 未降级 恢复探测 • 流量量分配的⽅方式实施恢复探测,百分⽐比、总量量 探测流量量分配 ⽅方法调⽤用 ⽅方法代理理 降级 • 实时计算探测流量量指标,指标恢复关闭降级 已降级 关闭 百分⽐比策略略 探测 开启 总量量策略略 ⾃自定义策略略 开启 窗⼝口期 降级流程 降级⽅方法 熔断 窗⼝口期 保护期窗⼝口 (10min) 窗⼝口期外 窗⼝口期外 探测期窗⼝口 (5min)
  • 19. 降级预案 开发:不不清楚这样的业务 场景有哪些次要服务需要 降级 运营:明天要做活动, 希望降级不不重要的服务 运营 开发 • 预案分级 从全局建⽴立服务重要程度评估模型 • 蓝⾊色预警 - ⼩小规模⾮非核⼼心服务降级 • ⻩黄⾊色预警 - ⼤大规模⾮非核⼼心服务降级 • 红⾊色预警 - 所有⾮非核⼼心服务降级 • 预案编排 • 根据链路路关系、同等级优先级进⾏行行预案编排, 形成降级执⾏行行链路路 • 线上实时预案测试、演练,演练数据回溯
  • 20. 业务不不断迭代,持续引⼊入新依赖,系统是否稳定可靠? 预案是否依然持续有效? 如何才能持续保障系统的⾼高可⽤用性?
  • 21. 故障演练 常态化的故障演练对系统进⾏行行反复验证 • 对预案进⾏行行有效性、合理理性验证 • 通过破坏性测试,发现系统的潜在故障,及时修正,并做好降级预防措施 • 参数修正,及时调整流控、降级策略略,优化告警、超时参数设置 • 模拟线上故障,进⾏行行故障复现,验证故障后续的处理理措施是否⾏行行之有效 • 以战养兵,历练团队,让⼯工程师有更更多机会积累经验,提升应对故障的能⼒力力
  • 22. 系统设计 Application JVM 故障画像 Attach Method Event Core • 应⽤用故障:模拟应⽤用进程内故障 • 中间件故障:通过中间件客户端,模拟中间件故障 • 系统故障:通过⼯工具、脚本模拟⽹网络丢包、延时,磁盘不不⾜足故障 Latency Model Agent Exception Model • 延时模型、超时模型、异常模型、⾃自定义代码模型 • 基于模型实现应⽤用故障、中间件故障模拟,实时对应⽤用程序进⾏行行 字节码插桩、拆桩 简洁易易操作后台 • 可视化UI,参数、配置下发,快速实现故障注⼊入 MQ Module Module Timeout Model 故障抽象,提炼统⼀一模型 Servlet Agent Custom Code Listener Model DSF Redis Module Module MySQL Burn Module CPU ASM / Instrumentation Agent 控制指令、参数下发、故障注⼊入 • 丰富的故障模块管理理功能 故障演练 管理理后台 MGT API Jetty
  • 23. 故障注⼊入流程 1. 发送Agent启动指令 Agent Listener 故障演练 管理理后台 Agent 2. Attach⽬目标JVM进程 6. Redis超时模拟 Redis vm.attach(pid) 3. 加载Agent vm.loadAgent(agent) 应⽤用程序 6. MySQL延时模拟 MySQL 核⼼心模块初始化 4. 参数下发、故障注⼊入、控制指令 Http通信 5. ⽬目标⽅方法字节码增强 Core.jar Jetty Instrumentation & ASM 6. 服务异常模拟 ⼆二⽅方服务
  • 24. ⼩小结 • 从⽤用户感知、核⼼心业务影响⽅方⾯面,判断系统链路路中的强弱依赖 • 通过对服务统⼀一管理理,从全局刻画系统链路路熔断降级点,结合策略略和预案,通过持续不不断的治 理理保障系统的可⽤用性 • 通过反复的故障演练,发现系统中的薄弱点,并进⾏行行有效的预防 • 配合降级预案,让系统的可靠性更更易易验证,让演练更更加常态化 • 历练团队、积累经验,促进⼯工程师的进步,提⾼高应对故障的能⼒力力
  • 25. ⾃自我介绍
  • 26.