【深智書摘】從「應用」與「叢集」理解分散式系統

閱讀時間約 7 分鐘
隨著軟體複雜度的增加和使用者規模的增長,分散式系統獲得了廣泛應用。對於軟體開發者而言,掌握分散式系統的相關知識是十分必要的。
但分散式系統包括理論、實踐、專案等多方面內容。這些內容往往交織穿插在一起,給軟體開發者的學習帶來了不少困難,讓許多軟體開發者在學習過程中感到混亂和迷茫。
有鑑於此,本文將從應用結構的演進歷程談起,分析分散式系統是如何產生的,並列出判斷系統是否為分散式系統的依據。
概述
隨著軟體規模、性能要求的不斷提升,分散式系統得到快速發展。分散式系統透過許多低成本節點的協作來完成原本需要龐大單體應用才能實現的功能,在降低硬體成本的基礎上,提升了軟體的可靠性、擴充性、靈活性。
然而,分散式系統在帶來上述優點的同時,也帶來了許多技術問題。
首先,分散式系統的架構和實現需要許多分散式理論和演算法作為基礎,如CAP 定理、BASE 定理、Paxos 演算法、兩階段提交演算法、三階段提交演算法等。如果不能了解這些演算法的具體含義,則會給架構和開發工作帶來困擾。
其次,分散式系統的實現依賴大量的技術方案,如分散式鎖、分散式交易、服務發現、服務呼叫、服務保護、服務閘道等。如果對這些技術的具體實施方案和關鍵點了解不透徹,則可能會在專案中引入漏洞。
最後,分散式系統的部署需要依賴許多中介軟體,如訊息系統中介軟體、分散式協調中介軟體等。如果對這些中介軟體的功能和實現原理不清楚,則可能會導致選型和使用上的錯誤,增加應用的開發成本。
應用的演進歷程
單體應用
單體應用是最簡單和最純粹的應用形式,它就是部署在一台機器上的單一應用。單體應用中可以包含很多模組,模組之間會互相呼叫。這些呼叫都在應用內展開,十分方便。因此,單體應用是一個高度內聚的個體,其內部各個模組間是高度耦合的。
單體應用的開發、維護、部署成本低廉,適合實現一些功能簡單、併發數低、容量小的應用的開發需求。
當應用的功能變得複雜、併發數不斷增高、容量不斷變大時,單體應用的規模也會不斷擴大。這會帶來以下兩個方面的挑戰。
■硬體方面。龐大的單體應用需要與之對應的伺服器提供支援,這種伺服器被稱為「大型主機」,其購買、維護費用都極其高昂。
■軟體方面。單體應用內模組間是高度耦合的,應用規模的增大讓這種耦合變得極為複雜,這使得應用軟體的開發維護變得困難。
因此,當應用的功能足夠複雜、併發數足夠高、容量足夠大時,就需要對單體應用進行拆分,以便於對功能、併發數、容量進行分散。這就演變成了叢集應用。
叢集應用
叢集應用可以對應用的併發數、容量進行分散。叢集應用包含多個同質的應用節點,這些節點組成叢集共同對外提供服務。這裡說的「同質」是指每個應用節點執行同樣的程式、具有同樣的設定,它們像是從一個範本中複製出來的一樣。
為了讓叢集應用中的每個節點都承擔一部分併發數和容量,可以透過反向代理等手段將外界請求分散到應用的多個節點上。叢集應用的結構如圖1所示。
圖1 叢集應用的結構
但叢集應用帶來的最明顯的問題是同一個使用者發出的多個請求可能會落在不同的節點上,打破了服務的連貫性。
舉例來說,使用者發出R1、R2兩個請求,且R2的執行要依賴R1的資訊(如R1 觸發一個任務,R2用來查詢任務的執行結果)。如果R1和R2被分配到不同的節點上,則R2的操作可能無法正常執行。
為了解決上述問題,演化出以下幾種叢集方案。
▨ 無狀態的節點叢集
無狀態應用是最容易從單體形式擴充到叢集形式的一類應用。對於無狀態應用而言,假設使用者先後發出R1、R2 兩個請求,則無狀態應用無論是否在之前接收過請求R1,總對請求R2 傳回同樣的結果。即無狀態應用列出的任何一個請求的結果都和該應用之前收到的請求無關。
要想讓應用滿足無狀態,必須保證應用的狀態不會因為介面的呼叫而發生變化。查詢介面能滿足這點,舉例來說,對於使用者而言,一個新聞展示應用是無狀態的。
即使是無狀態的節點叢集,也要面對協作問題。平行喚醒問題就是一個典型的協作問題,舉例來說,一個無狀態節點叢集需要在每天淩晨對外發送一封郵件,我們會發現該叢集中的所有節點會在淩晨同時被喚醒並各自發送一封郵件。
我們希望整個節點叢集對外發送一封郵件而非讓每個節點都發送一封郵件。
在這種情況下,可以透過外部請求喚醒來解決無狀態節點叢集的平行喚醒問題。在指定時刻由外部應用發送一個請求給服務叢集觸發任務,該請求最終只會交給一個節點處理,因此實現了獨立喚醒。
無狀態節點叢集設計簡單,可以方便地進行擴充,較少遇到協作問題,但只適合無狀態應用,有很大的局限性。
很多應用是有狀態的,如某個節點接收到外部請求後修改了某物件的屬性,後面的請求再查詢物件屬性時便應該讀取到修改後的結果。如果後面的請求落到了其他節點上,則可能讀取到修改前的結果。這類應用無法擴充為無狀態的節點叢集。
▨ 單一服務的節點叢集
許多服務是有狀態的,使用者的歷史請求在應用中組成了上下文,應用必須結合上下文對使用者的請求進行回覆。舉例來說,在聊天應用中,使用者之前的對話(透過過去的請求實現)便是上下文;在遊戲應用中,使用者之前購買的裝備、晉升的等級(透過過去的請求實現)便是上下文。
有狀態的服務在處理使用者的每個請求時必須讀取和修改使用者的上下文資訊,這在單體應用中是容易實現的,但在節點叢集中,這一切就變得複雜起來。其中一個最簡單的辦法是在節點和使用者之間建立對應關係:
■任意使用者都有一個對應的節點,該節點上保存該使用者的上下文資訊。
■某個使用者的請求總落在與之對應的節點上。
使用者與指定節點的對應關係如圖2 所示。其典型特點就是各個節點是完全隔離的。這些節點執行同樣的程式,具有同樣的設定,然而卻保存了不同使用者的上下文資訊,各自服務自身對應的使用者。
圖2 使用者與指定節點的對應關係
雖然叢集包含多個節點,但是從使用者角度來看,服務某個使用者的始終是同一個節點,因此我們將這種叢集稱為單一服務的節點叢集。
實現單一服務的節點叢集要解決的問題是,如何建立和維護使用者與節點之間的對應關係。具體的實現有很多種,我們列舉常用的幾種。
■在使用者註冊帳號時由使用者自由選擇節點。很多遊戲服務就採用這種方式,讓使用者自由選擇帳號所在的區。
■在使用者註冊帳號時根據使用者所處的網路分配節點。一些郵件服務就採用這種方式。
■在使用者註冊帳號時根據使用者 ID 隨機分配節點。許多聊天應用就採用這種方式。
■在使用者登入帳號時隨機或使用規則分配節點,然後將分配結果寫入cookie,接下來根據請求中的cookie 將使用者請求分配到指定節點。
其中,最後一種方式與前幾種方式略有不同。前幾種方式能保證使用者對應的節點在整個使用者週期內不改變,而最後一種方式則只保證使用者對應的節點在一次階段週期內不改變。最後一種方式適合用在兩次階段之間無上下文關係的場景中,如一些登入應用、許可權應用等,它則只需要維護使用者這次階段內的上下文資訊。
無論採用了哪種方式,使用者的請求都會被路由傳輸到其對應的節點上。根據應用分流方案的不同,該路由操作可以由反向代理、閘道等元件完成。
單一服務的節點叢集能夠解決有狀態服務的問題,但因為各個節點之間是隔離的,無法互相備份。當某個服務節點崩潰時,會使得該節點對應的使用者失去服務。因此,這種設計方案的容錯性比較差。
看完了以上的教學,想必讀者對分散式系統會有更多的認識。
《最新世代平行運算 - 分散式系統主流框架實作指南》/ 易哥 著
為什麼會看到廣告
avatar-img
9會員
25內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
深智數位的沙龍 的其他內容
一個互動列應用就像一塊積木,可以方便地與其他互動列應用組合在一起,進而完成高度複雜的工作。這就像只要掌握26個字母,就可以組合出近乎無限的單字。
一個互動列應用就像一塊積木,可以方便地與其他互動列應用組合在一起,進而完成高度複雜的工作。這就像只要掌握26個字母,就可以組合出近乎無限的單字。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
分散式系統(Decentralization)是一種架構設計,指系統的控制權與操作不集中在單一中央實體或機構,而是分散在多個節點之間,這些節點共同協作完成系統的運作與維護。分散式系統的核心特徵是去中心化,即沒有單一的控制者。 核心概念 去中心化與集中化的區別: 集中化(Centraliza
混合雲環境組合式軟體定義基礎架構 是一種靈活的 IT 基礎架構設計,旨在滿足現代企業對多雲環境和高效能運算的需求。以下是其關鍵概念和功能的簡單解釋: 1. 核心概念: 混合雲環境:將公有雲、私有雲和本地資料中心的資源進行整合,使企業能根據需求在不同環境間靈活運用資源。 組合式基礎架構:IT
Thumbnail
去中心化应用程序(DApp)是由智能合约驱动的数字应用程序,这些程序运行在区块链上,而不是在中心化服务器上, DApp看上去与智能手机上的普通移动App类似,能够提供游戏、金融、社交媒体等各种功能和服务, 顾名思义,DApp是在去中心化点对点网络上运行的 🚀 币安 - 全球最大加密货币交易所
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
NVDIA黃仁勳演講有提到分散式運算,我還真的做了分散式運算的研究拿了個碩士,那分散式運算是做什麼的呢?用現在的時代用語”算力”來解釋的話,就是要處理的資料非常大量,但是單一伺服器的算力不足,所以必須聯合好幾台伺服器的算力來一起處理, 而要能夠做分散式運算的前提就是你要有一套可以操作分散式運算
微服務是一種分散式的專案架構,換個說法,就是將一個專案做“應用切割”,切出數個可以獨立執行的應用,如此可以降低耦合性,並提升敏捷性。 特點 低耦合 獨立部署 高可維護性 高可測試性
Thumbnail
■什麼是區塊鏈技術? 區塊鏈是透過點對點(P2P)運行的網路,這個網路由分散式節點組成,可以把它想成是共享的數據庫,也就是分散式帳本(DLT),分散式帳本技術是一種去中心化的帳本,儲存著網路上進行的所有交易。 中心化帳本:也稱為集中式帳本,由一個中心化的機構去做驗證、記帳、訂立規則。
Thumbnail
這本書從 docker 的角度出發,介紹很多可重複使用的 pattern,除了翻譯某些地方有點怪之外,算是很有趣的一本書,後面很多的 pattern 可以想成是 sidecar 的進階使用方式,在不改變應用程式的情況下,增加不同的功能,相當實用。
所謂的多型是讓一個函式或是資料結構能擁有多個不同的類型,其中上一篇文章所談的就是參數多型(parametric polymorphism),這篇文章將繼續討論特設多型(ad hoc polymorphism)。特設多型跟泛型的差別在於:泛型函式對於所有的類型只能有一種實作,而特設多型會根據類型有不同
前幾篇文章討論了類型系統的合理性,而這會影響我們對於變數與函式是什麼的理解。其中泛型是當中很重要的一個元素,很多討論都是基於泛型的使用。泛型會大大地增加類型系統的複雜度,因此有些語言選擇不提供泛型(go),但缺少泛型又會使簡單的容器都無法用類型精確描述。泛型的強大必須結合有紀律的類型系統才能顯現,但
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
分散式系統(Decentralization)是一種架構設計,指系統的控制權與操作不集中在單一中央實體或機構,而是分散在多個節點之間,這些節點共同協作完成系統的運作與維護。分散式系統的核心特徵是去中心化,即沒有單一的控制者。 核心概念 去中心化與集中化的區別: 集中化(Centraliza
混合雲環境組合式軟體定義基礎架構 是一種靈活的 IT 基礎架構設計,旨在滿足現代企業對多雲環境和高效能運算的需求。以下是其關鍵概念和功能的簡單解釋: 1. 核心概念: 混合雲環境:將公有雲、私有雲和本地資料中心的資源進行整合,使企業能根據需求在不同環境間靈活運用資源。 組合式基礎架構:IT
Thumbnail
去中心化应用程序(DApp)是由智能合约驱动的数字应用程序,这些程序运行在区块链上,而不是在中心化服务器上, DApp看上去与智能手机上的普通移动App类似,能够提供游戏、金融、社交媒体等各种功能和服务, 顾名思义,DApp是在去中心化点对点网络上运行的 🚀 币安 - 全球最大加密货币交易所
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
NVDIA黃仁勳演講有提到分散式運算,我還真的做了分散式運算的研究拿了個碩士,那分散式運算是做什麼的呢?用現在的時代用語”算力”來解釋的話,就是要處理的資料非常大量,但是單一伺服器的算力不足,所以必須聯合好幾台伺服器的算力來一起處理, 而要能夠做分散式運算的前提就是你要有一套可以操作分散式運算
微服務是一種分散式的專案架構,換個說法,就是將一個專案做“應用切割”,切出數個可以獨立執行的應用,如此可以降低耦合性,並提升敏捷性。 特點 低耦合 獨立部署 高可維護性 高可測試性
Thumbnail
■什麼是區塊鏈技術? 區塊鏈是透過點對點(P2P)運行的網路,這個網路由分散式節點組成,可以把它想成是共享的數據庫,也就是分散式帳本(DLT),分散式帳本技術是一種去中心化的帳本,儲存著網路上進行的所有交易。 中心化帳本:也稱為集中式帳本,由一個中心化的機構去做驗證、記帳、訂立規則。
Thumbnail
這本書從 docker 的角度出發,介紹很多可重複使用的 pattern,除了翻譯某些地方有點怪之外,算是很有趣的一本書,後面很多的 pattern 可以想成是 sidecar 的進階使用方式,在不改變應用程式的情況下,增加不同的功能,相當實用。
所謂的多型是讓一個函式或是資料結構能擁有多個不同的類型,其中上一篇文章所談的就是參數多型(parametric polymorphism),這篇文章將繼續討論特設多型(ad hoc polymorphism)。特設多型跟泛型的差別在於:泛型函式對於所有的類型只能有一種實作,而特設多型會根據類型有不同
前幾篇文章討論了類型系統的合理性,而這會影響我們對於變數與函式是什麼的理解。其中泛型是當中很重要的一個元素,很多討論都是基於泛型的使用。泛型會大大地增加類型系統的複雜度,因此有些語言選擇不提供泛型(go),但缺少泛型又會使簡單的容器都無法用類型精確描述。泛型的強大必須結合有紀律的類型系統才能顯現,但