什么?知乎又挂了?咱们来聊聊微服务的高可用如何保障

故事

今天中午知乎又一次宕机,访问返回502错误,以下图所示:nginx

img

高可用标准

那服务既然挂了,咱们来聊聊如何在微服务中如何保障他可以不挂呢?首先咱们来看看业界的高可用标准,通常常见的归纳以下:redis

img

5个9的SLA在一年内只能是5分钟的不可用时间,5分钟啊,若是按一年只出1次故障,你也得在五分钟内恢复故障,感受仍是有点厉害。算法

什么是高可用?

那咱们在作高可用以前,先经过维基百科了解一下到底什么是真正的高可用呢?sql

系统无中断地执行其功能的能力,表明系统的可用性程度,是进行系统设计时的准则之一。

这个难点或是重点在于“无中断”,要作到 7 x 24 小时无中断无异常的服务提供。docker

为何须要高可用?

一套对外提供服务的系统是须要硬件,软件相结合,可是咱们的硬件老是会出故障,软件会有 Bug,硬件会慢慢老化,网络老是不稳定,软件会愈来愈复杂和庞大。数据库

除了硬件软件在本质上没法作到“无中断”,外部环境也可能致使服务的中断,例如断电,地震,火灾,光纤被挖掘机挖断,这些影响的程度可能更大。安全

如何保障服务的高可用?

高可用是一个比较复杂的命题,基本上在全部的处理中都会涉及到高可用,全部在设计高可用方案也涉及到了方方面面。这中间将会出现的细节是多种多样的,因此咱们须要对这样一个微服务高可用方案进行一个顶层的设计,围绕服务高可用,先检查下咱们手里有多少张牌。通常的策略主要有:服务冗余、无状态化、数据存储高可用、柔性化、兜底容错、负载均衡、服务限流、服务监控等。服务器

服务冗余

每个访问可能都会有多个服务组成而成,每一个机器每一个服务均可能出现问题,因此第一个考虑到的就是每一个服务必须不止一份能够是多份,所谓多份一致的服务就是服务的冗余,这里说的服务泛指了机器的服务,容器的服务,还有微服务自己的服务。网络

在机器服务层面须要考虑,各个机器间的冗余是否有在物理空间进行隔离冗余,例如是否全部机器是否有分别部署在不一样机房,若是在同一个机房是否作到了部署在不一样的机柜,若是是docker容器是否部署在分别不一样的物理机上面。采起的策略其实也仍是根据服务的业务而定,因此须要对服务进行分级评分,从而采起不一样的策略,不一样的策略安全程度不一样,伴随这的成本也是不一样,安全等级更高的服务可能还不止考虑不一样机房,还须要把各个机房所处的区域考虑进行,例如,两个机房不要处在同一个地震带上等等。架构

无状态化

服务的冗余会要求咱们能够随时对服务进行扩容或者缩容,有可能咱们会从2台机器变成3台机器,想要对服务进行随时随地的扩缩容,就要求咱们的服务是一个无状态化,所谓无状态化就是每一个服务的服务内容和数据都是一致的。

例如,从咱们的微服务架构来看,咱们总共分水平划分了好几个层,正由于咱们每一个层都作到了无状态,因此在这个水平架构的扩张是很是的简单。

假设,咱们须要对网关进行扩容,咱们只须要增长服务就能够,而不须要去考虑网关是否存储了一个额外的数据。

服务存储高可用

分布式领域中有一个著名的CAP定理,从理论上论证了存储高可用的复杂度,也就是说,存储高可用不可能同时知足“一致性,可用性,分区容错性”,最多只能知足2个,其中分区容错在分布式中是必须的,就意味着,咱们在作架构设计时必须结合业务对一致性和可用性进行取舍。
存储高可用方案的本质是将数据复制到多个存储设备中,经过数据冗余的方式来现实高可用,其复杂度主要呈如今数据复制的延迟或中断致使数据的不一致性,咱们在设计存储架构时必须考虑到一下几个方面:

  • 数据怎么进行复制
  • 架构中每一个节点的职责是什么
  • 数据复制出现延迟怎么处理
  • 当架构中节点出现错误怎么保证高可用

数据主从复制

主从复制是最多见的也是最简单的存储高可用方案,例如Mysql,redis等等。

其架构的优势就是简单,主机复制写和读,而从机只负责读操做,在读并发高时候可用扩张从库的数量减低压力,主机出现故障,读操做也能够保证读业务的顺利进行。
缺点就是客户端必须感知主从关系的存在,将不一样的操做发送给不一样的机器进行处理,并且主从复制中,从机器负责读操做,可能由于主从复制时延大,出现数据不一致性的问题。

数据主从切换

刚说了主从切换存在两个问题: 1.主机故障写操做没法进行 2.须要人工将其中一台从机器升级为主机

为了解决这个两个问题,咱们能够设计一套主从自动切换的方案,其中设计到对主机的状态检测,切换的决策,数据丢失和冲突的问题。

数据分片

上述的数据冗余能够经过数据的复制来进行解决,可是数据的扩张须要经过数据的分片来进行解决(若是在关系型数据库是分表)。

何为数据分片(segment,fragment, shard, partition),就是按照必定的规则,将数据集划分红相互独立、正交的数据子集,而后将数据子集分布到不一样的节点上。
HDFS , mongoDB 的sharding 模式也基本是基于这种分片的模式去实现,咱们在设计分片主要考虑到的点是:

  • 作数据分片,如何将数据映射到节点
  • 数据分片的特征值,即按照数据中的哪个属性(字段)来分片
  • 数据分片的元数据的管理,如何保证元数据服务器的高性能、高可用,若是是一组服务器,如何保证强一致性

柔性化/异步化

在每一次调用,时间越长存在超时的风险就越大,逻辑越复杂执行的步骤越多存在失败的风险也就越大,若是在业务容许的状况下,用户调用只给用户必需要的结果,而不是须要同步的结果能够放在另外的地方异步去操做,这就减小了超时的风险也把复杂业务进行拆分减低复杂度。

固然异步化的好处是很是多,例如削封解耦等等,这里只是从可用的角度出发。

所谓的柔性化,就是在咱们业务中容许的状况下,作不到给予用户百分百可用的经过降级的手段给到用户尽量多的服务,而不是非得每次都交出去要么100分或0分的答卷。
怎么去作柔性化,更多实际上是对业务的理解和判断,柔性化更可能是一种思惟,须要对业务场景有深刻的了解。

在电商订单的场景中,下单,扣库存,支付是必定要执行的步骤,若是失败则订单失败,可是加积分,发货,售后是能够柔性处理,就算出错也能够经过日志报警让人工去检查,不必为加积分损失整个下单的可用性。

兜底/容错

兜底是可能咱们常常谈论的是一种降级的方案,方案是用来实施,可是这里兜底可能更可能是一种思想,更多的是一种预案,每一个操做均可以犯错,咱们也能够接受犯错,可是每一个犯错咱们都必须有一个兜底的预案,这个兜底的预案其实就是咱们的容错或者说最大程度避免更大伤害的措施,实际上也是一个不断降级的过程。

负载均衡

相信负载均衡这个话题基本已经深刻每一个作微服务开发或设计者的人心,负载均衡的实现有硬件和软件,硬件有F5,A10等机器,软件有LVS,nginx,HAProxy等等,负载均衡的算法有 random , RoundRobin , ConsistentHash等等。

服务限流降级熔断

先来说讲微服务中限流/熔断的目的是什么,微服务后,系统分布式部署,系统之间经过rpc框架通讯,整个系统发生故障的几率随着系统规模的增加而增加,一个小的故障通过链路的传递放大,有可能会形成更大的故障。

服务监控

服务监控是微服务治理的一个重要环节,监控系统的完善程度直接影响到咱们微服务质量的好坏,咱们的微服务在线上运行的时候有没有一套完善的监控体系能去了解到它的健康状况,对整个系统的可靠性和稳定性是很是重要,可靠性和稳定性是高可用的一个前提保证。

【注:文章部份内容参考 李云华《从0开始学架构》杨波老师《微服务》】关注“SpringForAll社区”公众号,2020让咱们一块儿精进。

[](https://tva1.sinaimg.cn/large...

本文由博客一文多发平台 OpenWrite 发布!
相关文章
相关标签/搜索