弹性工程 - 构建弹性系统
Embrace failure,Manage it instead of prevent it!
背景
弹性工程三问:稳定性领域思考七问?-A good thinking framework for availability?
1、弹性工程是什么?
2、弹性工程从哪来?
3、弹性工程到哪去?
概念
Availability:系统的可用性,对外是否可用
Reliability:系统的可靠性,稳定运行的能力。
Resilience:Resilience is all about being able to overcome the unexpected. Sustainability is about survival. The goal of resilience is to thrive. ― Jamais Cascio 。
三者的关系
系统的可用性公式为Availability = MTTF / (MTTF + MTTR),可以看出一个系统的可用性主要受MTTF和MTTR因素的影响,提高MTTF或者降低MTTR都可以提高系统的可用性。
MTTF——全称是Mean Time To Failure,即平均无故障时间,是衡量系统Availability的重要指标。系统平均能够正常运行多长时间,才发生一次故障。系统的可用性越高,平均无故障时间越长。
MTTR——全称是Mean Time To Repair,即平均修复时间,是衡量系统Resilience (弹性)的重要指标。是指可修复产品的平均修复时间,就是从出现故障到修复中间的这段时间。MTTR越短表示易恢复性越好。
For example, if the data center takes an average of six months to fail (MTTF = six months) and it takes 20 minutes, on average, to return the data center to its operational state (MTTR = 20 minutes), then the data center availability is:
* Availability = 6 months / (6 months + 20 minutes) = 99.992 percent.
他们的最终目的都是为了提升系统的可用性:
工程方法
传统做法:提高 MTTF,通过系统设计/开发/测试/运维等方面形成一些可执行的SOP去保障系统稳定运行,如追求保持代码稳定0bug,上线sop,运维上高可用,保持机器/机房/网络5个9的可用性。
Resilience Engineering:缩短 MTTR,通过提出边界场景(失败/风险/意外事件)问题,然后从监控,补救,预防几个维度去思考解决方案,最终反哺到系统设计开发与流程改善上。(如果出现这样问题怎么办?)
实施这套工程方法能够:
1)提高团队应对外部突发事件的能力
2)提高系统的弹性能力,外部流量突增或弱依赖服务的故障对于系统的影响最小化
3)提高系统的自适应和恢复能力,缩短故障时间,降低MTTR,进而提高可用性
|
工程方法 |
常见问题分类 |
解决方案 |
前置条件 |
|---|---|---|---|
Resilience Engineering |
隔离类问题 |
1)业务系统拆分:系统职责单一,高内聚松耦合,按业务线拆分集群 2)基础设施业务隔离:基础设施如DB,Cache,MQ,ZK,nginx等隔离 |
立体化监控: 1)资源监控 5)降级开关健康度监控 6)线程池队列堆积监控 |
|
服务容错 |
1)超时/熔断/降级/fallback |
||
|
容灾问题 |
1)机器容灾:多机器 2)机房容灾:异地多活
|
||
|
过载保护 |
1)nginx层面的流量限制 2)业务层面的限流 3)fail fast |
||
|
攻击/爬虫 |
1)恶意流量识别 |
||
|
运维问题 |
1)回滚 2)预案演练 3)故障模拟 4)容量预估 |
||
|
传统方法(提高MTTF) |
设计问题 |
设计review 1)扩展性:服务无状态 2)一致性:强/弱/最终一致性 3)幂等 4)性能:cache加速/冗余计算/批量/异步/并行 5)高可用 |
|
|
开发问题 |
1)防御性编程 2)code review 3)代码规范 4)代码静态检查 |
||
|
测试问题 |
1)单元测试 |
||
|
运维问题 |
1)发布:规范SOP/灰度 2)自动化 |
方法(完善中)
原则
Embrace failure,Manage it instead of prevent it!
KISS:实施上尽可能的简单。
提高系统弹性能力的决策思考流程
1、了解和熟悉系统现状,如系统的职责,系统的上下游关系,系统的内部功能模块,系统间的通讯方式,系统依赖的存储设施等。
常用手段:
1)了解系统内外的隔离方式
-
是否符合职责单一原则,系统功能是否再次分解
-
系统依赖的不同外部服务调用是否隔离
-
系统依赖的关键基础设施的隔离粒度,如es集群,cache集群,db集群等是否按业务隔离。
2)了解系统间的通讯方式和通讯协议
-
请求响应式
-
同步/异步
-
消息模式:rabbitmq/mafka
-
事件驱动
-
http/thrift 超时机制,连接池设置
2、提出各种边界问题,从监控,补救,预防几个维度去思考解决方案,监控是否到位,补救是否够快,有哪些预防手段
常用手段:
1)结点级别监控和检测项
-
超时检测
-
熔断检测
-
权限验证
-
基础监控项(cpu/内存/网络/磁盘)
-
系统监控项(jvm/队列)
2)集群级别监控与检测项
-
健康检查:alive接口
-
qps/90 rt报警
3)快速或自动恢复
-
回滚机制
-
有限重试机制
-
重启
4)降低事故影响
-
自动熔断:快速失败,如default value/fail silence
-
启用备用服务和系统
-
快速扩容
-
人工业务降级:非核心功能关闭
-
人工系统降级:限流,排队
-
延迟处理
5)快速修复上线
6)预防
-
casestudy分析,清理潜在遗留问题
-
故障演练
-
压测模拟
3、针对2中的各种边界问题和场景,再次思考系统可以改进的问题,做出补充改进
常用补充手段:
1)冗余和容灾设计
-
数据库等基础设施是否主备
-
系统的负载均衡方式
-
选举和避免脑裂问题
-
读写一致性问题
-
多机房方案
2)其他
-
服务是否无状态,关键时刻是否能快速扩容
-
接口和消息处理是否需要幂等处理
设计图
4大子方向:
1)熔断&降级
2)流量:分析与控制
3)故障模拟(chaos engineering)
4) 决策辅助:预案自动化+学习平台
如何接入
基于KISS原则,尽可能让开发者使用简单,基于注解机制提供方便的熔断降级功能,提供配置管理界面,系统负责人可以实时观测降级开关的运行状态,并且能够在界面上一键降级!
参考:熔断/降级接入与使用
工作台介绍
Roadmap
#RoadMap
整体介绍
业内的进展
方法篇
http://www.slideshare.net/xmlking/resilience-engineering
http://www.slideshare.net/ufried/patterns-of-resilience
http://www.slideshare.net/ufried/resilience-reloaded-more-resilience-patterns
http://www.slideshare.net/ufried/resilience-with-hystrix?next_slideshow=1
http://techblog.netflix.com/2012/11/hystrix.html
工具
https://github.com/Netflix/Hystrix/wiki/How-it-Works 弹性框架
https://github.com/Netflix/SimianArmy/wiki 故障场景测试工具

浙公网安备 33010602011771号