硬件的故障、黑天鹅的事件、流量峰值、资源故障、DDOS 攻打、程序代码的 BUG 这些都会影响零碎的稳定性。这么多起因都可能导致系统的不稳固,那该如何解决呢?
总的来说分为 4 个方面,一是做好事先预防,二是故障的及时发现,三是做故障的高效排查,四就是疾速复原。
说故障的事先预防前先跟大家分享一个小故事。
春秋时期的名医扁鹊大家应该都晓得,他们一家 3 兄弟都是大夫,扁鹊排行老三,一次魏文王问他:“你们三兄弟谁的医术最高超呢?”扁鹊答复道:“我家大哥的医术最高,二哥其次,我的医术最差。”魏文王不解问道:“不是你的医术最高超么,这早已声名远播。”扁鹊解释“大哥常在病人发病之前就能提前发现并预防,二哥则能在病人呈现小病的时候就用药避免好转,所以大家感觉他们只会治疗小毛病医术不高,其实不然。
而我的病人个别都是曾经生了大病,我须要开膛破肚为他们进行手术能力治好,正是因为如此大家感觉我医术最好。但其实能预防疾病才是医者最高超的医术。”
由此可见故障的事先预防有多重要,自身对于技术团队的考验也更大,那到底该怎么做呢?
设计阶段
首先要做的就是在进行设计的时候尽量地简化零碎的设计,简单的分布式架构没有足够的精力去保护它,最初只会问题频出,所以从稳定性登程,1 个简略的可用的适宜产品现状的零碎架构才是最好的。
第二咱们须要尽量多的理解全局的状况和零碎指标,作为零碎的研发人员只有理解零碎的整体状况能力在呈现问题时更好地应答。
第三就是为零碎抉择适合的组件,组件自身的易用性、性能,组件社区的成熟度,应用的保护老本等都是须要思考的因素。从我的项目角度登程,个别初期的我的项目更习惯于用比拟激进技术,然而当我的项目达到中后期,为了保证系统的稳定性,会更偏向于应用更成熟的技术与组件,这样后续的保护也会更加简略。
此外还须要标准设计的评审,尤其在做大设计的时候,存储架构、存储数据、缓存、数据库的设计都要造成文档,把想到的问题提前提出,防止在日后开发过程中呈现问题返工。
部署阶段
变更是这个阶段带来系统故障的次要起因,谷歌团队在之前公布的文章里提到说大略 70% 的故障是来源于变更,但实际上可能 90% 以上的故障都是因为变更引起的。
要防止变更带来的影响,首先要做的就是标准上线的流程,包含上线的工夫、上线的频率、上线的周期等。像美图当初就是规定只有周一和周四每天能够上线 1 次,周五和节假日之前是严禁上线的,上线的工夫也有标准,不能在早晨高峰期的时候也就是在 5:30 之后禁止上线,另外上线之后,咱们会进行监控和察看,尽早发现上线过程中呈现的问题。
灰度、预热、慢启动都是防止变更呈现问题的比拟重要的形式,这里就不开展了。
说一说容量评估,一般来说会做这么几件事儿,第一件事须要确定流量的起源,像是大促流动时须要确定流量是从 H5 来的还是从第三方的接口来的,起源确定后能够依据过往的教训来设定一个目标值。
梳理链路和服务状况是为了联合监控和全链路压测更好地进行容量评估,水位的设定能够帮忙判断之前设立的目标值是否正当,看具体是要优化还是扩容,以最终确定咱们的机器的数量和和资源的数量。
上文提到的全链路压测,大家感兴趣的能够回顾之前的文章理解详情。
👉二十问全链路压测干货汇总 (上) 全网最全
做好设计和部署之后就该思考如何通过伎俩来缩小故障产生的机率,次要是有两种形式,1 种是冗余,1 种是隔离。
冗余包含计算冗余和存储冗余,存储冗余更多的是应用复制的形式,包含同步复制、半同步复制和异步复制 3 种。存储冗余自身的复杂度比拟高,因为须要把数据从一个中央拷贝到另 1 个中央,并且要保证数据的完整性。与之绝对的是计算冗余,常见的形式是负载平衡服务器和多机房策略。
隔离指的是服务隔离,能够依据性能或者重要水平将一个服务拆分成多个子模块,每一个模块之间不会相互影响。这个 idea 是来源于船舱的设计,大型轮船会有很多的船舱,但它会保障每个船舱是互相隔离的,这样即便某 1 个船舱呈现故障进水了,它只会影响这一个船舱,不会把整个船全副拖垮。那在进行服务隔离的时候,也是这么一个思路,能够抉择放弃一部分性能或者服务的稳定性来保障全局的稳定性。
讲了那么多故障的当时预防,那当故障曾经产生时,咱们又该怎么解决?
你的监控指标是否欠缺?又该如何制订指标?
你的告警逻辑是正确的么?应该遵循怎么样的告警准则?
怎么样能力疾速地进行故障修复?熔断、降级、流控应该怎么做?
想要理解这些问题的具体解答,关注数列科技,回复关键词【71】即可查看原版演讲视频~
供稿:美图高级技术专家唐扬
整顿:三十