如何提高服务可用性

如何提高服务可用性


[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/how-to-improve-service-availability.html

低层次的说,大概有如下方法

  • 容灾(lvs+keepalived等)
  • 负载均衡+心跳
  • 限流
  • 熔断&降级
  • 重试
    • 业务重试
    • 框架切换节点重试等
  • 监控+预警
    • 业务上下游流量监控+接口流量监控
    • JVM等指标监控
    • 指定日志监控
    • 主动发送预警
  • (补充)解耦:动静分离/前后分离

归纳一下针对服务本身,其实也就4种类情况

  1. 单点故障
  2. 服务响应慢
  3. 服务超出自身的承载能力
  4. 故障发现与恢复?

1. 单点故障

解决单点故障的其实比较『简单』,就是把单点给去掉,进行一定的『冗余+故障转移』处理。。。
比如把单点的服务部署多份,然后通过负载策略来分发请求,这样就可以避免单点故障了;
当然其实再怎么避免,最靠近用户侧的地方都会有个单点的,我们不讨论这种情况 没啥意义

  • 设备冗余(跨机房、多机房冗余)
  • 应用冗余(集群化部署)
  • 数据冗余(主从、多主、分片、缓存)

2. 服务响应慢

这里抛开代码层面,只考虑架构设计层面,代码层面无非就是减少操作步骤,进行异步处理、并行处理、集中批处理等等。。。 算了一起写吧

这里主要需要提高单机的吞吐量,也就是提高单机的性能,这里主要有两种方式:

  • 单机吞吐量:
    • 多级缓存: 减少非必要更新、查询、调用量
    • 代码层面: 就是减少操作步骤,进行异步处理、并行处理、集中批处理等等
    • 提高单机的性能: 比如增加CPU、内存、磁盘等等
  • 提高集群吞吐量:
    • 集群扩容: 增加应用/机器数量

3. 服务超出自身的承载能力

其实这里主要是服务治理相关的问题

  • 限流(流量特大的时候一般用代理层限流,应用层一般用hystrix、sentinel等,其中前者为滑动窗口限流,后者基于漏洞实现,前者有流量突刺,后者稳流,个人认为后者应用起来比较贴合实际一些)
  • 熔断&降级

4. 故障发现与恢复

  • 监控+预警
    • 业务上下游流量监控、接口流量监控、P99、接口成功率监控等
    • JVM等指标监控
    • 指定日志监控
    • 主动发送预警
作者

神奇宝贝大师

发布于

2023-04-20

更新于

2023-05-30

许可协议

评论