一文詳解:如何設計出高可用的分布式架構?

2020-12-16 51CTO

本文作者將與大家分享目前主流的分布式架構、分布式架構中常見理論以及如何才能設計出高可用的分布式架構。

在分布式架構中,SOA 和微服務架構是最常見的兩種分布式架構,而且目前服務網格的概念也越來越火了,我們就先從這些常見的架構開始。

SOA 架構解析

SOA 全稱是:Service Oriented Architecture,中文釋義為 「面向服務的架構」。

它是一種設計理念,其中包含多個服務,服務之間通過相互依賴最終提供一系列完整的功能。

各個服務通常以獨立的形式部署運行,服務之間通過網絡進行調用,架構圖如下:

跟 SOA 相提並論的還有一個 ESB(企業服務總線),簡單來說 ESB 就是一根管道,用來連接各個服務節點。

ESB 的存在是為了集成基於不同協議的不同服務,ESB 做了消息的轉化、解釋以及路由的工作,以此來讓不同的服務互聯互通。

隨著我們業務越來越複雜,會發現服務越來越多。SOA 架構下,它們的調用關係會變成如下形式:

很顯然,這樣不是我們所想要的,那這時候如果我們引入 ESB 的概念,項目調用就會很清晰,如下:

SOA 所要解決的核心問題是:

  • 系統間的集成:我們站在系統的角度來看,首先要解決各個系統間的通信問題。目的是將原先系統間散亂、無規劃的網狀結構,梳理成規整、可治理的星形結構,這步的實現往往需要引入一些概念和規範。

比如 ESB、以及技術規範、服務管理規範;這一步解決的核心問題是【有序】。

  • 系統的服務化:我們站在功能的角度,需要把業務邏輯抽象成可復用、可組裝的服務,從而通過服務的編排實現業務的快速再生。

目的是要把原先固有的業務功能抽象設計為通用的業務服務、實現業務邏輯的快速復用;這步要解決的核心問題是【復用】。

  • 業務的服務化:我們站在企業的角度,要把企業職能抽象成可復用、可組裝的服務,就要把原先職能化的企業架構轉變為服務化的企業架構,以便進一步提升企業的對外服務的能力。

「前面兩步都是從技術層面來解決系統調用、系統功能復用的問題」。而本步驟,則是以業務驅動把一個業務單元封裝成一項服務。要解決的核心問題是 【高效】。

微服務(Microservices)架構解析

微服務架構和 SOA 架構非常類似,微服務是 SOA 的升華,只不過微服務架構強調的是「業務需要徹底的組件化及服務化」,原單個業務系統會被拆分為多個可以獨立開發、設計、部署運行的小應用。

這些小應用間通過服務化完成交互和集成。 組件表示的就是一個可以獨立更換和升級的單元,就像 PC 中的 CPU、內存、顯卡、硬碟一樣,獨立且可以更換升級而不影響其他單元。

若我們把 PC 中的各個組件以服務的方式構 建,那麼這臺 PC 只需要維護主板(可以理解為 ESB)和一些必要的外部設備就可以。

CPU、內存、硬碟等都是以組件方式提供服務,例如 PC 需要調用 CPU 做計算處理,只需知道 CPU 這個組件的地址就可以了。

微服務的特徵:

  • 通過服務實現組件化  
  • 按業務能力來劃分服務和開發團隊
  • 去中心化
  • 基礎設施自動化(DevOps、自動化部署)

SOA 和微服務架構的差別

微服務不再強調傳統 SOA 架構裡面比較重的 ESB 企業服務總線,同時以 SOA 的思想進入到單個業務系統內部實現真正的組件化。

Docker 容器技術的出現,為微服務提供了非常便利的條件,比如更小的部署單元,每個服務可以通過類似 Spring Boot 或者 Node 等技術獨立運行。

還有一個點大家應該可以分析出來,SOA 注重的是系統集成,而微服務關注的是完全分離。

服務網格(Service Mesh)架構解析

2017 年年底,非侵入式的 Service Mesh 技術慢慢走向了成熟。Service Mesh ,中文釋義「服務網格」,作為服務間通信的基礎設施層在系統中存在。

如果要用一句話來解釋什麼叫 Service Mesh,我們可以將它比作是應用程式或者說微服務間的 TCP/IP,負責服務間的網絡調用、熔斷、限流和監控。

我們都知道在編寫應用程式時程序猿一般都無須關心 TCP/IP 這一層(比如提供 HTTP 協議的 Restful 應用)。

同樣如果使用服務網格我們也就不需要關心服務間的那些原來是由應用程式或者其他框架實現的事情(熔斷、限流、監控等),現在只要交給 Service Mesh 就可以了。

服務網格架構圖如下:

目前流行的 Service Mesh 開源軟體有:Linkerd、Envoy 和 Istio。而最近 Buoyant(開源 Linkerd 的公司)又發布了基於 Kubernetes 的 Service Mesh 開源項目 Conduit。

關於微服務和服務網格的區別,我這樣理解:微服務更注重服務之間的生態,專注於服務治理等方面,而服務網格更專注於服務之間的通信,以及和 DevOps 更好的結合等。

服務網格的特徵:

  • 應用程式間通訊的中間層
  • 輕量級網絡代理
  • 應用程式無感知
  • 解耦應用程式的重試/超時、監控、追蹤和服務發現

分布式架構的基本理論

在說 CAP、BASE 理論之前,我們先要了解下分布式一致性的問題。對於不同業務的服務,我們對數據一致性的要求是不一樣的。

例如 12306,它要求數據的嚴格一致性,不能把票賣給用戶以後卻發現沒有座位了。

再比如銀行轉帳, 我們通過銀行轉帳的時候,一般都會收到一個提示:轉帳申請將會在 24 小時內到帳。

實際上這個場景滿足的是最終錢只要轉帳成功了即可,同時如果錢沒匯出去還要保證資金不丟失。

所以說,用戶在使用不同的服務的時候對數據一致性的要求是不一樣的。

關於分布式一致性問題

分布式系統中要解決的一個非常重要的問題就是數據的複製。

在我們的日常開發經驗中,相信大多數開發人員都遇過這樣的問題:在做資料庫讀寫分離的場景中,假設客戶端 A 將系統中的一個值 V 由 V1 變更為 V2。

但客戶端 B 無法立即讀取到 V 的***值,而需要在一段時間之後才能讀取到。這再正常不過了,因為資料庫複製之間是存在延時的。

所謂分布式一致性的問題,就是指在分布式環境中引入數據複製機制後,不同數據節點之間可能會出現的、且無法依靠計算機應用程式自身解決的數據不一致的情況。

簡單來說, 數據一致性就是指在對一個副本數據進行變更的時候,必須確保也能夠更新其他的副本,否則不同副本之間的數據將出現不一致。

那麼如何去解決這個問題呢?按照正常的思路,我們可能會想到既然是網絡延遲導致的問題,那麼我們就把同步動作進行阻塞,用戶 2 在查詢的時候必須要等數據同步完成以後再來做。

但這個方案會非常影響性能。如果同步的數據比較多或比較頻繁,那麼阻塞操作可能會導致整個新系統不可用。

故我們沒有辦法找到一種既能夠滿足數據一致性、 又不影響系統性能的方案,所以就誕生了一個一致性的級別:

  • 強一致性:這種一致性級別是***用戶直覺的,它要求系統寫入的是什麼,讀出來的也要是什麼,用戶體驗好,但實現起來往往對系統的性能影響較大。
  • 弱一致性:這種一致性級別約束了系統在寫入成功後, 不保證立即可以讀到寫入的值,也不保證多久之後數據能夠達到一致,但會儘可能地保證到某個時間級別(如秒級別)後,數據能夠達到一致狀態。
  • 最終一致性:最終一致性其實是弱一致性的一個特例,系統會保證在一定時間內,能夠達到數據一致的狀態。

這裡之所以將最終一致性單獨提出來,是因為它是弱一致性中非常推崇的一種一致性模型,也是業界在大型分布式系統的數據一致性上用的比較多的一致性模型。

CAP 理論

CAP 理論是一個經典的分布式系統理論。它告訴我們:一個分布式系統不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)及分區容錯性(P:Partition tolerance) 這三個基本要求,最多只能同時滿足其中兩項。

CAP 理論在網際網路界有著廣泛的知名度,也被稱為「帽子理論」,它是由 Eric Brewer 教授在 2000 年舉行的 ACM 研討會提出的一個著名猜想。

一致性(Consistency)、可用性(Availability)、分區容錯 (Partition-tolerance)三者無法在分布式系統中被同時滿足,並且最多只能滿足兩個:

  • 一致性:所有節點上的數據時刻保持同步。
  • 可用性:每個請求都能接收一個響應,無論響應成功或失敗。
  • 分區容錯:系統應該持續提供服務,即使系統內部(某個節點分區)有消息丟失。

比如交換機失敗、網址網絡被分成幾個子網,形成腦裂、伺服器發生網絡延遲或死機,導致某些 server 與集群中的其他機器失去聯繫。

分區是導致分布式系統可靠性問題的固有特性,從本質上來看,CAP 理論的準確描述不應該是從 3 個特性中選取兩個,所以我們只能被迫適應,根本沒有選擇權。

CAP 並不是一個普適性原理和指導思想,它僅適用於原子讀寫的 NoSQL 場景中,並不適用於資料庫系統。

BASE 理論

從前面的分析中我們知道:在分布式(資料庫分片或分庫存在的多個實例上)前提下,CAP 理論並不適合資料庫事務。

因為更新一些錯誤的數據而導致的失敗,無論使用什麼高可用方案都是徒勞的,因為數據發生了無法修正的錯誤。

此外 XA 事務雖然保證了資料庫在分布式系統下的 ACID (原子性、一致性、隔離性、持久性)特性,但同時也帶來了一些性能方面的代價,對於並發和響應時間要求都比較高的電商平臺來說,是很難接受的。

eBay 嘗試了另外一條完全不同的路,放寬了資料庫事務的 ACID 要求,提出了一套名為 BASE 的新準則。

BASE 全稱為 Basically Available(基本可用),Soft state(軟狀態),和 Eventually consistent(最終一致性)三個短語的縮寫。相對於 CAP 來說,它大大降低了我們對系統的要求。

Basically Available(基本可用)

表示在分布式系統出現不可預知的故障時,允許瞬時部分可用性:

  • 比如我們在淘寶上搜索商品,正常情況下是在 0.5s 內返回查詢結果,但是由於後端的系統故障導致查詢響應時間變成了 2s。
  • 再比如資料庫採用分片模式,100W 個用戶數據分在 5 個資料庫實例上,如果破壞了一個實例,那麼可用性還有 80%,也就是 80% 的用戶都可以登錄,系統仍然可用。
  • 電商大促時,為了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。

Soft-state(軟狀態)

表示系統中的數據存在中間狀態,並且這個中間狀態的存在不會影響系統的整體可用性,也就是表示系統允許在不同節點的數據副本之間進行數據同步過程中存在延時。

比如訂單狀態,有一個待支付、支付中、支付成功、支付失敗,那麼支付中就是一個中間狀態,這個中間狀態在支付成功以後,在支付表中的狀態同步給訂單狀態之前,中間會存在一個時間內的不一致。

Eventually consistent(數據的最終一致性)

表示的是所有數據副本在一段時間的同步後最終都能達到一個一致的狀態,因此最終一致性的本質是要保證數據最終達到一致,而不需要實時保證系統數據的強一致。

BASE 理論的核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,採用適當的方式來使系統達到最終一致性。

分布式架構下的高可用設計

避免單點故障:

  • 負載均衡技術(failover/選址/硬體負載/ 軟體負載/去中心化的軟體負載(gossip(redis- cluster)))
  • 熱備(Linux HA)
  • 多機房(同城災備、異地災備)

應用的高可用性:

  • 故障監控(系統監控(CPU、內存)/鏈路監控/日誌監控) 自動預警
  • 應用的容錯設計、(服務降級、限流)自我保護能力
  • 數據量(數據分片、讀寫分離)

分布式架構下的可伸縮設計:

加速靜態內容訪問速度的 CDN

CDN 全稱是 Content Delivery Network,中文釋義是內容分發網絡。

CDN 的作用是把用戶需要的內容分發到離用戶最近的地方進行響應,這樣用戶能夠快速獲取所需要的內容。

CDN 本質上就是一種網絡緩存技術,能夠把一些相對穩定的資源放到距離最終用戶較近的地方,一方面可以節省整個廣域網的帶寬消耗,另外一方面也可以提升用戶的訪問速度、改善用戶體驗。

現實系統中我們一般會把靜態的文件(圖片、腳本、靜態頁面等)放到 CDN 中:

  • 當用戶訪問網站頁面上的內容 URL,經過本地 DNS 系統解析,DNS 系統最終會將域名的解析權交給 CNAME 指向的 CDN 專用 DNS 伺服器。
  • CDN 的 DNS 伺服器將 CDN 的全局負載均衡設備 IP 地址返回用戶。
  • 用戶向 CDN 的全局負載均衡設備發起內容 URL 訪問請求。
  • CDN 全局負載均衡設備根據用戶 IP 地址,以及用戶請求的內容 URL, 選擇一臺用戶所屬區域的區域負載均衡設備,告訴用戶向這臺設備發起請求。
  • 區域負載均衡設備會為用戶選擇一臺合適的緩存伺服器提供服務。選擇的依據包括:根據用戶 IP 地址,判斷哪一臺伺服器距離用戶最近。

根據用戶所請求的 URL 中攜帶的內容名稱,判斷哪一臺伺服器上有用戶所需內容;查詢各個伺服器當前的負載情況,判斷哪一臺伺服器上有服務能力。

  • 基於以上條件的綜合分析之後,區域負載均衡設備會向全局負載均衡設備返回一臺緩存伺服器的 IP 地址。
  • 全局負載均衡設備把伺服器的 IP 地址返回給用戶。用戶向緩存伺服器發起請求,緩存伺服器響應用戶請求,將用戶所需內容返回到用戶終端。

如果這臺緩存伺服器上並沒有用戶想要的內容,而區域均衡設備依然將它分配給了用戶,那麼這臺伺服器就要向它的上一級緩存伺服器請求內容,直到追溯到包含該內容的源伺服器並將內容拉到本地。

什麼情況下用 CDN?

最適合的是那些不會經常變化的內容,比如圖片,JS 文件,CSS 文件。圖片文件包括程序模板中 CSS 文件中用到的背景圖片,還有就是作為網站內容組成部分的那些圖片等等。

灰度發布

我們的應用即使經過了測試部門的測試,也仍然很難全面覆蓋用戶的使用場景。

為了保證萬無一失,我們在進行發布的時候一般都會採用灰度發布,也就是會對新應用進行分批發布,逐步擴大新應用在整個及集群中的比例直到***全部完成。灰度發布是說針對新應用在用戶體驗方面完全無感知。

灰度發布系統的作用在於,可以根據自己的配置,來將用戶的流量導到新上線的系統上,來快速驗證新的功能。

而一旦出問題,也可以馬上的回滾發布,簡單的說,就是一套 A/B Test 系統:

總結

通過本文,我們就對主流的 SOA 架構、微服務架構、服務網格架構做了解析,然後知道了分布式架構中的幾個基本理論,然後還分析了如何設計出高可用的分布式架構。

【編輯推薦】

【責任編輯:

武曉燕

TEL:(010)68476606】

點讚 0

相關焦點

  • 一文理解分布式架構
    本文轉載自【微信公眾號:手機電腦雙黑客,ID:heikestudio】經微信公眾號授權轉載,如需轉載與原文作者聯繫一、什麼是分布式架構分布式系統(distributed system) 是建立在網絡之上的軟體系統。內聚性:是指每一個資料庫分布節點高度自治,有本地的資料庫管理系統。
  • 課程實錄:大規模高並發下的分布式存儲架構設計
    在海量數據時代,傳統存儲系統已難以滿足業務運行需求,分布式存儲大放異彩,發展迅速。但對於許多企業來說,提高存儲系統的並發性能仍然是一大挑戰,此外系統穩定性、靈活擴展能力、整合異構存儲資源的能力、以及對資源進行智能化管理的需求也不斷增長。如何解決這些問題,成為企業IT部門的重要任務。
  • 一文讀懂2021年Linux架構!超詳細!
    首次公開BAT等網際網路公司、系統架構,腳本代碼、架構設計、構建思路、排錯指南,直觀呈現於「Linux全套7本書」「從編寫這本書到問世總共耗時6年時間精心打磨,這是國內IT行業書籍很少有的創作經歷,但這也從源頭保證了書籍內容的高品質和無窮的創意,相信當您拿到書籍的那一刻,便能體會到我們的努力。讓您學習的每節課都能有收穫,對得起您付出的時間、精力和購書款。牛!
  • 一文總結:分布式一致性技術是如何演進的?
    阿里妹導讀:分布式一致性(Consensus)作為分布式系統的基石,一直都是計算機系統領域的熱點。近年來隨著分布式系統的規模越來越大,對可用性和一致性的要求越來越高,分布式一致性的應用也越來越廣泛。縱觀分布式一致性在工業界的應用,從最開始的鼻祖Paxos的一統天下,到橫空出世的Raft的流行,再到如今Leaderless的EPaxos開始備受關注,背後的技術是如何演進的?本文將從技術角度探討分布式一致性在工業界的應用,並從可理解性、可用性、效率和適用場景等幾個角度進行對比分析。文末福利:《分布式文件存儲系統技術及實現》技術公開課。
  • 使用48V分布式電源架構解決汽車電氣化難題
    此外,它還可為提高性能特性並減少二氧化碳排放提供令人振奮的全新設計選項。如何最大化 48V 供電網絡增加 48V 電池,為更重的動力總成及底盤系統負載供電,可為工程師提供各種選項。此外,分布式電源架構還有顯著的熱管理及電源系統冗餘優勢(圖 4)。
  • 分布式系列之一:架構的演進過程
    0、分布式系統的意義 1. 升級單機處理能力的性價比越來越低單機的處理能力主要依靠 CPU、內存、磁碟。通過更換硬體做垂直擴展的方式來提升性能,成本會越來越高。 2.
  • 架構師成長之路:分布式系統綜述
    作為一個資深架構師,一路走來,發現自己的技術水平很多時候其實是隨著項目的發展被迫成長的。其實,很多時候,自身水平達不到能順利完成架構項目的水平,但是,為了挑戰,為了技術成長,更是為了高薪資,只能咬牙堅持,熬夜學習,最終讓自己能順利設計和把控項目的架構。其中,最為艱難的,就是去設計、架構、規劃一整套,規模大的分布式系統。
  • 華為自爆宇宙級:基於SpringBoot+Cloud微服務分布式架構實戰手冊
    Spring Boot以及Spring Cloud作為現在最火的技術,同時也是面試過程中必然會被問到的點,小編今天開源的這份手冊就是以分布式架構結合微服務實例的方式,介紹Spring Boot+Spring Cloud的基礎知識、架構順序和操作方法。
  • 架構師視角|分布式緩存如何選擇?
    由一或多個哨兵實例監視任意個主從伺服器,且在 Master 宕機時,自動將宕機伺服器屬下的 Slave 伺服器升級為 主伺服器,從而保證系統的可用性。較主從實現的監控、選主。但問題主要是要保證 Master 的 HA 切換。
  • 架構設計
    設計模式類這一類圖書則一下子進入架構的局部細節,每個模式的來龍去脈並不容易理解。就算理解了某個具體的模式,但是也很難真正做到活學活用,不知道還是不知道。分布式系統架構設計類這類圖書通常從服務端的通用問題如一致性、高可用、高並發挑戰等話題講起,講大型業務系統面臨的挑戰。
  • 郭憶:網易資料庫高可用架構最新進展!
    分享大綱:  1、資料庫高可用發展歷程  2、Aurora高可用架構設計  3、MGR高可用架構設計  4、網易多副本數據一致高可用架構設計  正文:  1、資料庫高可用發展歷程  首先我們先來簡單回顧一下資料庫高可用的發展歷程,最原始的資料庫高可用的做法是基於replication快速搭建主從複製架構。
  • 48V分布式電源架構重新定義汽車供電
    根據電池充電狀態(SoC),系統不斷計算並向控制器提供電池能夠提供或接受電流量的更新信息,在低SoC下降低功率需求,而在高SoC下限制再生發電。系統還可實時監控所有可用電池的溫度,並將結果反饋到可用的功率計算中。此外,如果出現問題,它可以打開接觸器,安全地隔離電池組。
  • 分布式系統架構與雲原生—阿里雲《雲原生架構白皮書》導讀
    1 雲原生與分布式系統架構的關係  1.1 雲原生架構的定義  《雲原生架構白皮書》中對於雲原生架構的定義為「基於雲原生技術的一組架構原則和設計模式的集合,旨在將雲應用中的非業務代碼部分進行最大化的剝離,從而讓雲設施接管應用中原有的大量非功能特性(如彈性、韌性、
  • 光大銀行分布式實戰:國內最大繳費平臺的資料庫架構轉型
    (文末有獲取本期PPT&回放的方式,不要錯過) 於樹文 光大銀行資深DBA 目前在中國光大銀行信息科技部資料庫管理團隊主要負責分布式資料庫建設項目,推進行內技術架構轉型等相關工作。
  • 哪種Scale out架構能更有效滿足分布式計算?
    近些年,隨著「分布式」計算的越來越火熱,Scale out分布式應用架構也如雨後春筍般不斷湧現,大到Big Data平臺架構,小到前端應用App的架構,似乎都要基於Scale out 的架構才算是與時俱進的先進架構。
  • SpringCloud:分布式微服務架構
    概念微服務是一種架構風格,它是一種將一個單一應用程式開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信採用輕量級通信機制(通常採用http)。這些服務圍繞業務能力構建並且可通過全自動部署機制獨立部署,這些服務共用一個最小型的集中式的管理,服務可用不同的語言開發,使用不同的數據存儲技術。特徵每個微服務可獨立運行在自己的進程中。一系列獨立運行的微服務共同構建起整個系統。
  • 6年拉力經驗,學了P8架構師的7+1+1落地項目,跳槽阿里年薪40W+
    服務端主從架構設計腦裂問題終極解決方案永不宕機隨時在線之服務高可用設計方案彈性伸縮雖易擴展之服務高擴展設計方案無限擴流極限承壓之服務高性能設計方案任你左顧右盼我自恆定不變之冪等>阿里P8級架構師第二篇:幹億流量高並發高可用分布式系統之技術底層支撐篇(面試)技術底層支撐之內存I0/網絡I0/磁碟I0技術底層支撐之多線程與高並發(單機)技術底層支撐之JVM調優技術底層支撐之JMM詳解
  • 美團T9都說太「強」了,以微服務分布式的實戰詳解SpringCloud
    隨著微服務架構的興起,國內的IT企業特別是網際網路公司近年來都逐步引入了微服務技術並使其在實踐中落地,實施微服務架構最流行的方案非SpringCloud莫屬。從企業的真實需求出發,理論結合實際,深入講解SpringCloud微服務和分布式系統的知識。
  • 該如何保障系統的高可用?
    在討論伺服器領域的時候,我們常常會聽到「高可用」一詞,那麼「高可用」到底是什麼意思,應該怎麼去理解呢?高可用(HA)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。
  • 什麼是微內核架構設計?
    阿里妹導讀:作為一名Java程式設計師,相信同學們都聽說過微內核架構設計,也有自己的理解。那麼微內核是如何被提出來的?微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。