写点什么

高可用系统

用户头像
破晓_dawn
关注
发布于: 2020 年 08 月 26 日

高可用指标

业界通常用多少个9来衡量网站可用性。如果可用性为4个9,表示需要保证所有运行时间中,只有0.01%的时间不可用,即,全年不可用小于53分钟。

一般对于一个大型通信系统而言,通常不会发生整个系统不可用。一般出现的是某个功能不可用,或者某地区用户不可用。对于网站年度不可用的计算是,一部分一部分的功能不可用的时间,乘以占全部功能的百分比,折合的网站不可用时间。

故障管理

为了保证网站的可用性,会对发生的故障,划定级别。如整个网站不可用,为事故级故障。核心功能不可用,为A类故障等等。

对于,大系统要把故障放到第一优先位。

引擎故障的原因

引起故障的原因通常有如下几种:

  • 硬件故障

  • 软件bug

  • 系统发布

  • 并发压力

  • 网络攻击

  • 外部灾害

故障预防

为了防止故障的发生,或者降低故障的影响,通常有如下方法。

软件解耦



从逻辑层面,尽量隔离故障。通过编写可靠的代码,减少故障的发生。主要有:

  • 高内聚、低耦合的组件设计原则

  • 面向对象基本设计原则

  • 面向对象设计模式

  • 领取驱动设计建模

隔离

从物理层面隔离,防止故障扩散。主要有:

  • 业务与子系统隔离

  • 采用微服务和中台架构

  • 生产者和消费者隔离

  • 虚拟机和容器隔离

备份

  • 集群设计

应用部署在一个服务器上时,当服务器故障时,应用不可用对外提供服务。

通过集群设计,任何一台服务器不可用,不会影响系统。互联网架构,任何地方不可用允许一台服务器提供服务,即单点问题。

  • 数据库复制

CAP原理,当出现故障时,在一致性和可用性之间权衡。

Failover(失效转移)

  • 数据库主主失效转移

数据库主主复制,当其中一个主库故障时,切换从库为主库,持续提供写数据能力。

  • 负载均衡失效转移

通过负载均衡,当服务器故障时,将请求发送到其他服务器。

幂等

由于,请求失效时,请求要转移到另一台服务器上。但是之前的服务器上不知道是否请求成功。

因此,失效转移的情况下,要求操作是幂等的,即,一个操作执行多次的情况下,结果是相同的。如,set操作幂等,++不幂等。

如果操作本身不幂等,那么要求服务本身设计,保证幂等性。如通过交易编号等,实现幂等。

事务补偿

事务补偿:通过执行业务逻辑逆操作,使事务回滚到事务前状态。即,第二个操作失败了,第一个操作执行逆操作。通过逻辑代码实现。

重试

通过重试,调用者可以修复单次调用故障。需要注意,顶层超时时间,大于底层超时时间之和

熔断

当服务响应延迟增加等,断路器半开,减少对该服务的访问。等服务回放,再重新打开。如果某个服务故障,通过断路器关闭对该服务的访问。

如:当服务垃圾回收时,会暂时不正常,继续调用,可能导致整个服务不正常。可以通过断路器去控制对该服务的调用。

限流

高并发,外部并发数超过了承受能力,通过限流去保护系统在合理访问内运行。

限流方法有:

计数器(固定窗口)算法:限制每个周期内处理的请求数量

问题:窗口切换器,请求可能忽然增加,控制不住

解决用到了下一个

计数器(滑动窗口)算法:固定窗口的优化,将时间周期分为n个小周期,记录每个小周期内访问的次数。

令牌桶算法:固定的频率像令牌桶中放令牌,直到桶满,请求获取令牌才处理。

也可以避免固定窗口的问题。但是,一开始控制不住速度,桶中令牌用完后,后面是令牌的速度,请求流量的速度就被限制。

漏桶算法:访问请求达到时,放入漏桶。按苏鲁逐个处理。如桶满,丢弃。

可以解决前面的一下子流量大的问题。

自适应限流:和前面的限流方法不同,前面都是固定的限流。自适应限流根据后面的性能指标,去确定限流的速度。

降级

为了尽可能多的服务用户,当流量过大是,关闭非核心功能,保证核心功能的正常运行。

通常降级和限流是组合起来使用。限流会拒绝访问。应该,尽量多的放进来,少限流。限流是用来保护系统的。通常限流时已经做降级了。

异地多活

用于处理外部不可用因素。

高可用运维

发布

由于需求迭代很快,通常每周都需要发布一到二次,需要保证发布时,系统依然高可用。由于发布时,应用会重启,类似于宕机。因此需要考虑的是每周一到二次宕机的情况下,如何保证高可用。

如果要做发布的高可用,一定要做负载服务的负载均衡。在发布过程中,总是有些服务是不可用的,但是负载均衡不会把请求发送到这个服务上。这样分批发布,这个系统发布过程,系统可用。

自动化测试

系统刚产生时,由于需求变化多,用手动测试,成本比较低。

当系统发展到一定规模,功能稳定了,就需要开始自动化测试。否则,功能可能开发了一点,但是上线要回归已有的全部功能,如果手工测试要花费大量的时间,此时,需要自动化测试。

添加新的功能,只需修改之前的自动化测试脚本,或增加脚本既可。

持续部署

包括:持续集成、持续交付、持续部署

持续部署流程:

预发布验证



线下线上环境不一样等问题,有些情况只有在线上测试才可以。

预发布服务器和线上服务器一样,都是请求的线上数据,唯一的不同是:负载均衡服务器,不会请求到预发布服务器,用户的请求,不会到预发布服务器。

工程师通过域名绑定的方式,请求预发布服务器。

此外,要建立高可用系统,还需要良好的代码版本控制,和完善的监控系统。

高可用的价值观

系统架构尽量简单

做难容易,发现关键问题,设计一个简单的架构解决问题,是难的。

做到多少,会有成本和业务的苹果。

发布于: 2020 年 08 月 26 日阅读数: 59
用户头像

破晓_dawn

关注

慢慢,稳稳 2017.12.06 加入

业余选手,但是有一颗向往专业的心

评论

发布
暂无评论
高可用系统