如何提高服务可用性
如何提高服务可用性
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/how-to-improve-service-availability.html
低层次的说,大概有如下方法
- 容灾(lvs+keepalived等)
- 负载均衡+心跳
- 限流
- 熔断&降级
- 重试
- 业务重试
- 框架切换节点重试等
- 监控+预警
- 业务上下游流量监控+接口流量监控
- JVM等指标监控
- 指定日志监控
- 主动发送预警
- (补充)解耦:动静分离/前后分离
归纳一下针对服务本身,其实也就4种类情况
- 单点故障
- 服务响应慢
- 服务超出自身的承载能力
- 故障发现与恢复?
1. 单点故障
解决单点故障的其实比较『简单』,就是把单点给去掉,进行一定的『冗余+故障转移』处理。。。
比如把单点的服务部署多份,然后通过负载策略来分发请求,这样就可以避免单点故障了;
(当然其实再怎么避免,最靠近用户侧的地方都会有个单点的,我们不讨论这种情况 没啥意义)
- 设备冗余(跨机房、多机房冗余)
- 应用冗余(集群化部署)
- 数据冗余(主从、多主、分片、缓存)
2. 服务响应慢
这里抛开代码层面,只考虑架构设计层面,代码层面无非就是减少操作步骤,进行异步处理、并行处理、集中批处理等等。。。算了一起写吧
这里主要需要提高单机的吞吐量,也就是提高单机的性能,这里主要有两种方式:
- 单机吞吐量:
- 多级缓存: 减少非必要更新、查询、调用量
- 代码层面: 就是减少操作步骤,进行异步处理、并行处理、集中批处理等等
- 提高单机的性能: 比如增加CPU、内存、磁盘等等
- 提高集群吞吐量:
- 集群扩容: 增加应用/机器数量
3. 服务超出自身的承载能力
其实这里主要是服务治理相关的问题
- 限流(流量特大的时候一般用代理层限流,应用层一般用hystrix、sentinel等,其中前者为滑动窗口限流,后者基于漏洞实现,前者有流量突刺,后者稳流,个人认为后者应用起来比较贴合实际一些)
- 熔断&降级
4. 故障发现与恢复
- 监控+预警
- 业务上下游流量监控、接口流量监控、P99、接口成功率监控等
- JVM等指标监控
- 指定日志监控
- 主动发送预警