溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

發(fā)布時間:2020-06-18 05:03:05 來源:網(wǎng)絡 閱讀:2225 作者:阿里系統(tǒng)軟件技術(shù) 欄目:云計算

作者 | 曉土??阿里巴巴高級工程師

姊妹篇閱讀推薦:[云原生時代,分布式系統(tǒng)設計必備知識圖譜(內(nèi)含22個知識點)](http://mp.weixin.qq.com/s?__biz=MzUzNzYxNjAzMg==&mid=2247486600&idx=1&sn=0ad92a1fe535f141fe2e8c87ffbd1229&chksm=fae50747cd928e51c05c41d2cc206069babbe9dfdba5957c52ac6e77cb754192169bb6b3e898&scene=21#wechat_redirect)

導讀:本文力求從分布式基礎理論、架構(gòu)設計模式、工程應用、部署運維、業(yè)界方案這幾大方面,介紹基于 MSA(微服務架構(gòu))的分布式知識體系大綱,從而對 SOA 到 MSA 進化有著立體的認識;從概念上和工具應用上更近一步了解微服務分布式的本質(zhì),身臨其境的感受如何搭建全套微服務架構(gòu)的過程。

關(guān)注“阿里巴巴云原生”公眾號,回復“分布”,即可下載分布式系統(tǒng)及其知識體系清晰大圖!

隨著移動互聯(lián)網(wǎng)的發(fā)展和智能終端的普及,計算機系統(tǒng)早就從單機獨立工作過渡到多機器協(xié)作,集群按照分布式理論構(gòu)建出龐大復雜的應用服務,在分布式的基礎上正進行一場云原生的技術(shù)革命,徹底打破傳統(tǒng)的開發(fā)方式,解放了新一代的生產(chǎn)力。

分布式系統(tǒng)知識體系大圖

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)cdn.com/d16a1bbbb104cad78fe989c3f11828614c75e946.png">

關(guān)注“阿里巴巴云原生”公眾號,回復“**分布**”,即可下載分布式系統(tǒng)及其知識體系清晰大圖!

基礎理論

SOA 到 MSA 的進化

SOA 面向服務架構(gòu)

由于業(yè)務發(fā)展到一定程度后,需要對服務進行解耦,進而把一個單一的大系統(tǒng)按邏輯拆分成不同的子系統(tǒng),通過服務接口來通訊。面向服務的設計模式,最終需要總線集成服務,而且大部分時候還共享數(shù)據(jù)庫,出現(xiàn)單點故障時會導致總線層面的故障,更進一步可能會把數(shù)據(jù)庫拖垮,所以才有了更加獨立的設計方案的出現(xiàn)。

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

MSA 微服務架構(gòu)

微服務是真正意義上的獨立服務,從服務入口到數(shù)據(jù)持久層,邏輯上都是獨立隔離的,無需服務總線來接入,但同時也增加了整個分布式系統(tǒng)的搭建和管理難度,需要對服務進行編排和管理,所以伴隨著微服務的興起,微服務生態(tài)的整套技術(shù)棧也需要無縫接入,才能支撐起微服務的治理理念。

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

節(jié)點與網(wǎng)絡

節(jié)點

傳統(tǒng)的節(jié)點也就是一臺單體的物理機,所有的服務都揉進去包括服務和數(shù)據(jù)庫;隨著虛擬化的發(fā)展,單臺物理機往往可以分成多臺虛擬機,實現(xiàn)資源利用的最大化,節(jié)點的概念也變成單臺虛擬機上面服務;近幾年容器技術(shù)逐漸成熟后,服務已經(jīng)徹底容器化,也就是節(jié)點只是輕量級的容器服務??傮w來說,節(jié)點就是能提供單位服務的邏輯計算資源的集合。

網(wǎng)絡

分布式架構(gòu)的根基就是網(wǎng)絡,不管是局域網(wǎng)還是公網(wǎng),沒有網(wǎng)絡就無法把計算機聯(lián)合在一起工作,但是網(wǎng)絡也帶來了一系列的問題。網(wǎng)絡消息的傳播有先后,消息丟失和延遲是經(jīng)常發(fā)生的事情,我們定義了三種網(wǎng)絡工作模式:

  • 同步網(wǎng)絡
    • 節(jié)點同步執(zhí)行
    • 消息延遲有限
    • 高效全局鎖
  • 半同步網(wǎng)絡
    • 鎖范圍放寬
  • 異步網(wǎng)絡
    • 節(jié)點獨立執(zhí)行
    • 消息延遲無上限
    • 無全局鎖
    • 部分算法不可行

常用網(wǎng)絡傳輸層有兩大協(xié)議的特點簡介:

  • TCP 協(xié)議
    • 首先 tcp 協(xié)議傳輸可靠,盡管其他的協(xié)議可以更快傳輸
    • tcp 解決重復和亂序問題
  • UDP 協(xié)議
    • 常量數(shù)據(jù)流
    • 丟包不致命

時間與順序

時間

慢速物理時空中,時間獨自在流淌著,對于串行的事務來說,很簡單的就是跟著時間的腳步走就可以,先來后到的發(fā)生。而后我們發(fā)明了時鐘來刻畫以往發(fā)生的時間點,時鐘讓這個世界井然有序。但是對于分布式世界來說,跟時間打交道著實是一件痛苦的事情。

分布式世界里面,我們要協(xié)調(diào)不同節(jié)點之間的先來后到關(guān)系,不同節(jié)點本身承認的時間又各執(zhí)己見,于是我們創(chuàng)造了網(wǎng)絡時間協(xié)議(NTP)試圖來解決不同節(jié)點之間的標準時間,但是 NTP 本身表現(xiàn)并不盡如人意,所以我們又構(gòu)造出了邏輯時鐘,最后改進為向量時鐘:

  • NTP 的一些缺點,無法完全滿足分布式下并發(fā)任務的協(xié)調(diào)問題
    • 節(jié)點間時間不同步
    • 硬件時鐘漂移
    • 線程可能休眠
    • 操作系統(tǒng)休眠
    • 硬件休眠

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

  • 邏輯時鐘
    • 定義事件先來后到
    • t' = max(t, t_msg + 1)

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

  • 向量時鐘
    • t_i' = max(t_i, t_msg_i)
  • 原子鐘
順序

有了衡量時間的工具,解決順序問題自然就是水到渠成了。因為整個分布式的理論基礎就是如何協(xié)商不同節(jié)點的一致性問題,而順序則是一致性理論的基本概念,所以前文我們才需要花時間介紹衡量時間的刻度和工具。

一致性理論

說到一致性理論,我們必須看一張關(guān)于一致性強弱對系統(tǒng)建設影響的對比圖:

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

該圖對比了不同一致性算法下的事務、性能、錯誤、延遲的平衡。

強一致性 ACID

單機環(huán)境下我們對傳統(tǒng)關(guān)系型數(shù)據(jù)庫有苛刻的要求,由于存在網(wǎng)絡的延遲和消息丟失,ACID 便是保證事務的原則,這四大原則甚至我們都不需要解釋出來就耳熟能詳了:

  • Atomicity:原子性,一個事務中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié);
  • Consistency:一致性,在事務開始之前和事務結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞;
  • Isolation:隔離性,數(shù)據(jù)庫允許多個并發(fā)事務同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時,由于交叉執(zhí)行而導致數(shù)據(jù)的不一致;
  • Durabilit:事務處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。
分布式一致性 CAP

分布式環(huán)境下,我們無法保證網(wǎng)絡的正常連接和信息的傳送,于是發(fā)展出了 CAP/FLP/DLS 這三個重要的理論:

  • CAP:分布式計算系統(tǒng)不可能同時確保一致性(Consistency)、可用性(Availablity)和分區(qū)容忍性(Partition);<br />
  • FLP:在異步環(huán)境中,如果節(jié)點間的網(wǎng)絡延遲沒有上限,只要有一個惡意的節(jié)點存在,就沒有算法能在有限的時間內(nèi)達成共識;<br />
  • DLS:
    • 在一個部分同步網(wǎng)絡的模型(也就是說:網(wǎng)絡延時有界限但是我們并不知道在哪里)下運行的協(xié)議可以容忍 1/3 任意(換句話說,拜占庭)錯誤;
    • 在一個異步模型中的確定性的協(xié)議(沒有網(wǎng)絡延時上限)不能容錯(不過這個論文沒有提起隨機化算法可以容忍 1/3 的錯誤);
    • 同步模型中的協(xié)議(網(wǎng)絡延時可以保證小于已知 d 時間),可以令人吃驚的達到 100% 容錯,雖然對 1/2 的節(jié)點出錯可以發(fā)生的情況有所限制。
弱一致性 BASE

多數(shù)情況下,其實我們也并非一定要求強一致性,部分業(yè)務可以容忍一定程度的延遲一致,所以為了兼顧效率,發(fā)展出來了最終一致性理論 BASE。BASE 是指基本可用(Basically Available)、軟狀態(tài)( Soft State)、最終一致性( Eventual Consistency):

  • 基本可用(Basically Available):基本可用是指分布式系統(tǒng)在出現(xiàn)故障的時候,允許損失部分可用性,即保證核心可用;
  • 軟狀態(tài)(Soft State):軟狀態(tài)是指允許系統(tǒng)存在中間狀態(tài),而該中間狀態(tài)不會影響系統(tǒng)整體可用性。分布式存儲中一般一份數(shù)據(jù)至少會有三個副本,允許不同節(jié)點間副本同步的延時就是軟狀態(tài)的體現(xiàn);
  • 最終一致性(Eventual Consistency):最終一致性是指系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過一定時間后,最終能夠達到一致的狀態(tài)。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。
一致性算法

分布式架構(gòu)的核心就在于一致性的實現(xiàn)和妥協(xié),那么如何設計一套算法來保證不同節(jié)點之間的通信和數(shù)據(jù)達到無限趨向一致性,就非常重要了。保證不同節(jié)點在充滿不確定性網(wǎng)絡環(huán)境下能達成相同副本的一致性是非常困難的,業(yè)界對該課題也做了大量的研究。

首先我們要了解一致性的大前提原則?(CALM):
CALM 原則的全稱是 Consistency and Logical Monotonicity ,主要描述的是分布式系統(tǒng)中單調(diào)邏輯與一致性的關(guān)系,它的內(nèi)容如下,參考?consistency as logical monotonicity。

  • 在分布式系統(tǒng)中,單調(diào)的邏輯都能保證 “最終一致性”,這個過程中不需要依賴中心節(jié)點的調(diào)度;
  • 任意分布式系統(tǒng),如果所有的非單調(diào)邏輯都有中心節(jié)點調(diào)度,那么這個分布式系統(tǒng)就可以實現(xiàn)最終“一致性”。

然后再關(guān)注分布式系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)?CRDT(Conflict-Free Replicated Data Types):
我們了解到分布式一些規(guī)律原則之后,就要著手考慮如何來實現(xiàn)解決方案,一致性算法的前提是數(shù)據(jù)結(jié)構(gòu),或者說一切算法的根基都是數(shù)據(jù)結(jié)構(gòu),設計良好的數(shù)據(jù)結(jié)構(gòu)加上精妙的算法可以高效的解決現(xiàn)實的問題。經(jīng)過前人不斷的探索,我們得知分布式系統(tǒng)被廣泛采用的數(shù)據(jù)結(jié)構(gòu) CRDT。
參考《談談 CRDT》,A comprehensive study of Convergent and Commutative Replicated Data Types

  • 基于狀態(tài)(state-based):即將各個節(jié)點之間的 CRDT 數(shù)據(jù)直接進行合并,所有節(jié)點都能最終合并到同一個狀態(tài),數(shù)據(jù)合并的順序不會影響到最終的結(jié)果;
  • 基于操作(operation-based):將每一次對數(shù)據(jù)的操作通知給其他節(jié)點。只要節(jié)點知道了對數(shù)據(jù)的所有操作(收到操作的順序可以是任意的),就能合并到同一個狀態(tài)。

了解數(shù)據(jù)結(jié)構(gòu)后,我們需要來關(guān)注一下分布式系統(tǒng)的一些重要的協(xié)議HATs(Highly Available Transactions),ZAB(Zookeeper Atomic Broadcast):
參考《高可用事務》,《ZAB 協(xié)議分析》

最后要學習的是業(yè)界主流的一致性算法?:
說實話具體的算法我也還沒完全搞懂,一致性算法是分布式系統(tǒng)最核心本質(zhì)的內(nèi)容,這部分的發(fā)展也會影響架構(gòu)的革新,不同場景的應用也催生不同的算法。

  • Paxos:《優(yōu)雅的Paxos算法》
  • Raft :《Raft 一致性算法》
  • Gossip:《Gossip Visualization》

這一節(jié)我們說完分布式系統(tǒng)里面核心理論基礎,如何達成不同節(jié)點之間的數(shù)據(jù)一致性,下面我們將會講到目前都有哪些主流的分布式系統(tǒng)。

場景分類

文件系統(tǒng)

單臺計算機的存儲始終有上限,隨著網(wǎng)絡的出現(xiàn),多臺計算機協(xié)作存儲文件的方案也相繼被提出來。最早的分布式文件系統(tǒng)其實也稱為網(wǎng)絡文件系統(tǒng),第一個文件服務器在 1970 年代被發(fā)展出來。在 1976 年迪吉多公司設計出 File Access Listener(FAL),而現(xiàn)代分布式文件系統(tǒng)則出自赫赫有名的 Google 的論文,《The Google File System》奠定了分布式文件系統(tǒng)的基礎?,F(xiàn)代主流分布式文件系統(tǒng)參考《分布式文件系統(tǒng)對比》,下面列舉幾個常用的文件系統(tǒng):

  • HDFS
  • FastDFS
  • Ceph
  • mooseFS

數(shù)據(jù)庫

數(shù)據(jù)庫當然也屬于文件系統(tǒng),主數(shù)據(jù)增加了事務、檢索、擦除等高級特性,所以復雜度又增加了,既要考慮數(shù)據(jù)一致性也得保證足夠的性能。傳統(tǒng)關(guān)系型數(shù)據(jù)庫為了兼顧事務和性能的特性,在分布式方面的發(fā)展有限,非關(guān)系型數(shù)據(jù)庫擺脫了事務的強一致性束縛,達到了最終一致性的效果,從而有了飛躍的發(fā)展,NoSql(Not Only Sql) 也產(chǎn)生了多個架構(gòu)的數(shù)據(jù)庫類型,包括 KV、列式存儲、文檔類型等。

  • 列式存儲:Hbase
  • 文檔存儲:Elasticsearch,MongoDB
  • KV 類型:Redis
  • 關(guān)系型:Spanner

計算

分布式計算系統(tǒng)構(gòu)建在分布式存儲的基礎上,充分發(fā)揮分布式系統(tǒng)的數(shù)據(jù)冗余災備,多副本高效獲取數(shù)據(jù)的特性,進而并行計算,把原本需要長時間計算的任務拆分成多個任務并行處理,從而提高了計算效率。分布式計算系統(tǒng)在場景上分為離線計算、實時計算和流式計算。

  • 離線:Hadoop
  • 實時:Spark
  • 流式:Storm,F(xiàn)link/Blink

緩存

緩存作為提升性能的利器無處不在,小到 CPU 緩存架構(gòu),大到分布式應用存儲。分布式緩存系統(tǒng)提供了熱點數(shù)據(jù)的隨機訪問機制,大大了提升了訪問時間,但是帶來的問題是如何保證數(shù)據(jù)的一致性,引入分布式鎖來解決這個問題,主流的分布式存儲系統(tǒng)基本就是 Redis 了。

  • 持久化:Redis
  • 非持久化:Memcache

消息

分布式消息隊列系統(tǒng)是消除異步帶來的一系列復雜步驟的一大利器,在多線程高并發(fā)場景下,我們常常需要謹慎設計業(yè)務代碼,來保證多線程并發(fā)情況下不出現(xiàn)資源競爭導致的死鎖問題。而消息隊列以一種延遲消費的模式將異步任務都存到隊列,然后再逐個消化。

  • Kafka
  • RabbitMQ
  • RocketMQ
  • ActiveMQ

監(jiān)控

分布式系統(tǒng)從單機到集群的形態(tài)發(fā)展,復雜度也大大提高,所以對整個系統(tǒng)的監(jiān)控也是必不可少。

  • Zookeeper

應用

分布式系統(tǒng)的核心模塊就是在應用如何處理業(yè)務邏輯,應用直接的調(diào)用依賴于特定的協(xié)議來通信,有基于 RPC 協(xié)議的,也有基于通用的 HTTP 協(xié)議。

  • HSF
  • Dubbo

日志

錯誤對應分布式系統(tǒng)是家常便飯,而且我們設計系統(tǒng)的時候,本身就需要把容錯作為普遍存在的現(xiàn)象來考慮。那么當出現(xiàn)故障的時候,快速恢復和排查故障就顯得非常重要了。分布式日志采集存儲和檢索則可以給我們提供有力的工具來定位請求鏈路中出現(xiàn)問題的環(huán)節(jié)。

  • 日志采集:flume
  • 日志存儲:ElasticSearch/Solr,SLS
  • 日志定位:Zipkin

賬本

前文我們提到所謂分布式系統(tǒng),是迫于單機的性能有限,而堆硬件卻又無法無休止的增加,單機堆硬件最終也會遇到性能增長曲線的瓶頸。于是我們才采用了多臺計算機來干同樣的活,但是這樣的分布式系統(tǒng)始終需要中心化的節(jié)點來監(jiān)控或者調(diào)度系統(tǒng)的資源,即使該中心節(jié)點也可能是多節(jié)點組成。區(qū)塊鏈則是真正的區(qū)中心化分布式系統(tǒng),系統(tǒng)里面只有 P2P 網(wǎng)絡協(xié)議各自通信,沒有真正意義的中心節(jié)點,彼此按照區(qū)塊鏈節(jié)點的算力、權(quán)益等機制來協(xié)調(diào)新區(qū)塊的產(chǎn)生。

  • 比特幣
  • 以太坊

設計模式

上節(jié)我們列舉了不同場景下不同分布式系統(tǒng)架構(gòu)扮演的角色和實現(xiàn)的功能,本節(jié)我們更進一步歸納分布式系統(tǒng)設計的時候是如何考慮架構(gòu)設計的、不同設計方案直接的區(qū)別和側(cè)重點、不同場景需要選擇合作設計模式,來減少試錯的成本,設計分布式系統(tǒng)需要考慮以下的問題。

可用性

可用性是系統(tǒng)運行和工作的時間比例,通常以正常運行時間的百分比來衡量。它可能受系統(tǒng)錯誤、基礎架構(gòu)問題、惡意attack和系統(tǒng)負載的影響。分布式系統(tǒng)通常為用戶提供服務級別協(xié)議(SLA),因此應用程序必須設計為最大化可用性。

  • 健康檢查:系統(tǒng)實現(xiàn)全鏈路功能檢查,外部工具定期通過公開端點訪問系統(tǒng)
  • 負載均衡:使用隊列起到削峰作用,作為請求和服務之間的緩沖區(qū),以平滑間歇性的重負載
  • 節(jié)流:限制應用級別、租戶或整個服務所消耗資源的范圍

數(shù)據(jù)管理

數(shù)據(jù)管理是分布式系統(tǒng)的關(guān)鍵要素,并影響大多數(shù)質(zhì)量的屬性。由于性能,可擴展性或可用性等原因,數(shù)據(jù)通常托管在不同位置和多個服務器上,這可能帶來一系列挑戰(zhàn)。例如,必須維護數(shù)據(jù)一致性,并且通常需要跨不同位置同步數(shù)據(jù)。

  • 緩存:根據(jù)需要將數(shù)據(jù)從數(shù)據(jù)存儲層加載到緩存
  • CQRS(Command Query Responsibility Segregation): 命令查詢職責分離
  • 事件溯源:僅使用追加方式記錄域中完整的系列事件
  • 索引表:在經(jīng)常查詢引用的字段上創(chuàng)建索引
  • 物化視圖:生成一個或多個數(shù)據(jù)預填充視圖
  • 拆分:將數(shù)據(jù)拆分為水平的分區(qū)或分片

設計與實現(xiàn)

良好的設計包括諸如組件設計和部署的一致性、簡化管理和開發(fā)的可維護性、以及允許組件和子系統(tǒng)用于其他應用程序和其他方案的可重用性等因素。在設計和實施階段做出的決策對分布式系統(tǒng)和服務質(zhì)量和總體擁有成本產(chǎn)生巨大影響。

  • 代理:反向代理
  • 適配器: 在現(xiàn)代應用程序和遺留系統(tǒng)之間實現(xiàn)適配器層
  • 前后端分離: 后端服務提供接口供前端應用程序調(diào)用
  • 計算資源整合:將多個相關(guān)任務或操作合并到一個計算單元中
  • 配置分離:將配置信息從應用程序部署包中移出到配置中心
  • 網(wǎng)關(guān)聚合:使用網(wǎng)關(guān)將多個單獨的請求聚合到一個請求中
  • 網(wǎng)關(guān)卸載:將共享或?qū)S梅展δ苄遁d到網(wǎng)關(guān)代理
  • 網(wǎng)關(guān)路由:使用單個端點將請求路由到多個服務
  • 領導人選舉:通過選擇一個實例作為負責管理其他實例管理員,協(xié)調(diào)分布式系統(tǒng)的云
  • 管道和過濾器:將復雜的任務分解為一系列可以重復使用的單獨組件
  • 邊車:將應用的監(jiān)控組件部署到單獨的進程或容器中,以提供隔離和封裝
  • 靜態(tài)內(nèi)容托管:將靜態(tài)內(nèi)容部署到 CDN,加速訪問效率

消息

分布式系統(tǒng)需要一個連接組件和服務的消息傳遞中間件,理想情況是以松散耦合的方式,以便最大限度地提高可伸縮性。異步消息傳遞被廣泛使用,并提供許多好處,但也帶來了諸如消息排序,冪等性等挑戰(zhàn)

  • 競爭消費者:多線程并發(fā)消費
  • 優(yōu)先級隊列: 消息隊列分優(yōu)先級,優(yōu)先級高的先被消費

管理與監(jiān)控

分布式系統(tǒng)在遠程數(shù)據(jù)中心運行,無法完全控制基礎結(jié)構(gòu),這使管理和監(jiān)視比單機部署更困難。應用必須公開運行時信息,管理員可以使用這些信息來管理和監(jiān)視系統(tǒng),以及支持不斷變化的業(yè)務需求和自定義,而無需停止或重新部署應用。

性能與擴展

性能表示系統(tǒng)在給定時間間隔內(nèi)執(zhí)行任何操作的響應性,而可伸縮性是系統(tǒng)處理負載增加而不影響性能或容易增加可用資源的能力。分布式系統(tǒng)通常會遇到變化的負載和活動高峰,特別是在多租戶場景中,幾乎是不可能預測的。相反,應用應該能夠在限制范圍內(nèi)擴展以滿足需求高峰,并在需求減少時進行擴展??缮炜s性不僅涉及計算實例,還涉及其他元素,如數(shù)據(jù)存儲、消息隊列等。

彈性

彈性是指系統(tǒng)能夠優(yōu)雅地處理故障并從故障中恢復。分布式系統(tǒng)通常是多租戶,使用共享平臺服務、競爭資源和帶寬,通過 Internet 進行通信,以及在商用硬件上運行,意味著出現(xiàn)瞬態(tài)和更永久性故障的可能性增加。為了保持彈性,必須快速有效地檢測故障并進行恢復。

  • 隔離:將應用程序的元素隔離到池中,以便在其中一個失敗時,其他元素將繼續(xù)運行
  • 斷路器:處理連接到遠程服務或資源時可能需要不同時間修復的故障
  • 補償交易:撤消一系列步驟執(zhí)行的工作,這些步驟共同定義最終一致的操作
  • 健康檢查:系統(tǒng)實現(xiàn)全鏈路功能檢查,外部工具定期通過公開端點訪問系統(tǒng)
  • 重試:通過透明地重試先前失敗的操作,使應用程序在嘗試連接到服務或網(wǎng)絡資源時處理預期的臨時故障

安全

安全性是系統(tǒng)能夠防止在設計使用之外的惡意或意外行為,并防止泄露或丟失信息。分布式系統(tǒng)在受信任的本地邊界之外的 Internet 上運行,通常向公眾開放,并且可以為不受信任的用戶提供服務。必須以保護應用程序免受惡意attack,限制僅允許對已批準用戶的訪問,并保護敏感數(shù)據(jù)。

  • 聯(lián)合身份:將身份驗證委派給外部身份提供商
  • 看門人: 通過使用專用主機實例來保護應用程序和服務,該實例充當客戶端與應用程序或服務之間的代理,驗證和清理請求,并在它們之間傳遞請求和數(shù)據(jù)
  • 代客鑰匙:使用為客戶端提供對特定資源或服務的受限直接訪問的令牌或密鑰

工程應用

前文我們介紹了分布式系統(tǒng)的核心理論,面臨的一些難題和解決問題的折中思路,羅列了現(xiàn)有主流分布式系統(tǒng)的分類,而且歸納了建設分布式系統(tǒng)的一些方法論,那么接下來我們將從工程角度來介紹搭建分布式系統(tǒng)包含的內(nèi)容和步驟。

資源調(diào)度

巧婦難為無米之炊,我們一切的軟件系統(tǒng)都是構(gòu)建在硬件服務器的基礎上。從最開始的物理機直接部署軟件系統(tǒng),到虛擬機的應用,最后到了資源上云容器化,硬件資源的使用也開始了集約化的管理。本節(jié)對比的是傳統(tǒng)運維角色對應的職責范圍,在 devops 環(huán)境下,開發(fā)運維一體化,我們要實現(xiàn)的也是資源的靈活高效使用。

彈性伸縮

過去軟件系統(tǒng)隨著用戶量增加需要增加機器資源的話,傳統(tǒng)的方式就是找運維申請機器,然后部署好軟件服務接入集群,整個過程依賴的是運維人員的人肉經(jīng)驗,效率低下而且容易出錯。微服務分布式則無需人肉增加物理機器,在容器化技術(shù)的支撐下,我們只需要申請云資源,然后執(zhí)行容器腳本即可。

  • 應用擴容:用戶激增需要對服務進行擴展,包括自動化擴容,峰值過后的自動縮容<br />
  • 機器下線:對于過時應用,進行應用下線,云平臺收回容器宿主資源<br />
  • 機器置換:對于故障機器,可供置換容器宿主資源,服務自動啟動,無縫切換
網(wǎng)絡管理

有了計算資源后,另外最重要的就是網(wǎng)絡資源了。在現(xiàn)有的云化背景下,我們幾乎不會直接接觸到物理的帶寬資源,而是直接由云平臺統(tǒng)一管理帶寬資源。我們需要的是對網(wǎng)絡資源的最大化應用和有效的管理。

  • 域名申請:應用申請配套域名資源的申請,多套域名映射規(guī)則的規(guī)范
  • 域名變更:域名變更統(tǒng)一平臺管理
  • 負載管理:多機應用的訪問策略設定
  • 安全外聯(lián):基礎訪問鑒權(quán),攔截非法請求
  • 統(tǒng)一接入:提供統(tǒng)一接入的權(quán)限申請平臺,提供統(tǒng)一的登錄管理
故障快照

在系統(tǒng)故障的時候我們第一要務是系統(tǒng)恢復,同時保留案發(fā)現(xiàn)場也是非常重要的,資源調(diào)度平臺則需要有統(tǒng)一的機制保存好故障現(xiàn)場。

  • 現(xiàn)場保留:內(nèi)存分布,線程數(shù)等資源現(xiàn)象的保存,如 JavaDump 鉤子接入
  • 調(diào)試接入:采用字節(jié)碼技術(shù)無需侵入業(yè)務代碼,可以供生產(chǎn)環(huán)境現(xiàn)場日志打點調(diào)試

流量調(diào)度

在我們建設好分布式系統(tǒng)后,最先受到考驗的關(guān)口就是網(wǎng)關(guān)了,進而我們需要關(guān)注系統(tǒng)流量的情況,也就是如何對流量的管理,我們追求的是在系統(tǒng)可容納的流量上限內(nèi),把資源留給最優(yōu)質(zhì)的流量使用、把非法惡意的流量擋在門外,這樣節(jié)省成本的同時確保系統(tǒng)不會被沖擊崩潰。

負載均衡

負載均衡是我們對服務如何消化流量的通用設計,通常分為物理層的底層協(xié)議分流的硬負載均衡和軟件層的軟負載。負載均衡解決方案已經(jīng)是業(yè)界成熟的方案,我們通常會針對特定業(yè)務在不同環(huán)境進行優(yōu)化,常用有如下的負載均衡解決方案

  • 交換機
  • F5
  • LVS/ALI-LVS
  • Nginx/Tengine
  • VIPServer/ConfigServer
網(wǎng)關(guān)設計

負載均衡首當其沖的就是網(wǎng)關(guān),因為中心化集群流量最先打到的地方就是網(wǎng)關(guān)了,如果網(wǎng)關(guān)扛不住壓力的話,那么整個系統(tǒng)將不可用。

  • 高性能:網(wǎng)關(guān)設計第一需要考慮的是高性能的流量轉(zhuǎn)發(fā),網(wǎng)關(guān)單節(jié)點通常能達到上百萬的并發(fā)流量
  • 分布式:出于流量壓力分擔和災備考慮,網(wǎng)關(guān)設計同樣需要分布式
  • 業(yè)務篩選:網(wǎng)關(guān)同設計簡單的規(guī)則,排除掉大部分的惡意流量
流量管理
  • 請求校驗:請求鑒權(quán)可以把多少非法請求攔截,清洗
  • 數(shù)據(jù)緩存:多數(shù)無狀態(tài)的請求存在數(shù)據(jù)熱點,所以采用 CDN 可以把相當大一部分的流量消費掉
流控控制

剩下的真實流量我們采用不同的算法來分流請求。

  • 流量分配

    • 計數(shù)器
    • 隊列
    • 漏斗
    • 令牌桶
    • 動態(tài)流控
  • 流量限制在流量激增的時候,通常我們需要有限流措施來防止系統(tǒng)出現(xiàn)雪崩,那么就需要預估系統(tǒng)的流量上限,然后設定好上限數(shù),但流量增加到一定閾值后,多出來的流量則不會進入系統(tǒng),通過犧牲部分流量來保全系統(tǒng)的可用性。
    • 限流策略
    • QPS 粒度
    • 線程數(shù)粒度
    • RT 閾值
    • 限流工具 - Sentinel

服務調(diào)度

所謂打鐵還需自身硬,流量做好了調(diào)度管理后,剩下的就是服務自身的健壯性了。分布式系統(tǒng)服務出現(xiàn)故障是常有的事情,甚至我們需要把故障本身當做是分布式服務的一部分。

注冊中心

我們網(wǎng)絡管理一節(jié)中介紹了網(wǎng)關(guān),網(wǎng)關(guān)是流量的集散地,而注冊中心則是服務的根據(jù)地。

  • 狀態(tài)類型:第一好應用服務的狀態(tài),通過注冊中心就可以檢測服務是否可用
  • 生命周期:應用服務不同的狀態(tài)組成了應用的生命周期
版本管理
  • 集群版本:集群不用應用有自身對應的版本號,由不同服務組成的集群也需要定義大的版本號
  • 版本回滾:在部署異常的時候可以根據(jù)大的集群版本進行回滾管理
服務編排

服務編排的定義是:通過消息的交互序列來控制各個部分資源的交互。參與交互的資源都是對等的,沒有集中的控制。微服務環(huán)境下服務眾多我們需要有一個總的協(xié)調(diào)器來協(xié)議服務之間的依賴,調(diào)用關(guān)系,K8s 則是我們的不二選擇。

  • K8s
  • Spring Cloud
    • HSF
    • ZK+Dubbo
服務控制

前面我們解決了網(wǎng)絡的健壯性和效率問題,這節(jié)介紹的是如何使我們的服務更加健壯。

  • 發(fā)現(xiàn)資源管理那節(jié)我們介紹了從云平臺申請了容器宿主資源后,通過自動化腳本就可以啟動應用服務,啟動后服務則需要發(fā)現(xiàn)注冊中心,并且把自身的服務信息注冊到服務網(wǎng)關(guān),即是網(wǎng)關(guān)接入。注冊中心則會監(jiān)控服務的不同狀態(tài),做健康檢查,把不可用的服務歸類標記。

    • 網(wǎng)關(guān)接入
    • 健康檢查
  • 降級:當用戶激增的時候,我們首先是在流量端做手腳,也就是限流。當我們發(fā)現(xiàn)限流后系統(tǒng)響應變慢了,有可能導致更多的問題時,我們也需要對服務本身做一些操作。服務降級就是把當前不是很核心的功能關(guān)閉掉,或者不是很要緊的準確性放寬范圍,事后再做一些人工補救。

    • 降低一致性約束
    • 關(guān)閉非核心服務
    • 簡化功能
  • 熔斷:當我們都做了以上的操作后,還是覺得不放心,那么就需要再進一步操心。熔斷是對過載的一種自身保護,猶如我們開關(guān)跳閘一樣。比如當我們服務不斷對數(shù)據(jù)庫進行查詢的時候,如果業(yè)務問題造成查詢問題,這是數(shù)據(jù)庫本身需要熔斷來保證不會被應用拖垮,并且訪問友好的信息,告訴服務不要再盲目調(diào)用了。

    • 閉合狀態(tài)
    • 半開狀態(tài)
    • 斷開狀態(tài)
    • 熔斷工具- Hystrix
  • 冪等:我們知道,一個冪等操作的特點是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。那么就需要對單次操作賦予一個全局的 id 來做標識,這樣多次請求后我們可以判斷來源于同個客戶端,避免出現(xiàn)臟數(shù)據(jù)。
    • 全局一致性 ID
    • Snowflake

數(shù)據(jù)調(diào)度

數(shù)據(jù)存儲最大的挑戰(zhàn)就是數(shù)據(jù)冗余的管理,冗余多了效率變低而且占用資源,副本少了起不到災備的作用,我們通常的做法是把有轉(zhuǎn)態(tài)的請求,通過轉(zhuǎn)態(tài)分離,轉(zhuǎn)化為無狀態(tài)請求。

狀態(tài)轉(zhuǎn)移

分離狀態(tài)至全局存儲,請求轉(zhuǎn)換為無狀態(tài)流量,比如我們通常會將登陸信息緩存至全局 redis 中間件,而不需要在多個應用中去冗余用戶的登陸數(shù)據(jù)。

分庫分表

數(shù)據(jù)橫向擴展。

分片分區(qū)

多副本冗余。

自動化運維

我們從資源申請管理的時候就介紹到 devops 的趨勢,真正做到開發(fā)運維一體化則需要不同的中間件來配合完成。

配置中心

全局配置中心按環(huán)境來區(qū)分,統(tǒng)一管理,減少了多處配置的混亂局面。

  • switch
  • diamend
部署策略

微服務分布式部署是家常便飯,如何讓我們的服務更好地支撐業(yè)務發(fā)展,穩(wěn)健的部署策略是我們首先需要考慮的,如下的部署策略適合不同業(yè)務和不同的階段。

  • 停機部署
  • 滾動部署
  • 藍綠部署
  • 灰度部署
  • A/B 測試
作業(yè)調(diào)度

任務調(diào)度是系統(tǒng)必不可少的一個環(huán)節(jié),傳統(tǒng)的方式是在 Linux 機器上配置 crond 定時任務或者直接在業(yè)務代碼里面完成調(diào)度業(yè)務,現(xiàn)在則是成熟的中間件來代替。

  • SchedulerX
  • Spring 定時任務
應用管理

運維工作中很大一部分時間需要對應用進行重啟,上下線操作,還有日志清理。

  • 應用重啟
  • 應用下線
  • 日志清理

容錯處理

既然我們知道分布式系統(tǒng)故障是家常便飯,那么應對故障的方案也是不可或缺的環(huán)節(jié)。通常我們有主動和被動的方式來處理:

  • 主動是在錯誤出現(xiàn)的時候,我們試圖再試試幾次,說不定就成功了,成功的話就可以避免了該次錯誤
  • 被動方式是錯誤的事情已經(jīng)發(fā)生了,為了挽回,我們只是做時候處理,把負面影響降到最小
重試設計

重試設計的關(guān)鍵在于設計好重試的時間和次數(shù),如果超過重試次數(shù),或是一段時間,那么重試就沒有意義了。開源的項目 spring-retry 可以很好地實現(xiàn)我們重試的計劃。

事務補償

事務補償符合我們最終一致性的理念。補償事務不一定會將系統(tǒng)中的數(shù)據(jù)返回到原始操作開始時其所處的狀態(tài)。 相反,它補償操作失敗前由已成功完成的步驟所執(zhí)行的工作。補償事務中步驟的順序不一定與原始操作中步驟的順序完全相反。 例如,一個數(shù)據(jù)存儲可能比另一個數(shù)據(jù)存儲對不一致性更加敏感,因而補償事務中撤銷對此存儲的更改的步驟應該會首先發(fā)生。對完成操作所需的每個資源采用短期的基于超時的鎖并預先獲取這些資源,這樣有助于增加總體活動成功的可能性。 僅在獲取所有資源后才應執(zhí)行工作。 鎖過期之前必須完成所有操作。

全棧監(jiān)控

由于分布式系統(tǒng)是由眾多機器共同協(xié)作的系統(tǒng),而且網(wǎng)絡也無法保證完全可用,所以我們需要建設一套對各個環(huán)節(jié)都能監(jiān)控的系統(tǒng),這樣我們才能從底層到業(yè)務各個層面進行監(jiān)控,出現(xiàn)意外的時候可以及時修復故障,避免更多的問題出現(xiàn)。

基礎層

基礎層面是對容器資源的監(jiān)測,包含各個硬件指標的負載情況

  • CPU、IO、內(nèi)存、線程、吞吐
中間件

分布式系統(tǒng)接入了大量的中間件平臺,中間件本身的健康情況也需要監(jiān)控。

應用層
  • 性能監(jiān)控:應用層面的需要對每個應用服務的實時指標(qps,rt),上下游依賴等進行監(jiān)控
  • 業(yè)務監(jiān)控:除了應用本身的監(jiān)控程度,業(yè)務監(jiān)控也是保證系統(tǒng)正常的一個環(huán)節(jié),通過設計合理的業(yè)務規(guī)則,對異常的情況做報警設置
監(jiān)控鏈路
  • zipkin/eagleeye
  • sls
  • goc
  • Alimonitor

故障恢復

當故障已經(jīng)發(fā)生后,我們第一個要做的就是馬上消除故障,確保系統(tǒng)服務正??捎?,這個時候通常做回滾操作。

應用回滾

應用回滾之前需要保存好故障現(xiàn)場,以便排查原因。

基線回退

應用服務回滾后,代碼基線也需要 revert 到前一版本。

版本回滾

整體回滾需要服務編排,通過大版本號對集群進行回滾。

性能調(diào)優(yōu)

性能優(yōu)化是分布式系統(tǒng)的大專題,涉及的面非常廣,這塊簡直可以單獨拿出來做一個系列來講,本節(jié)就先不展開。本身我們做服務治理的過程也是在性能的優(yōu)化過程。<br />參考《高并發(fā)編程知識體系》

分布式鎖

緩存是解決性能問題的一大利器,理想情況下,每個請求不需要額外計算就立刻能獲取到結(jié)果時最快。小到 CPU 的三級緩存,大到分布式緩存,緩存無處不在,分布式緩存需要解決的就是數(shù)據(jù)的一致性,這個時候我們引入了分布式鎖的概念,如何處理分布式鎖的問題將決定我們獲取緩存數(shù)據(jù)的效率。

高并發(fā)

多線程編程模式提升了系統(tǒng)的吞吐量,但也同時帶來了業(yè)務的復雜度。

異步

事件驅(qū)動的異步編程是一種新的編程模式,摒棄了多線程的復雜業(yè)務處理問題,同時能夠提升系統(tǒng)的響應效率。

總結(jié)

最后總結(jié)一下,如果有可能的話,請嘗試使用單節(jié)點方式而不是分布式系統(tǒng)。分布式系統(tǒng)伴隨著一些失敗的操作,為了處理災難性故障,我們使用備份;為了提高可靠性,我們引入了冗余。

分布式系統(tǒng)本質(zhì)就是一堆機器的協(xié)同,而我們要做的就是搞出各種手段來然機器的運行達到預期。這么復雜的系統(tǒng),需要了解各個環(huán)節(jié)、各個中間件的接入,是一個非常大的工程。慶幸的是,在微服務背景下,多數(shù)基礎性的工作已經(jīng)有人幫我們實現(xiàn)了。前文所描述的分布式架構(gòu),在工程實現(xiàn)了是需要用到分布式三件套 (Docker+K8S+Srping Cloud) 基本就可以構(gòu)建出來了。

分布式架構(gòu)核心技術(shù)分布圖如下:

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

原圖來源:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes

分布式技術(shù)棧使用中間件:

一文讀懂分布式架構(gòu)知識體系(內(nèi)含超全核心知識大圖)

原圖來源:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes

“ 阿里巴巴云原生微信公眾號(ID:Alicloudnative)關(guān)注微服務、Serverless、容器、Service Mesh等技術(shù)領域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的技術(shù)公眾號。”

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI