如何使服务具备高可用性

上次介绍了《如何搭建高可用Web集群》,有不少同学反馈让我继续发些高可用相关的内容。本文将继续高可用系列内容,介绍一下SRE和架构师角度对『实现高可用性』的理解。

一、概述

可用性案例

在开始之前,先给大家看下可用性的badcase案例:

可用性问题后果

  • 用户损失

–用户体验伤害

–经济损失

  • 公司损失

–经济损失

–客户信任

–技术形象

本文探讨范围

  • 以请求访问型的用户产品为示例

–用户产品

–平台化产品

–内部系统

  • 目录

–高可用性定义

–如何度量

–影响要素分析

–如何保障

 

二、高可用性定义

可用性等级(Availability)定义

Availability = Uptime / (Uptime + Downtime)

通常情况下,Availability达到99.99%或99.999%即可称为服务具备高可用性。

从用户角度出发

  • 对于提供的服务,用户能够获得符合质量预期的服务比例
  • 不可用

–不可访问

–DNS解析失败、链接失败

–服务不存在,或被封禁

–服务内部错误

–低质

–慢,页面错乱、核心元素缺失

相关名词

  • SLA

–服务可用性等级,常说的几个九

  • MTTR

–平均故障恢复时间,即从故障发现到止损点的时间差

  • MTBF

–平均故障间隔时间,即从上一次故障到本次故障的间隔时间,常用于硬件产品

 

三、如何度量

困难

  • 部分Down

–部分功能:子系统、页面、元素等

–部分用户

–间歇性:时间难以衡量

  • 一个指标

–不同功能、用户是否一视同仁?

–浏览 vs 购买 vs 优惠卷

  • 服务端指标 到 用户端 的“漫漫长路”

–服务端指标 vs 用户实际感受指标

–难以全面采集(端支持)

计算方法

  • 时间 => 请求计数

–有效处理的请求次数 / 总合法的请求次数

  • 用户指标 << 服务指标 << 模块指标 << 详细指标

–用户指标反映用户实际感受质量

–服务指标反映服务综合质量

–细分加权求和

–分功能指标反应模块服务质量

–详细指标有助于发现和定位问题

  • SLA

–服务可用性等级,常说的几个九

–计算公式:1 –(失败次数 + 超时次数)/ 总请求次数

  • MTTR

–平均故障恢复时间,即从故障发现到止损点的时间差

–计算公式:(故障恢复时间点 – 故障发生时间点) / 故障次数 * 模块重要性权重 * 模块流量权重

  • MTBF

–平均故障间隔时间,即从上一次故障到本次故障的间隔时间,常用于硬件产品

–计算公式:(服务总可用时间-服务总故障时间) / 总故障次数

相关度量

  • 关联其他指标

–服务容量

–流量:QPS

–性能:平响

–收入

  • 关注变化

–变更

  • 设置预警

–报警策略

 

四、影响要素分析

故障分布

下图是一个常见的服务故障分布情况:

故障时间

  • 计划中的” Downtime”

–非兼容性升级

–数据一致性处理

–故障演练

  • 故障(Failure)导致的” Downtime”

故障位置

  • 硬件故障

–机器(含机器的各组成部分,如磁盘)

–IDC设施:交换机、链路、空调、电力等

–外部设施:运营商网络

  • 软件缺陷

–代码BUG

–异常应对能力

故障触发

  • 外部操作变更

–硬件及系统、网络

–软件:程序、配置、数据

  • 外部流量因素引发的软件故障

–漏洞请求引发:特殊请求导致系统变慢、崩溃

–请求量、频次及构成引发:超出容量

 

五、如何保障

原则

  • 减少发生

–降低故障出现频次

  • 降低影响

–一旦发生,确保尽可能小的影响面

  • 加快恢复

–能够快速发现、定位、修复

方法

变更控制

  • 架构环节

–Design for Failures

–单机故障

–机房/区域故障

–流量异常

–自身异常

–下游异常

–清晰的服务部署

–避免单点

–消除跨逻辑机房的交互

–合理的容量评估

–模块承担容量限额

–Cache崩溃对流量的影响

–第三方容量

–安全设计

  • 编码环节

–严谨的编码,主动容错

–主动容错:函数执行失败、RPC调用失败、经过推敲的错误处理(任何一个函数、外部输入)

–超时控制

–使用NS名字服务

–重试的考虑:链路连锁反应,重试雪崩(容量计算/重试位置)

–模块隔离:高内聚、低耦合

–代码性能、安全性、可测性

–全分支覆盖自测;CodeReview

  • 测试环节

–功能/性能/稳定性/兼容性/安全性测试

–交付确定性

  • 上线环节

分级发布、回归测试

快速回滚

重视数据变更的风险

服务容量管理

  • 服务冗余

–实例N+2

–支持熔灾 + 发布时摘流量

  • 容量评估

–合理评估

–适当降低冗余

  • 容量压测

–建立例行压测机制,定期获取系统容量瓶颈

–容量管理:根据流量合理部署实例,实现实例分配最优化

入口流量调度

  • 能力

–流量的接入与调度能力

–粒度 && 速度

–限流:屏蔽与限制能力

–上下游的流量分配协调

–服务流量IDC调度 >> DB IDC流量激增

  • 场景

–机房规模的故障

–接入故障、骨干网故障

–攻击

服务降级

  • 先分级

–功能分级,开关

–区分核心功能

–流量分级,调度

–区分流量的相互影响

–区分流量的价值

  • 分级场景

–服务过载:超出处理能力

–全局流量增加

–部分用户流量增加

–容量降低

–服务的子组件整体故障

–依赖的第三方服务整体崩溃

  • 再降级

–功能降级

–丢弃非核心功能

–质量降级(减少计算)

–降低服务质量

–流量降级

–丢弃非核心流量

–配额

  • 降级实例

–微信红包,异步延迟对账事物

–地图,基础地图功能,优先于动态路况

快速回滚

  • 做好灾难恢复

–可恢复性

–备份的有效性

–恢复速度

  • PaaS化

–故障自动发现,NS自动摘除

–分级发布

–一键回滚

  • 自运维规范化

–备份与回滚

预案与演练

  • 预案

–把预案内容转换为系统的设计和实现

–优先从系统设计和实现角度保证可用性

  • 定期演练

–制造真实故障

监控报警

  • 有效的指标

–整体及细分可用性

–核心业务指标

–程序指标

–依赖指标

  • 回答如下问题

–会发生问题吗?

–发生问题了吗?

–哪里发生了问题?

–发生了什么问题?

–会自动恢复吗?

其他事项—可用性CheckList

  • 感知

–服务关键指标

–关键依赖指标

  • 隔离

–逻辑服务单元拆分

–单点消除

–核心功能逻辑独立

–核心服务资源优先

–流量成分的细分

–线上线下隔离

–容量规划

–关联解耦

–外部依赖消除

–分级发布

–变更流程规范

  • 止损

–配置热加载

–快速回滚

–防攻击

–单机容错

–过载保护

–服务单元级流量调度

–服务降级

总结

  • 建立对变更的控制能力(减少发生)

–架构、编码、测试、上线

  • 建立对系统的控制能力(降低影响,加快恢复)

–容量管理、隔离、入口流量调度、服务降级、回滚

  • 建立故障模型(减少发生,降低影响,加快恢复)

–考虑每一种可能出现的故障,以及是否都能够自动或手动应对

  • 建立度量和监控(快速发现)

–对系统运转指标有清晰的度量和检测

 

yan 19.12.19

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。