弹性工程 - 构建弹性系统

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等隔离
3)内部资源隔离:系统内部线程池隔离

立体化监控:

1)资源监控
2)系统监控
3)业务监控
4)服务健康检查

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)单元测试
2)联调测试
3)压力测试
4)稳定性测试
5)QA测试

运维问题

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

 

 

整体介绍

 
弹性工程-201801.pdf
2.77MB
 
 

 

业内的进展

方法篇

服务容错模式

https://blog.giantswarm.io/reliability-not-enough-resilient-applications-containerized-microservices/

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

http://www.datacenterknowledge.com/archives/2014/09/15/facebook-turned-off-entire-data-center-to-test-resiliency/

工具

https://github.com/Netflix/Hystrix/wiki/How-it-Works 弹性框架

 https://github.com/Netflix/SimianArmy/wiki   故障场景测试工具

 

 

 

posted @ 2019-02-27 22:05  积淀  阅读(6)  评论(0)    收藏  举报