技巧篇:如何在雲中構建大規模分布式系統

2020-12-17 存儲在線

 

 

很多企業和開發者在開發一款產品時,首要考慮的是產品功能的實現,其後端架構通常都是非常簡單直接的。產品在剛上線初期,由於用戶訪問壓力很小,數據量積累也並不大,在短時間內都會運行良好。

然而如今移動網際網路的普及和成熟,讓一款產品很可能在短時間內聚集大量用戶,面對流量激增、數據量翻番、訪問量指數級攀升等諸多「煩惱」,這本來是一件好事,可是如果後端系統不能及時擴展,勢必會造成響應緩慢,頻繁出錯甚至拒絕服務的情況。

即便沒有上述系統壓力突然增大的「煩惱」,產品在不斷開發升級的過程中,各種功能模塊會變的越來越複雜,如果不能很好的梳理和組織後端架構,系統出錯崩潰、不可使用的風險也會越來越大。

在沒有雲計算的時代,物理硬體從採購、上架、插線,到安裝、調試、部署,再到真正投入使用,是一個漫長而耗費人力的過程,往往跟不上系統緊急擴容的節奏。而雲服務的出現不僅僅讓我們節約了使用成本,更重要的是可以利用雲計算極度彈性的特點,讓企業和開發者根據需求,對系統進行在線快速的擴容。

但僅僅在雲服務上快速擴容是不夠的,企業也需要在業務層面,關注各個系統組件的可用性和伸縮性。接下來我來給大家介紹如果利用雲計算的優勢,結合企業的業務特點構建穩定可靠的分布式系統。

首先我們從一個最簡單的後端架構開始:

  接入層:nginx

業務層:Java application

數據層:MySQL

在雲計算環境中,網絡架構的組織非常重要,QingCloud 提供了基礎網絡和 VPC 兩種網絡,他們的區別在官網用戶指南和以前的文章中已經介紹,這裡不贅述。推薦企業使用 VPC 來構建自己的網絡,將所有主機和系統資源放置在 VPC 網絡中,指定內網網段(如 192.168.x.x / 172.16.x.x),主機可以通過內網地址進行通信,該地址不會變化。

隨著主機越來越多,IP 地址不易記憶,為了方便主機間相互識別,可以給每臺主機設置內網別名。為方便在控制臺管理,給每個資源打上標籤,按照標籤來組織分類。

接下來我們回到上面那個簡單的後端架構。隨著訪問壓力越來越大,單臺 nginx + Java application 可能不足以應付,你會看到這臺主機的 CPU 越來越忙 ,內存使用越來越多。而且這臺主機一旦故障,整個服務都不可用了。

所以我們首先調整這裡的結構,增加多臺 nignx + Java application 同時提供服務,在接入層引入負載均衡器(下文用 LB 這個詞代替),使外網請求首先發到 LB 上。LB 的選擇有很多,比如提供七層負載能力的 nginx 和 HAProxy,也有提供四層負載能力的 LVS,安裝和配置的方法各有不同。

LB 的引入可以分攤請求壓力到後端的多臺業務伺服器,並且可通過心跳檢查,自動隔離後端出現故障的伺服器,實現業務層的高可用。但這時 LB 本身也會成為一個單點,當出現故障也會導致全局不可用。所以可以使用 Keeplived 服務為 LB 提供一個副本,在一臺出問題的時候可以馬上頂上,部署方法網上有很多資料。

有人會說可以通過 DNS 輪詢到不同的 IP ,實現 LB 的高可用,但事實上這樣不行,因為一旦一臺 LB 掛掉,DNS 還會解析到這個 LB,此時即便馬上修改 DNS,在 DNS 緩存更新之前(通常要很久),服務也是不可用的。

雖然 LB 的原理並不複雜,但是部署配置有很多工作量,而且為了實現 LB 的高可用還要額外做一些事情。QingCloud 從北京3區開始提供了高性能、高可用的 LB 集群服務,可以直接拿來使用。

改造後的架構如下圖所示:

  接下來我們來思考業務層的擴展問題。首先要解決如何快速擴充業務伺服器。如果業務伺服器的運行環境和程序不會頻繁更新,可以基於已有的業務伺服器製作主機映像,當需要擴容時,直接基於映像創建新的主機,掛接到 LB 後端就可以馬上對外服務了。

此時你還可以使用 AutoScaling 功能自動化這一過程,即當到達某種觸發條件,如 LB 並發數、響應延遲達到多少後,自動觸發主機的擴容。當觸發條件不滿足時,可以回收資源。

當然如果你的業務伺服器的環境或程序需要頻繁更新,不適合做成固定模版。此時可以自己搭建自動化部署(如 Puppet / Ansible)實現業務自動擴容,這一切操作可以使用 QingCloud 的開放 API 接口,結合你的自動化部署程序完成。

此外你還需要保證業務伺服器是無狀態的,因為每次 LB 請求的後端可能不同,不能假設上一次請求和這一次請求落在同一臺業務伺服器上。如果伺服器需要保存用戶訪問的 session 信息,可將其下放到緩存或資料庫中存儲。

隨著產品功能越來越豐富,你會發現原有單一的業務項目越來越龐大,各種功能邏輯交織在一起,當一個功能出現故障,可以引發全局不可用。此時你需要考慮將單一的業務項目分拆成多個獨立子服務。子服務之間可以基於消息的通信,亦或基於 RPC 的通信方式。

子服務的調用可分為需同步處理和可異步處理兩類。你應該儘量異步化所有不需要馬上返回結果的請求。對於可異步處理的請求,我們通過引入消息隊列,為請求產生的數據做緩衝,請求的接收者(隊列消費者)可根據隊列中任務的數量做水平擴容。消息隊列的選擇有很多,例如 Redis, RabbitMQ, ActiveMQ, Kafka,QingCloud 平臺上目前已經提供分布式、可分區、多副本的消息隊列服務,具有高吞吐量、低延遲等特點,用戶可以方便的集成到自己的系統中。

如今數據分析對於企業越來越至關重要,業務伺服器在處理請求的過程中,可以將原始數據通過隊列,源源不斷地導入大數據處理系統,QingCloud 提供完善的大數據分布式處理平臺 Spark 和 Hadoop,用戶可以根據需求方便的創建,使用和擴容。

通過拆分子服務,使得我們有能力在某項子服務發生故障時,儘可能降低對於全局的影響,提高系統整體的可用性。另外,對於處理壓力比較大的子服務,我們還可以進行獨立的水平擴容,方式和前面講到的業務伺服器擴容相似,QingCloud 內網 LB 服務也可以在這裡發揮作用。

改造後的架構如下圖所示:

  隨著業務的增長,數據層面臨的壓力會越來越大,單機資料庫已經不足以支撐,接下來我們談一下數據層的分布式和擴展技術。

對於大多數的業務場景來說,數據的操作都是讀多寫少,而且讀都集中在少部分的熱點數據上,首先應該引入緩存層來緩解資料庫的讀壓力,如果緩存容量需求比較大,可以構建緩存集群,在上層按照 consistent hashing 算法將數據分散到多個節點,後續需要增加新緩存節點時,只有少部分的數據會失效。

接著引入新的資料庫種類,Redis 已經成為諸多企業的首選標配,因為其支持豐富的數據類型和數據查詢接口,且內存型的資料庫天然具有更高的性能。

你可以講業務中關係性要求不高的數據,從 MySQL 轉移到 Redis 中,尤其是列表類的數據以及計數統計類的數據。給 MySQL 減負的同時提高數據的查詢性能。

單臺 Redis 節點也許不能滿足你對容量的需求,QingCloud 平臺提供了支持多主多從 Redis 3.0 集群服務,一方面可對數據自動分區提高存儲容量,另一方面保證了服務的高可用性。

對於 MySQL 的擴展可以分為幾個步驟來做。首先,增加 MySQL slave 節點,在上層將部分讀請求分發到 slave 節點上去,由於 slave 同步可能有延時,業務應該能容忍短暫的數據不一致現象,舉例,比如你的一個用戶修改了年齡屬性,其他用戶要等一會兒才能看到他的新年齡。

QingCloud MySQL 資料庫支持一主多從的架構,並且已經在多個從節點之上做好了負載均衡,你可以輕易在界面上操作增加新的從節點來為你分擔讀壓力。

即便有 slave 作為數據副本,你也應該定期對你的資料庫進行冷備份,方便當業務出現誤操作時,能夠回滾或恢復到曾經的某個時間點。在 QingCloud 平臺上,備份的過程可以手動執行或者配置為自動任務,在備份過程中對資料庫正常使用沒有影響。

隨著數據的增長,單個資料庫不能承載完整的數據集合,並且寫操作對於單庫的壓力越來越明顯,你應該考慮分庫分表技術。將比較龐大的數據表拆分出來單獨存放,可以給主資料庫騰出來一部分空間,分擔讀寫壓力。拆分的時候,還可以按照功能邏輯,把相關聯的數據表存在一個庫裡。

當資料庫單表非常龐大,對讀寫都造成瓶頸時,你需要開始考慮水平分表 sharding,這種擴展方式可以同時解決單表容量過大,讀壓力和寫壓力很大的問題,但帶來的研發和運維難度也會增大,推薦把上述的優化做完以後,最後在有必要的情況下再做。

這裡簡略說一下水平分表的要點。首先要從數據表的欄位中,選擇一個合理的分區鍵(shard key),這個鍵應該是所有該表查詢條件裡,最經常用到的欄位,這樣才會使大部分的查詢,能夠提前判斷應該向哪些特定的分區(shard)發送請求,如果查詢條件中不帶shard key,需要遍歷所有的分區,並將結果進行merge。

有了 shard key 還要設計一種分區算法,比如常見的有按照區間,如 user_id in [0, 100] 在 shard 1,user_id in [101, 200] 在 shard2,還比如按照 hash 取模等等。設計分區算法的時候要充分考慮業務特點,多從讀寫操作的角度思考,這麼設計能否將壓力和數據均勻分攤到每個 shard 上去。

還需要考慮數據層的擴展如何對上層透明,比如引入分布式資料庫中間件,或者結合業務邏輯把資料庫操作做成一個獨立的子服務,供其它服務調用。如果不做成子服務,至少在業務代碼裡有獨立的一層來封裝對資料庫的操作。

至此,數據層的擴展示意圖如下所示:

  除了上述的結構化數據的存取以外,企業還有存儲海量小文件數據(非結構化數據)的需求,單機硬碟、LVM 和 NAS 可以作為臨時方案使用,但都無法同時滿足無限容量、高性能、高安全性、高可用性的多重需要。而自行搭建分布式存儲系統,如 Ceph、GlusterFS、HDFS 適用場景非常有限,且運維和二次開發的成本也非常高。

在 QingCloud 平臺上用戶可以使用 QingStor 對象存儲服務來存儲海量的數據文件,服務本身提供了無限容量、高擴展性、高可用性和高安全性的特性。

講完數據層的擴展技術,最後來談一下多機房部署和異地容災的話題。QingCloud 從北京3區機房開始,通過自營的骨幹網光纖和多路環網技術,使得當機房出現網絡故障時對用戶無感知,在基礎設施上保障了高可用性。但是用戶的業務如果能夠多機房部署,可以在分攤訪問負載的同時加速區域訪問,比如加速中國南北方的用戶或者海外用戶的訪問。

  如上圖所示,若是有三個機房,中間是 QingCloud 北京3區機房,負責主營業務。左邊是 QingCloud 亞太1區機房,主要服務亞太和海外的客戶。這兩個機房都使用了 QingCloud 私有網絡(VPC)部署,通過GRE或IPsec加密隧道在網絡上的互聯互通。右邊是你辦公室的物理機房,IT 人員可以在這個環境下進行開發和辦公。

在業務上實現異地多活時,通常從易到難有三個階段:第一,在備用機房搭建反向代理,用戶請求到備用機房,請求直接被轉向主機房,如果兩機房有專線互聯或延時很小,這樣部署最為簡單。第二,兩個機房同時部署業務伺服器和緩存,由於大部分數據請求可以從緩存中讀取,不用進行跨機房訪問。但當緩存失效時,依然要從主機房的資料庫去查詢。第三,兩機房同時部署全套系統,包括接入層、業務層和數據層。數據層依靠資料庫雙主或主從技術進行跨機房同步。

最後總結一下今天的分享。沒有一個所謂經典或完美的架構,只有最適合企業業務的架構,今天分享的是在最通用的業務場景下,系統在接入層、業務層和數據層的常用擴展方法。企業後端架構的演進過程是一個漫長而艱巨的過程,不可能從零開始一蹴而就,就能設計出一個萬般周全的系統,但如果設計之初能更多著眼於未來,就可以為進一步優化留出了餘地。

 

本文作者系QingCloud 系統工程師王煜

問答:

 1、企業客戶,私有雲如何建設不同規模下的分布式系統?

答:企業首先要清楚當前業務的規模有多大,比如業務的種類,服務QPS,數據的種類和數據量的大小,同時清楚業務和數據的SLA 和性能預期。只有在清楚這些的情況下,才能在規劃的過程中有權衡取捨。

雲計算環境下,基礎資源的創建和銷毀都非常迅速,要把更多關注放在業務層面的可擴展能力上,比如業務層要無狀態,數據層要做好索引,做好冷熱區分。無論規模大小,系統的組件不應該有單點故障和單點瓶頸。在規模較小的時候,系統可以不擴展,但是要具備可擴展的能力。

 2、冷熱數據管理以及數據持久化是怎麼做的?

答:更熱的數據應該被更快的訪問到,決定存取速度的因素主要是距離和介質。從距離來看 本地內存 > 本地硬碟 > 遠端內存 > 遠端硬碟,從介質來看 SSD > SAS > SATA。冷熱數據的比例一般是非常懸殊的,要將熱的數據存放到更近更好的介質上。

每一種存儲系統諸如 MySQL Redis 都有自己的數據持久化策略。

 3、數據大集中平臺的安全性是否比原來點對點接口低?

答:其實無論數據的存儲形式是怎樣的,數據的安全性主要取決於是否有冗餘,冗餘度是多少,冗餘的分布是否是跨物理機,甚至是否跨機房。數據寫入是否真正落盤,以及數據的副本是同步寫入還是異步寫入。

4、構建大型分布式平臺系統,緩存管理用redis來實現,應該注意什麼?

答:首先考慮緩存的粒度,太粗的粒度會導致失效太頻繁。還要考慮緩存容量,如果單臺節點無法承載足夠的熱點數據,在使用多節點是要注意選擇合適分布策略,比較常有的有一致性hash和hash取模。Redis3.0以上版本提供了集群能力,可以自動對數據分區,並提供高可用能力。

5、分布式資料庫、緩存,如何實現資源池化?

 答:可在資料庫服務之上增加代理中間件,有開源方案也有自己實現,對使用者提供的接口要屏蔽分布式的細節,用戶不用關心容量,性能,分布策略等,仿佛看到的是一臺單機資料庫

 6、雲計算適合哪些類型的應用,衡量標準是什麼?

答:雲計算做為 IT 基礎設施資源,在各行各業都有成功案例,已經不分適合哪類應用。唯一衡量標準就是能否滿足需求,要看是否能取代傳統硬體能夠提供的能力,並且能夠提供傳統硬體以外的能力,例如彈性伸縮,按用量計費,快速啟動銷毀等。

相關焦點

  • Dapper: 大規模分布式系統鏈路追蹤基礎設施
    現代網際網路通常被實現為複雜的大規模分布式微服務系統。這些應用可能是由不同團隊使用不同程式語言開發的軟體模塊集合構建的,並且可能跨越數千臺計算機及多個物理設備。在這樣的環境中,有一個幫助理解系統行為和關於性能問題推理的工具顯得非常寶貴。
  • 如何利用Node.js 構建分布式集群
    作為大規模使用Node.js 的雲計算服務提供商,UCloud積累了豐富的使用經驗。  本文為UCloud 公司高級工程師文天樂在深JS大會上發表的演講內容,主要介紹了UCloud內部如何利用Node.js 構建分布式集群,並分享了實踐過程中走過的坑,希望對正在使用Node.js或是即將使用Node.js的朋友有一些幫助。
  • MTC智能流量鏈構建大規模商用系統生態經濟模型機制
    在外部機會消失之後,我們所擔心的不該是外部機會何時還會再來,而是如何積極應對。但事實上,人們都在擔憂流量紅利消失,卻不關注已有的技術和自身的思維、戰略、方法是否科學、是否完備,從而主動去創造出外部機會。
  • 大規模分布式存儲如何優化?Facebook說自己的方法能把CPU負載降一半
    這是 Facebook 為了處理自己的規模過大的圖分區問題開發的方法,而且在大規模優化問題中確實發揮了作用。這項研究的論文也已經被資料庫領域著名國際會議 VLDB 2017(Very Large Data Bases)收錄。雷鋒網 AI 科技評論把這篇介紹文章編譯如下。對Facebook來說,每天它要服務的用戶是十億級別的。
  • 構建 Netflix 分布式追蹤(tracing)體系
    排除這種分布式系統的故障非常困難。調查視頻流故障需要檢查用戶帳戶的所有方面。在上一篇博文(1)中介紹了 Edgar,我們的流 sesion 故障排除工具。本文主要看我們是如何設計 Edgar 的追蹤 (tracing) 基礎設施。
  • 課程實錄:大規模高並發下的分布式存儲架構設計
    在海量數據時代,傳統存儲系統已難以滿足業務運行需求,分布式存儲大放異彩,發展迅速。但對於許多企業來說,提高存儲系統的並發性能仍然是一大挑戰,此外系統穩定性、靈活擴展能力、整合異構存儲資源的能力、以及對資源進行智能化管理的需求也不斷增長。如何解決這些問題,成為企業IT部門的重要任務。
  • 如何使用區塊鏈和分布式帳本技術構建一個可信的平臺
    打開APP 如何使用區塊鏈和分布式帳本技術構建一個可信的平臺 發表於 2019-09-02 10:18:49 我們如何使用區塊鏈和分布式帳本技術來構建一個可信的平臺,使其不能被操縱,並且能夠快速、正確地進行交易?Hedera Hashgraph產品經理Donald Thibeau分享了他的想法。 問題 即使是精明的投資者也常常會誤解,當他們在網上交易帳戶上確認一筆交易時,會發生什麼。許多人認為,下訂單或投標會導致訂單被立即處理和記錄。
  • 基於分布式帳本技術的跨境支付系統應用
    分布式帳本系統基於區塊鏈技術,主要用於構建去中心化、多中心化的應用或商業邏輯,代表性系統包括比特幣、以太坊等。當前,無鏈貨幣成為區塊鏈研究的前沿。基於有向無環圖(DAG)技術的無鏈分布式帳本的記帳模式將同步記帳提升為異步記帳,交易模式由一個入度和出度的鏈式結構轉變為多個入度和出度的樹狀結構,有效解決了傳統區塊鏈結構阻礙並發性提高的瓶頸問題。圖1展示了DAG結構存儲單元。
  • 帶著問題學習分布式系統
    看過很多關於學習的技巧、方法,卻沒應用到自己的學習中。隨著年紀變大,記憶力越來越差,整塊的時間也越來越少,於是,越來越希望能夠更高效的學習。學習是一種習慣也是一種能力,這種能力在上學期間養成是最好的,畢竟那個時候絕大部分時間都在學習。但很遺憾,我沒有養成適合自己的、好的學習習慣。
  • 如何系統性地學習分布式系統?
    本文的緣起是回答知乎圓桌會議「分布式系統之美」的問題「如何系統性地學習分布式系統?」,後面稍微整理了一下,形成了這一篇文章(知乎 ID:kylin)。學習一個知識之前,我覺得比較好的方式是先理解它的來龍去脈:即這個知識產生的過程,它解決了什麼問題,它是怎麼樣解決的,還有它引入了哪些新的問題(沒有銀彈),這樣我們才能比較好的抓到它的脈絡和關鍵點,不會一開始就迷失在細節中。
  • 大規模異構數據並行處理系統的設計、實現與實踐
    圖1 3種數據處理架構存在的問題本文基於結構分層、功能融合的設計思想,結合產業應用需求,提出了一種大規模異構數據並行處理系統,在架構上將系統分為統一的開發接口層、統一的數據計算引擎層、統一的分布式存儲管理層、統一的資源調度管理層,該系統支持多種不同的SQL和NoSQL數據處理引擎,支持結構化數據、圖數據、文檔數據、大表、JSON等類型的數據的存儲、檢索和分析,並能夠通過統一的開發接口提供數據分析服務
  • 阿里雲參與構建恒生分布式證券核心交易系統 可將交易峰值提升10倍...
    來源:金融界網站9月23日消息,阿里雲、OceanBase參與構建的恒生電子新一代證券分布式核心交易系統UF3.0在聯合壓測中表現出色,每秒交易委託次數創下行業紀錄,達到37.9萬筆,是現有交易峰值的10倍以上。
  • 如何使用Kafka在生產環境構建大規模機器學習
    AI 前線導語:這篇文章將介紹機器學習在任務關鍵型實時系統中的應用,將 Apache Kafka 作為中心化的、可伸縮的任務關鍵型系統,同時還將介紹使用 Kafka Streams API 來構建智能流式應用。
  • 區塊鏈與分布式存儲構建數據要素市場基礎設施
    分布式存儲就像分布式應用一樣有兩種技術解釋,一種是將數據分散存儲在多臺獨立的設備上,總體上實現了技術架構上的分布式,但所屬權仍然是集中式的,而在區塊鏈應用領域則表示的是以IPFS 為代表的新一代分布式存儲技術,與傳統的存儲技術不同,新一代的分布式存儲不光改變了存儲的方式,還改變了系統架構與網絡傳輸協議,讓分布式存儲真正實現了可以分布存儲在不同所有方之間,同時還實現了對於數據的隱私保護與安全
  • 百度飛槳分布式訓練在 Volcano 系統上的實踐
    2018 年 10 月,飛槳團隊發布 Paddle Fluid 1.0 版本,對神經網絡描述、大規模分布式訓練、高性能推理引擎等核心能力進行了全面升級。以工業界應用必需的分布式訓練能力為例,在最新的 Paddle Fluid 1.5.2 版本中,飛槳支持數據並行、模型並行、流水線並行等多種並行模式,參數伺服器架構和點對點同步訓練架構全面支持在 CPU、GPU 等硬體資源設備上的大規模訓練。本文將介紹飛槳分布式訓練在 Kubernetes 社區中的 Volcano 系統上進行實踐的案例。
  • 蘇州論壇|舒印彪:構建新一代電力系統
    10月19日,國家電網有限公司董事長舒印彪在第三屆國際能源變革論壇電力系統轉型分論壇上作了題為《構建新一代電力系統》的開幕致辭和主旨發言。隨著越來越多的電力電子元件接入,系統設備基礎由傳統交流設備向電力電子化轉變,電力電子設備併網存在諧波、諧振與振蕩風險,頻率分布於更寬的頻帶範圍,與火電機組次同步振蕩等問題交織,給電網無功和諧波控制帶來困難。分布式新能源、微電網、電動汽車大規模接入,系統運行特徵由潮流從電網到用戶的單向流動模式向雙向互動轉變,系統控制的複雜性大幅增加。  五是政策和市場設計的挑戰。
  • 架構師成長之路:分布式系統綜述
    我寫這篇文章不是為了勸退你們的,我們要學習必須分步驟分主題的學習,對整體的分布式技術棧分而克之,逐步掌握。4. 如何學習分布式系統的技術棧在分布式技術棧中我們可以看到,其實分布式技術是有分類的,我們可以根據不同的分類去掌握每種類別的分布式技術背後的概念和思想。
  • Docker:分布式系統的軟體工程革命(上)
    極簡版搜尋引擎在這篇帖子裡,作者Adriaan de Jonge用一個最簡單的http server作為例子,說明如何在Mac下用Docker運行一個程序。這篇帖子對我很有幫助。這和上文中介紹的在Mac主機上運行的方式是一樣的,但這不符合分布式系統的一般部署原則。 通常,為了提高處理速度、提升吞吐量和系統容錯能力,每個程序都會啟動為多個進程,運行在不同的機器上。比如,indexer程序的每個進程處理一部分數據(比如一個cralwer進程的輸出)。這樣的並行處理提升建立索引的效率。
  • 什麼是分布式存儲?Filecoin 的深入研究
    今天我們這篇文章將對於分布式存儲進行介紹,並對Filecoin進行深入研究。01定 義分布式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統採用集中的存儲伺服器存放所有數據,存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網絡存儲系統採用可擴展的系統結構,利用多臺存儲伺服器分擔存儲負荷,利用位置伺服器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易於擴展。
  • 什麼是分布式系統,這麼講不信你不會
    我曾在網絡上搜索過」如何學習分布式系統「,也在知乎上關注了該話題,但並沒有看到一個全面的、有指導意義的答案。本文的目標是給打算全面學習分布式系統的自己、以及感興趣的讀者指明一條可行的路徑,使得之後的學習不再盲目。