分布式系统稳定性建设-高可用篇
系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面:
-
架构设计:
- 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。
- 合理划分系统功能模块,降低单个模块的复杂度。
- 定义清晰的接口和数据交换标准,确保各模块之间协调工作。
-
容错机制:
- 建立完善的异常处理和容错机制,及时检测并隔离故障,防止故障传播。
- 实现关键功能的冗余备份,提高系统的可用性。
- 设计自动恢复和自修复机制,缩短系统故障的恢复时间。
-
性能优化:
- 进行系统性能测试和瓶颈分析,确定系统的承载能力。
- 优化关键模块的性能,提高系统的整体响应速度。
- 采用缓存、异步处理等手段,缓解系统的瞬时压力。
高可用设计
High Availability,简称HA,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。
- 可用性公式:**可用性 = 系统正常可用的时长/系统运行总时长 * 100%**或:可用性 = (系统运行总时长-系统不可用时长)/ 系统运行时长 * 100%
- 可用性目标:高可用理想值是:100%,2个9:99%,3个9:99.9%,4个9:99.99%
高可用方法
扩展实现冗余
- 按照实际情况评估资源,使用2倍以上的资源,即使垮掉一半也能完全支撑业务。
- 部署机房:双中心或多中心机房部署,热备、冷备方式部署
- 应用架构:支持横向分布式扩展,支持集群部署,支持跨机房部署
- 数据库层:一主多从、读写分离、双集群部署
故障自动转移
- 客户端:提供多组IP或域名,失败时重试和自动切机制
- 代理层:重试或探测自动切换
- 服务层:自动剔除下线
- 存储层:实现主从切换,redis-sentinal哨兵机制监控主节点是否正常,mysql主从切换MHA方案
限流降级隔离熔断
- 限流: 计数器、令牌桶、漏桶
- 熔断降级:
- 人工降级:人工降级一般采用降级开关来控制,公司内部一般采用配置中心Ducc来做开关降级,开关的修改也是线上操作,这块也需要做好监控;
- 自动降级:设置超时时长降级,熔断方式降级,例如调用头像服务100毫秒超时,比较常用的是流量控制和熔断降级框架是 Netflix 的 Hystrix 和 alibaba 的 Sentinel。
- 资源弹性伸缩:docker+k8s容器方式,实现自动扩容,当出现大流量或者故障情况时,可以自动按规则进行扩容。
- 定期故障演练:制定演练计划,对基础模块和核心业务模块进行故障演练,模拟部分机器、单个机房出现网络故障,检查系统的高可用性,不断优化系统。
- 完善监控告警
- 硬件层监控:监控运行中服务器硬件状态
- 网络层监控:监控网络状态和丢包情况
- 客户端监控:客户端增加埋点,自动上报使用异常情况,根据客户IP、账号等信息定位故障点
- 代理层监控:网关、nginx
- 基础中间件:服务注册中心、配置中心、消息队列、分布式缓存、分布式数据库、日志中心(ELK)
- 服务层监控:服务间调用链、服务内存和CPU占用情况、GC情况、系统负载均衡情况,接口QPS和延迟,系统错误日志
- 保证代码质量:遵守规范、质量扫描、 充分测试、代码审核
- 遵守上线规范:对线上服务和数据保持敬畏之心,严格遵守操作流程
- 准备充分:制定上线计划,准备好checklist,提前通知有关人员
- 灰度发布:指定灰度计划,更新局部验收确认后全量。
- 回滚止损:发现问题及时回滚,降低对业务的损失。
- 验收充分:验收过程要仔细严谨,不能漏掉细节
异步调用
异步调用的话我们不需要关心最后的结果,这样我们就可以用户请求完成之后就立即返回结果,具体处理我们可以后续再做,除了可以在程序中实现异步之外,我们常常还使用消息队列,消息队列可以通过异步处理提高系统性能(削峰、减少响应所需时间)并且可以降低系统耦合性。