作者 | 曉土??阿里巴巴高級(jí)工程師
創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)黃陂,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
姊妹篇閱讀推薦:《[云原生時(shí)代,分布式系統(tǒng)設(shè)計(jì)必備知識(shí)圖譜(內(nèi)含22個(gè)知識(shí)點(diǎn))](http://mp.weixin.qq.com/s?__biz=MzUzNzYxNjAzMg==&mid=2247486600&idx=1&sn=0ad92a1fe535f141fe2e8c87ffbd1229&chksm=fae50747cd928e51c05c41d2cc206069babbe9dfdba5957c52ac6e77cb754192169bb6b3e898&scene=21#wechat_redirect)》
導(dǎo)讀:本文力求從分布式基礎(chǔ)理論、架構(gòu)設(shè)計(jì)模式、工程應(yīng)用、部署運(yùn)維、業(yè)界方案這幾大方面,介紹基于 MSA(微服務(wù)架構(gòu))的分布式知識(shí)體系大綱,從而對(duì) SOA 到 MSA 進(jìn)化有著立體的認(rèn)識(shí);從概念上和工具應(yīng)用上更近一步了解微服務(wù)分布式的本質(zhì),身臨其境的感受如何搭建全套微服務(wù)架構(gòu)的過(guò)程。
關(guān)注“阿里巴巴云原生”公眾號(hào),回復(fù)“分布”,即可下載分布式系統(tǒng)及其知識(shí)體系清晰大圖!
隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展和智能終端的普及,計(jì)算機(jī)系統(tǒng)早就從單機(jī)獨(dú)立工作過(guò)渡到多機(jī)器協(xié)作,集群按照分布式理論構(gòu)建出龐大復(fù)雜的應(yīng)用服務(wù),在分布式的基礎(chǔ)上正進(jìn)行一場(chǎng)云原生的技術(shù)革命,徹底打破傳統(tǒng)的開(kāi)發(fā)方式,解放了新一代的生產(chǎn)力。
cdn.com/d16a1bbbb104cad78fe989c3f11828614c75e946.png">
關(guān)注“阿里巴巴云原生”公眾號(hào),回復(fù)“**分布**”,即可下載分布式系統(tǒng)及其知識(shí)體系清晰大圖!
由于業(yè)務(wù)發(fā)展到一定程度后,需要對(duì)服務(wù)進(jìn)行解耦,進(jìn)而把一個(gè)單一的大系統(tǒng)按邏輯拆分成不同的子系統(tǒng),通過(guò)服務(wù)接口來(lái)通訊。面向服務(wù)的設(shè)計(jì)模式,最終需要總線集成服務(wù),而且大部分時(shí)候還共享數(shù)據(jù)庫(kù),出現(xiàn)單點(diǎn)故障時(shí)會(huì)導(dǎo)致總線層面的故障,更進(jìn)一步可能會(huì)把數(shù)據(jù)庫(kù)拖垮,所以才有了更加獨(dú)立的設(shè)計(jì)方案的出現(xiàn)。
微服務(wù)是真正意義上的獨(dú)立服務(wù),從服務(wù)入口到數(shù)據(jù)持久層,邏輯上都是獨(dú)立隔離的,無(wú)需服務(wù)總線來(lái)接入,但同時(shí)也增加了整個(gè)分布式系統(tǒng)的搭建和管理難度,需要對(duì)服務(wù)進(jìn)行編排和管理,所以伴隨著微服務(wù)的興起,微服務(wù)生態(tài)的整套技術(shù)棧也需要無(wú)縫接入,才能支撐起微服務(wù)的治理理念。
傳統(tǒng)的節(jié)點(diǎn)也就是一臺(tái)單體的物理機(jī),所有的服務(wù)都揉進(jìn)去包括服務(wù)和數(shù)據(jù)庫(kù);隨著虛擬化的發(fā)展,單臺(tái)物理機(jī)往往可以分成多臺(tái)虛擬機(jī),實(shí)現(xiàn)資源利用的最大化,節(jié)點(diǎn)的概念也變成單臺(tái)虛擬機(jī)上面服務(wù);近幾年容器技術(shù)逐漸成熟后,服務(wù)已經(jīng)徹底容器化,也就是節(jié)點(diǎn)只是輕量級(jí)的容器服務(wù)。總體來(lái)說(shuō),節(jié)點(diǎn)就是能提供單位服務(wù)的邏輯計(jì)算資源的集合。
分布式架構(gòu)的根基就是網(wǎng)絡(luò),不管是局域網(wǎng)還是公網(wǎng),沒(méi)有網(wǎng)絡(luò)就無(wú)法把計(jì)算機(jī)聯(lián)合在一起工作,但是網(wǎng)絡(luò)也帶來(lái)了一系列的問(wèn)題。網(wǎng)絡(luò)消息的傳播有先后,消息丟失和延遲是經(jīng)常發(fā)生的事情,我們定義了三種網(wǎng)絡(luò)工作模式:
常用網(wǎng)絡(luò)傳輸層有兩大協(xié)議的特點(diǎn)簡(jiǎn)介:
慢速物理時(shí)空中,時(shí)間獨(dú)自在流淌著,對(duì)于串行的事務(wù)來(lái)說(shuō),很簡(jiǎn)單的就是跟著時(shí)間的腳步走就可以,先來(lái)后到的發(fā)生。而后我們發(fā)明了時(shí)鐘來(lái)刻畫(huà)以往發(fā)生的時(shí)間點(diǎn),時(shí)鐘讓這個(gè)世界井然有序。但是對(duì)于分布式世界來(lái)說(shuō),跟時(shí)間打交道著實(shí)是一件痛苦的事情。
分布式世界里面,我們要協(xié)調(diào)不同節(jié)點(diǎn)之間的先來(lái)后到關(guān)系,不同節(jié)點(diǎn)本身承認(rèn)的時(shí)間又各執(zhí)己見(jiàn),于是我們創(chuàng)造了網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)試圖來(lái)解決不同節(jié)點(diǎn)之間的標(biāo)準(zhǔn)時(shí)間,但是 NTP 本身表現(xiàn)并不盡如人意,所以我們又構(gòu)造出了邏輯時(shí)鐘,最后改進(jìn)為向量時(shí)鐘:
有了衡量時(shí)間的工具,解決順序問(wèn)題自然就是水到渠成了。因?yàn)檎麄€(gè)分布式的理論基礎(chǔ)就是如何協(xié)商不同節(jié)點(diǎn)的一致性問(wèn)題,而順序則是一致性理論的基本概念,所以前文我們才需要花時(shí)間介紹衡量時(shí)間的刻度和工具。
說(shuō)到一致性理論,我們必須看一張關(guān)于一致性強(qiáng)弱對(duì)系統(tǒng)建設(shè)影響的對(duì)比圖:
該圖對(duì)比了不同一致性算法下的事務(wù)、性能、錯(cuò)誤、延遲的平衡。
單機(jī)環(huán)境下我們對(duì)傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)有苛刻的要求,由于存在網(wǎng)絡(luò)的延遲和消息丟失,ACID 便是保證事務(wù)的原則,這四大原則甚至我們都不需要解釋出來(lái)就耳熟能詳了:
分布式環(huán)境下,我們無(wú)法保證網(wǎng)絡(luò)的正常連接和信息的傳送,于是發(fā)展出了 CAP/FLP/DLS 這三個(gè)重要的理論:
多數(shù)情況下,其實(shí)我們也并非一定要求強(qiáng)一致性,部分業(yè)務(wù)可以容忍一定程度的延遲一致,所以為了兼顧效率,發(fā)展出來(lái)了最終一致性理論 BASE。BASE 是指基本可用(Basically Available)、軟狀態(tài)( Soft State)、最終一致性( Eventual Consistency):
分布式架構(gòu)的核心就在于一致性的實(shí)現(xiàn)和妥協(xié),那么如何設(shè)計(jì)一套算法來(lái)保證不同節(jié)點(diǎn)之間的通信和數(shù)據(jù)達(dá)到無(wú)限趨向一致性,就非常重要了。保證不同節(jié)點(diǎn)在充滿不確定性網(wǎng)絡(luò)環(huán)境下能達(dá)成相同副本的一致性是非常困難的,業(yè)界對(duì)該課題也做了大量的研究。
首先我們要了解一致性的大前提原則?(CALM):
CALM 原則的全稱(chēng)是 Consistency and Logical Monotonicity ,主要描述的是分布式系統(tǒng)中單調(diào)邏輯與一致性的關(guān)系,它的內(nèi)容如下,參考?consistency as logical monotonicity。
然后再關(guān)注分布式系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)?CRDT(Conflict-Free Replicated Data Types):
我們了解到分布式一些規(guī)律原則之后,就要著手考慮如何來(lái)實(shí)現(xiàn)解決方案,一致性算法的前提是數(shù)據(jù)結(jié)構(gòu),或者說(shuō)一切算法的根基都是數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)良好的數(shù)據(jù)結(jié)構(gòu)加上精妙的算法可以高效的解決現(xiàn)實(shí)的問(wèn)題。經(jīng)過(guò)前人不斷的探索,我們得知分布式系統(tǒng)被廣泛采用的數(shù)據(jù)結(jié)構(gòu) CRDT。
參考《談?wù)?CRDT》,A comprehensive study of Convergent and Commutative Replicated Data Types
了解數(shù)據(jù)結(jié)構(gòu)后,我們需要來(lái)關(guān)注一下分布式系統(tǒng)的一些重要的協(xié)議HATs(Highly Available Transactions),ZAB(Zookeeper Atomic Broadcast):
參考《高可用事務(wù)》,《ZAB 協(xié)議分析》
最后要學(xué)習(xí)的是業(yè)界主流的一致性算法?:
說(shuō)實(shí)話具體的算法我也還沒(méi)完全搞懂,一致性算法是分布式系統(tǒng)最核心本質(zhì)的內(nèi)容,這部分的發(fā)展也會(huì)影響架構(gòu)的革新,不同場(chǎng)景的應(yīng)用也催生不同的算法。
這一節(jié)我們說(shuō)完分布式系統(tǒng)里面核心理論基礎(chǔ),如何達(dá)成不同節(jié)點(diǎn)之間的數(shù)據(jù)一致性,下面我們將會(huì)講到目前都有哪些主流的分布式系統(tǒng)。
單臺(tái)計(jì)算機(jī)的存儲(chǔ)始終有上限,隨著網(wǎng)絡(luò)的出現(xiàn),多臺(tái)計(jì)算機(jī)協(xié)作存儲(chǔ)文件的方案也相繼被提出來(lái)。最早的分布式文件系統(tǒng)其實(shí)也稱(chēng)為網(wǎng)絡(luò)文件系統(tǒng),第一個(gè)文件服務(wù)器在 1970 年代被發(fā)展出來(lái)。在 1976 年迪吉多公司設(shè)計(jì)出 File Access Listener(FAL),而現(xiàn)代分布式文件系統(tǒng)則出自赫赫有名的 Google 的論文,《The Google File System》奠定了分布式文件系統(tǒng)的基礎(chǔ)。現(xiàn)代主流分布式文件系統(tǒng)參考《分布式文件系統(tǒng)對(duì)比》,下面列舉幾個(gè)常用的文件系統(tǒng):
數(shù)據(jù)庫(kù)當(dāng)然也屬于文件系統(tǒng),主數(shù)據(jù)增加了事務(wù)、檢索、擦除等高級(jí)特性,所以復(fù)雜度又增加了,既要考慮數(shù)據(jù)一致性也得保證足夠的性能。傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)為了兼顧事務(wù)和性能的特性,在分布式方面的發(fā)展有限,非關(guān)系型數(shù)據(jù)庫(kù)擺脫了事務(wù)的強(qiáng)一致性束縛,達(dá)到了最終一致性的效果,從而有了飛躍的發(fā)展,NOSQL(Not Only Sql) 也產(chǎn)生了多個(gè)架構(gòu)的數(shù)據(jù)庫(kù)類(lèi)型,包括 KV、列式存儲(chǔ)、文檔類(lèi)型等。
分布式計(jì)算系統(tǒng)構(gòu)建在分布式存儲(chǔ)的基礎(chǔ)上,充分發(fā)揮分布式系統(tǒng)的數(shù)據(jù)冗余災(zāi)備,多副本高效獲取數(shù)據(jù)的特性,進(jìn)而并行計(jì)算,把原本需要長(zhǎng)時(shí)間計(jì)算的任務(wù)拆分成多個(gè)任務(wù)并行處理,從而提高了計(jì)算效率。分布式計(jì)算系統(tǒng)在場(chǎng)景上分為離線計(jì)算、實(shí)時(shí)計(jì)算和流式計(jì)算。
緩存作為提升性能的利器無(wú)處不在,小到 CPU 緩存架構(gòu),大到分布式應(yīng)用存儲(chǔ)。分布式緩存系統(tǒng)提供了熱點(diǎn)數(shù)據(jù)的隨機(jī)訪問(wèn)機(jī)制,大大了提升了訪問(wèn)時(shí)間,但是帶來(lái)的問(wèn)題是如何保證數(shù)據(jù)的一致性,引入分布式鎖來(lái)解決這個(gè)問(wèn)題,主流的分布式存儲(chǔ)系統(tǒng)基本就是 Redis 了。
分布式消息隊(duì)列系統(tǒng)是消除異步帶來(lái)的一系列復(fù)雜步驟的一大利器,在多線程高并發(fā)場(chǎng)景下,我們常常需要謹(jǐn)慎設(shè)計(jì)業(yè)務(wù)代碼,來(lái)保證多線程并發(fā)情況下不出現(xiàn)資源競(jìng)爭(zhēng)導(dǎo)致的死鎖問(wèn)題。而消息隊(duì)列以一種延遲消費(fèi)的模式將異步任務(wù)都存到隊(duì)列,然后再逐個(gè)消化。
分布式系統(tǒng)從單機(jī)到集群的形態(tài)發(fā)展,復(fù)雜度也大大提高,所以對(duì)整個(gè)系統(tǒng)的監(jiān)控也是必不可少。
分布式系統(tǒng)的核心模塊就是在應(yīng)用如何處理業(yè)務(wù)邏輯,應(yīng)用直接的調(diào)用依賴(lài)于特定的協(xié)議來(lái)通信,有基于 RPC 協(xié)議的,也有基于通用的 HTTP 協(xié)議。
錯(cuò)誤對(duì)應(yīng)分布式系統(tǒng)是家常便飯,而且我們?cè)O(shè)計(jì)系統(tǒng)的時(shí)候,本身就需要把容錯(cuò)作為普遍存在的現(xiàn)象來(lái)考慮。那么當(dāng)出現(xiàn)故障的時(shí)候,快速恢復(fù)和排查故障就顯得非常重要了。分布式日志采集存儲(chǔ)和檢索則可以給我們提供有力的工具來(lái)定位請(qǐng)求鏈路中出現(xiàn)問(wèn)題的環(huán)節(jié)。
前文我們提到所謂分布式系統(tǒng),是迫于單機(jī)的性能有限,而堆硬件卻又無(wú)法無(wú)休止的增加,單機(jī)堆硬件最終也會(huì)遇到性能增長(zhǎng)曲線的瓶頸。于是我們才采用了多臺(tái)計(jì)算機(jī)來(lái)干同樣的活,但是這樣的分布式系統(tǒng)始終需要中心化的節(jié)點(diǎn)來(lái)監(jiān)控或者調(diào)度系統(tǒng)的資源,即使該中心節(jié)點(diǎn)也可能是多節(jié)點(diǎn)組成。區(qū)塊鏈則是真正的區(qū)中心化分布式系統(tǒng),系統(tǒng)里面只有 P2P 網(wǎng)絡(luò)協(xié)議各自通信,沒(méi)有真正意義的中心節(jié)點(diǎn),彼此按照區(qū)塊鏈節(jié)點(diǎn)的算力、權(quán)益等機(jī)制來(lái)協(xié)調(diào)新區(qū)塊的產(chǎn)生。
上節(jié)我們列舉了不同場(chǎng)景下不同分布式系統(tǒng)架構(gòu)扮演的角色和實(shí)現(xiàn)的功能,本節(jié)我們更進(jìn)一步歸納分布式系統(tǒng)設(shè)計(jì)的時(shí)候是如何考慮架構(gòu)設(shè)計(jì)的、不同設(shè)計(jì)方案直接的區(qū)別和側(cè)重點(diǎn)、不同場(chǎng)景需要選擇合作設(shè)計(jì)模式,來(lái)減少試錯(cuò)的成本,設(shè)計(jì)分布式系統(tǒng)需要考慮以下的問(wèn)題。
可用性是系統(tǒng)運(yùn)行和工作的時(shí)間比例,通常以正常運(yùn)行時(shí)間的百分比來(lái)衡量。它可能受系統(tǒng)錯(cuò)誤、基礎(chǔ)架構(gòu)問(wèn)題、惡意attack和系統(tǒng)負(fù)載的影響。分布式系統(tǒng)通常為用戶提供服務(wù)級(jí)別協(xié)議(SLA),因此應(yīng)用程序必須設(shè)計(jì)為最大化可用性。
數(shù)據(jù)管理是分布式系統(tǒng)的關(guān)鍵要素,并影響大多數(shù)質(zhì)量的屬性。由于性能,可擴(kuò)展性或可用性等原因,數(shù)據(jù)通常托管在不同位置和多個(gè)服務(wù)器上,這可能帶來(lái)一系列挑戰(zhàn)。例如,必須維護(hù)數(shù)據(jù)一致性,并且通常需要跨不同位置同步數(shù)據(jù)。
良好的設(shè)計(jì)包括諸如組件設(shè)計(jì)和部署的一致性、簡(jiǎn)化管理和開(kāi)發(fā)的可維護(hù)性、以及允許組件和子系統(tǒng)用于其他應(yīng)用程序和其他方案的可重用性等因素。在設(shè)計(jì)和實(shí)施階段做出的決策對(duì)分布式系統(tǒng)和服務(wù)質(zhì)量和總體擁有成本產(chǎn)生巨大影響。
分布式系統(tǒng)需要一個(gè)連接組件和服務(wù)的消息傳遞中間件,理想情況是以松散耦合的方式,以便最大限度地提高可伸縮性。異步消息傳遞被廣泛使用,并提供許多好處,但也帶來(lái)了諸如消息排序,冪等性等挑戰(zhàn)
分布式系統(tǒng)在遠(yuǎn)程數(shù)據(jù)中心運(yùn)行,無(wú)法完全控制基礎(chǔ)結(jié)構(gòu),這使管理和監(jiān)視比單機(jī)部署更困難。應(yīng)用必須公開(kāi)運(yùn)行時(shí)信息,管理員可以使用這些信息來(lái)管理和監(jiān)視系統(tǒng),以及支持不斷變化的業(yè)務(wù)需求和自定義,而無(wú)需停止或重新部署應(yīng)用。
性能表示系統(tǒng)在給定時(shí)間間隔內(nèi)執(zhí)行任何操作的響應(yīng)性,而可伸縮性是系統(tǒng)處理負(fù)載增加而不影響性能或容易增加可用資源的能力。分布式系統(tǒng)通常會(huì)遇到變化的負(fù)載和活動(dòng)高峰,特別是在多租戶場(chǎng)景中,幾乎是不可能預(yù)測(cè)的。相反,應(yīng)用應(yīng)該能夠在限制范圍內(nèi)擴(kuò)展以滿足需求高峰,并在需求減少時(shí)進(jìn)行擴(kuò)展。可伸縮性不僅涉及計(jì)算實(shí)例,還涉及其他元素,如數(shù)據(jù)存儲(chǔ)、消息隊(duì)列等。
彈性是指系統(tǒng)能夠優(yōu)雅地處理故障并從故障中恢復(fù)。分布式系統(tǒng)通常是多租戶,使用共享平臺(tái)服務(wù)、競(jìng)爭(zhēng)資源和帶寬,通過(guò) Internet 進(jìn)行通信,以及在商用硬件上運(yùn)行,意味著出現(xiàn)瞬態(tài)和更永久性故障的可能性增加。為了保持彈性,必須快速有效地檢測(cè)故障并進(jìn)行恢復(fù)。
安全性是系統(tǒng)能夠防止在設(shè)計(jì)使用之外的惡意或意外行為,并防止泄露或丟失信息。分布式系統(tǒng)在受信任的本地邊界之外的 Internet 上運(yùn)行,通常向公眾開(kāi)放,并且可以為不受信任的用戶提供服務(wù)。必須以保護(hù)應(yīng)用程序免受惡意attack,限制僅允許對(duì)已批準(zhǔn)用戶的訪問(wèn),并保護(hù)敏感數(shù)據(jù)。
前文我們介紹了分布式系統(tǒng)的核心理論,面臨的一些難題和解決問(wèn)題的折中思路,羅列了現(xiàn)有主流分布式系統(tǒng)的分類(lèi),而且歸納了建設(shè)分布式系統(tǒng)的一些方法論,那么接下來(lái)我們將從工程角度來(lái)介紹搭建分布式系統(tǒng)包含的內(nèi)容和步驟。
巧婦難為無(wú)米之炊,我們一切的軟件系統(tǒng)都是構(gòu)建在硬件服務(wù)器的基礎(chǔ)上。從最開(kāi)始的物理機(jī)直接部署軟件系統(tǒng),到虛擬機(jī)的應(yīng)用,最后到了資源上云容器化,硬件資源的使用也開(kāi)始了集約化的管理。本節(jié)對(duì)比的是傳統(tǒng)運(yùn)維角色對(duì)應(yīng)的職責(zé)范圍,在 devops 環(huán)境下,開(kāi)發(fā)運(yùn)維一體化,我們要實(shí)現(xiàn)的也是資源的靈活高效使用。
過(guò)去軟件系統(tǒng)隨著用戶量增加需要增加機(jī)器資源的話,傳統(tǒng)的方式就是找運(yùn)維申請(qǐng)機(jī)器,然后部署好軟件服務(wù)接入集群,整個(gè)過(guò)程依賴(lài)的是運(yùn)維人員的人肉經(jīng)驗(yàn),效率低下而且容易出錯(cuò)。微服務(wù)分布式則無(wú)需人肉增加物理機(jī)器,在容器化技術(shù)的支撐下,我們只需要申請(qǐng)?jiān)瀑Y源,然后執(zhí)行容器腳本即可。
有了計(jì)算資源后,另外最重要的就是網(wǎng)絡(luò)資源了。在現(xiàn)有的云化背景下,我們幾乎不會(huì)直接接觸到物理的帶寬資源,而是直接由云平臺(tái)統(tǒng)一管理帶寬資源。我們需要的是對(duì)網(wǎng)絡(luò)資源的最大化應(yīng)用和有效的管理。
在系統(tǒng)故障的時(shí)候我們第一要?jiǎng)?wù)是系統(tǒng)恢復(fù),同時(shí)保留案發(fā)現(xiàn)場(chǎng)也是非常重要的,資源調(diào)度平臺(tái)則需要有統(tǒng)一的機(jī)制保存好故障現(xiàn)場(chǎng)。
在我們建設(shè)好分布式系統(tǒng)后,最先受到考驗(yàn)的關(guān)口就是網(wǎng)關(guān)了,進(jìn)而我們需要關(guān)注系統(tǒng)流量的情況,也就是如何對(duì)流量的管理,我們追求的是在系統(tǒng)可容納的流量上限內(nèi),把資源留給最優(yōu)質(zhì)的流量使用、把非法惡意的流量擋在門(mén)外,這樣節(jié)省成本的同時(shí)確保系統(tǒng)不會(huì)被沖擊崩潰。
負(fù)載均衡是我們對(duì)服務(wù)如何消化流量的通用設(shè)計(jì),通常分為物理層的底層協(xié)議分流的硬負(fù)載均衡和軟件層的軟負(fù)載。負(fù)載均衡解決方案已經(jīng)是業(yè)界成熟的方案,我們通常會(huì)針對(duì)特定業(yè)務(wù)在不同環(huán)境進(jìn)行優(yōu)化,常用有如下的負(fù)載均衡解決方案
負(fù)載均衡首當(dāng)其沖的就是網(wǎng)關(guān),因?yàn)橹行幕毫髁孔钕却虻降牡胤骄褪蔷W(wǎng)關(guān)了,如果網(wǎng)關(guān)扛不住壓力的話,那么整個(gè)系統(tǒng)將不可用。
剩下的真實(shí)流量我們采用不同的算法來(lái)分流請(qǐng)求。
流量分配
所謂打鐵還需自身硬,流量做好了調(diào)度管理后,剩下的就是服務(wù)自身的健壯性了。分布式系統(tǒng)服務(wù)出現(xiàn)故障是常有的事情,甚至我們需要把故障本身當(dāng)做是分布式服務(wù)的一部分。
我們網(wǎng)絡(luò)管理一節(jié)中介紹了網(wǎng)關(guān),網(wǎng)關(guān)是流量的集散地,而注冊(cè)中心則是服務(wù)的根據(jù)地。
服務(wù)編排的定義是:通過(guò)消息的交互序列來(lái)控制各個(gè)部分資源的交互。參與交互的資源都是對(duì)等的,沒(méi)有集中的控制。微服務(wù)環(huán)境下服務(wù)眾多我們需要有一個(gè)總的協(xié)調(diào)器來(lái)協(xié)議服務(wù)之間的依賴(lài),調(diào)用關(guān)系,K8s 則是我們的不二選擇。
前面我們解決了網(wǎng)絡(luò)的健壯性和效率問(wèn)題,這節(jié)介紹的是如何使我們的服務(wù)更加健壯。
發(fā)現(xiàn)資源管理那節(jié)我們介紹了從云平臺(tái)申請(qǐng)了容器宿主資源后,通過(guò)自動(dòng)化腳本就可以啟動(dòng)應(yīng)用服務(wù),啟動(dòng)后服務(wù)則需要發(fā)現(xiàn)注冊(cè)中心,并且把自身的服務(wù)信息注冊(cè)到服務(wù)網(wǎng)關(guān),即是網(wǎng)關(guān)接入。注冊(cè)中心則會(huì)監(jiān)控服務(wù)的不同狀態(tài),做健康檢查,把不可用的服務(wù)歸類(lèi)標(biāo)記。
降級(jí):當(dāng)用戶激增的時(shí)候,我們首先是在流量端做手腳,也就是限流。當(dāng)我們發(fā)現(xiàn)限流后系統(tǒng)響應(yīng)變慢了,有可能導(dǎo)致更多的問(wèn)題時(shí),我們也需要對(duì)服務(wù)本身做一些操作。服務(wù)降級(jí)就是把當(dāng)前不是很核心的功能關(guān)閉掉,或者不是很要緊的準(zhǔn)確性放寬范圍,事后再做一些人工補(bǔ)救。
熔斷:當(dāng)我們都做了以上的操作后,還是覺(jué)得不放心,那么就需要再進(jìn)一步操心。熔斷是對(duì)過(guò)載的一種自身保護(hù),猶如我們開(kāi)關(guān)跳閘一樣。比如當(dāng)我們服務(wù)不斷對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢的時(shí)候,如果業(yè)務(wù)問(wèn)題造成查詢問(wèn)題,這是數(shù)據(jù)庫(kù)本身需要熔斷來(lái)保證不會(huì)被應(yīng)用拖垮,并且訪問(wèn)友好的信息,告訴服務(wù)不要再盲目調(diào)用了。
數(shù)據(jù)存儲(chǔ)最大的挑戰(zhàn)就是數(shù)據(jù)冗余的管理,冗余多了效率變低而且占用資源,副本少了起不到災(zāi)備的作用,我們通常的做法是把有轉(zhuǎn)態(tài)的請(qǐng)求,通過(guò)轉(zhuǎn)態(tài)分離,轉(zhuǎn)化為無(wú)狀態(tài)請(qǐng)求。
分離狀態(tài)至全局存儲(chǔ),請(qǐng)求轉(zhuǎn)換為無(wú)狀態(tài)流量,比如我們通常會(huì)將登陸信息緩存至全局 redis 中間件,而不需要在多個(gè)應(yīng)用中去冗余用戶的登陸數(shù)據(jù)。
數(shù)據(jù)橫向擴(kuò)展。
多副本冗余。
我們從資源申請(qǐng)管理的時(shí)候就介紹到 devops 的趨勢(shì),真正做到開(kāi)發(fā)運(yùn)維一體化則需要不同的中間件來(lái)配合完成。
全局配置中心按環(huán)境來(lái)區(qū)分,統(tǒng)一管理,減少了多處配置的混亂局面。
微服務(wù)分布式部署是家常便飯,如何讓我們的服務(wù)更好地支撐業(yè)務(wù)發(fā)展,穩(wěn)健的部署策略是我們首先需要考慮的,如下的部署策略適合不同業(yè)務(wù)和不同的階段。
任務(wù)調(diào)度是系統(tǒng)必不可少的一個(gè)環(huán)節(jié),傳統(tǒng)的方式是在 Linux 機(jī)器上配置 crond 定時(shí)任務(wù)或者直接在業(yè)務(wù)代碼里面完成調(diào)度業(yè)務(wù),現(xiàn)在則是成熟的中間件來(lái)代替。
運(yùn)維工作中很大一部分時(shí)間需要對(duì)應(yīng)用進(jìn)行重啟,上下線操作,還有日志清理。
既然我們知道分布式系統(tǒng)故障是家常便飯,那么應(yīng)對(duì)故障的方案也是不可或缺的環(huán)節(jié)。通常我們有主動(dòng)和被動(dòng)的方式來(lái)處理:
重試設(shè)計(jì)的關(guān)鍵在于設(shè)計(jì)好重試的時(shí)間和次數(shù),如果超過(guò)重試次數(shù),或是一段時(shí)間,那么重試就沒(méi)有意義了。開(kāi)源的項(xiàng)目 spring-retry 可以很好地實(shí)現(xiàn)我們重試的計(jì)劃。
事務(wù)補(bǔ)償符合我們最終一致性的理念。補(bǔ)償事務(wù)不一定會(huì)將系統(tǒng)中的數(shù)據(jù)返回到原始操作開(kāi)始時(shí)其所處的狀態(tài)。 相反,它補(bǔ)償操作失敗前由已成功完成的步驟所執(zhí)行的工作。補(bǔ)償事務(wù)中步驟的順序不一定與原始操作中步驟的順序完全相反。 例如,一個(gè)數(shù)據(jù)存儲(chǔ)可能比另一個(gè)數(shù)據(jù)存儲(chǔ)對(duì)不一致性更加敏感,因而補(bǔ)償事務(wù)中撤銷(xiāo)對(duì)此存儲(chǔ)的更改的步驟應(yīng)該會(huì)首先發(fā)生。對(duì)完成操作所需的每個(gè)資源采用短期的基于超時(shí)的鎖并預(yù)先獲取這些資源,這樣有助于增加總體活動(dòng)成功的可能性。 僅在獲取所有資源后才應(yīng)執(zhí)行工作。 鎖過(guò)期之前必須完成所有操作。
由于分布式系統(tǒng)是由眾多機(jī)器共同協(xié)作的系統(tǒng),而且網(wǎng)絡(luò)也無(wú)法保證完全可用,所以我們需要建設(shè)一套對(duì)各個(gè)環(huán)節(jié)都能監(jiān)控的系統(tǒng),這樣我們才能從底層到業(yè)務(wù)各個(gè)層面進(jìn)行監(jiān)控,出現(xiàn)意外的時(shí)候可以及時(shí)修復(fù)故障,避免更多的問(wèn)題出現(xiàn)。
基礎(chǔ)層面是對(duì)容器資源的監(jiān)測(cè),包含各個(gè)硬件指標(biāo)的負(fù)載情況
分布式系統(tǒng)接入了大量的中間件平臺(tái),中間件本身的健康情況也需要監(jiān)控。
當(dāng)故障已經(jīng)發(fā)生后,我們第一個(gè)要做的就是馬上消除故障,確保系統(tǒng)服務(wù)正常可用,這個(gè)時(shí)候通常做回滾操作。
應(yīng)用回滾之前需要保存好故障現(xiàn)場(chǎng),以便排查原因。
應(yīng)用服務(wù)回滾后,代碼基線也需要 revert 到前一版本。
整體回滾需要服務(wù)編排,通過(guò)大版本號(hào)對(duì)集群進(jìn)行回滾。
性能優(yōu)化是分布式系統(tǒng)的大專(zhuān)題,涉及的面非常廣,這塊簡(jiǎn)直可以單獨(dú)拿出來(lái)做一個(gè)系列來(lái)講,本節(jié)就先不展開(kāi)。本身我們做服務(wù)治理的過(guò)程也是在性能的優(yōu)化過(guò)程。<br />參考《高并發(fā)編程知識(shí)體系》
緩存是解決性能問(wèn)題的一大利器,理想情況下,每個(gè)請(qǐng)求不需要額外計(jì)算就立刻能獲取到結(jié)果時(shí)最快。小到 CPU 的三級(jí)緩存,大到分布式緩存,緩存無(wú)處不在,分布式緩存需要解決的就是數(shù)據(jù)的一致性,這個(gè)時(shí)候我們引入了分布式鎖的概念,如何處理分布式鎖的問(wèn)題將決定我們獲取緩存數(shù)據(jù)的效率。
多線程編程模式提升了系統(tǒng)的吞吐量,但也同時(shí)帶來(lái)了業(yè)務(wù)的復(fù)雜度。
事件驅(qū)動(dòng)的異步編程是一種新的編程模式,摒棄了多線程的復(fù)雜業(yè)務(wù)處理問(wèn)題,同時(shí)能夠提升系統(tǒng)的響應(yīng)效率。
最后總結(jié)一下,如果有可能的話,請(qǐng)嘗試使用單節(jié)點(diǎn)方式而不是分布式系統(tǒng)。分布式系統(tǒng)伴隨著一些失敗的操作,為了處理災(zāi)難性故障,我們使用備份;為了提高可靠性,我們引入了冗余。
分布式系統(tǒng)本質(zhì)就是一堆機(jī)器的協(xié)同,而我們要做的就是搞出各種手段來(lái)然機(jī)器的運(yùn)行達(dá)到預(yù)期。這么復(fù)雜的系統(tǒng),需要了解各個(gè)環(huán)節(jié)、各個(gè)中間件的接入,是一個(gè)非常大的工程。慶幸的是,在微服務(wù)背景下,多數(shù)基礎(chǔ)性的工作已經(jīng)有人幫我們實(shí)現(xiàn)了。前文所描述的分布式架構(gòu),在工程實(shí)現(xiàn)了是需要用到分布式三件套 (Docker+K8S+Srping Cloud) 基本就可以構(gòu)建出來(lái)了。
分布式架構(gòu)核心技術(shù)分布圖如下:
原圖來(lái)源:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes
分布式技術(shù)棧使用中間件:
原圖來(lái)源:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes
“ 阿里巴巴云原生微信公眾號(hào)(ID:Alicloudnative)關(guān)注微服務(wù)、Serverless、容器、Service Mesh等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢(shì)、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開(kāi)發(fā)者的技術(shù)公眾號(hào)。”
網(wǎng)頁(yè)名稱(chēng):一文讀懂分布式架構(gòu)知識(shí)體系(內(nèi)含超全核心知識(shí)大圖)
網(wǎng)站地址:http://chinadenli.net/article12/geosdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航、電子商務(wù)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)