淺談集群、分布式、微服務的異同
什么是集群
集群是指將多臺服務器集中在一起,每臺服務器都實現相同的業務,做相同的事情。但是每臺服務器并不是缺一不可,存在的作用主要是緩解并發壓力和單點故障轉移問題。我們可以利用一些廉價的符合工業標準的硬件構造高擴展、高性能、低成本、高可用的系統。
集群主要具有以下特性:
- 伸縮性(Scalability)
在一些大的系統中,預測最終用戶的數量和行為是非常困難的,伸縮性是指系統適應不斷增長的用戶數的能力。提高這種并發會話能力的一種最直觀的方式就是增加資源(CPU,內存,硬盤等),集群是解決這個問題的另一種方式,它允許一組服務器組在一起,像單個服務器一樣分擔處理一個繁重的任務,我們只需要將新的服務器加入集群中即可,對于客戶來看,服務無論從連續性還是性能上都幾乎沒有變化,好像系統在不知不覺中完成了升級。
- 高可用性(High availability)
單一服務器的解決方案并不是一個健壯方式,因為容易出現單點失效。像銀行、賬單處理這樣一些關鍵的應用程序是不能容忍的,哪怕是幾分鐘的死機。它們需要這樣一些服務在任何時間都可以訪問并在可預期的合理時間周期內有響應。高可用性集群的出現就是為了使集群的整體服務盡可能可用,以便考慮計算硬件和軟件的易錯性。如果高可用性集群中的主節點發生了故障,那么這段時間內將由次節點代替它。次節點通常是主節點的鏡像,所以當它代替主節點時,它可以完全接管其身份。因此系統環境對于用戶是一致的。
- 負載均衡(Load balancing)
負載均衡集群為企業需求提供了更實用的系統。如名稱所暗示的,該系統使負載可以在計算機集群中盡可能平均地分攤處理。該負載可能是需要均衡的應用程序處理負載或網絡流量負載。這樣的系統非常適合于運行同一組應用程序的大量用戶。每個節點都可以處理一部分負載,并且可以在節點之間動態分配負載,以實現平衡。
- 高性能 (High Performance)
通常,這種設計的集群是用來開發并行編程應用程序,以解決復雜的科學問題。并行計算(或稱平行計算)是相對于串行計算來說的,并行計算能力的目的是用來提高計算速度。它實際是一個計算機集群,其處理能力與真的超級計算機相等。
什么是分布式
分布式服務是指將多臺服務器集中在一起,服務是分散部署在不同的機器上的。每臺服務器都實現總體中的不同業務,做不同的事情。一個服務可能負責幾個功能,是一種面向 SOA 的架構。各分開部署的部分彼此通過各種通訊協議交互信息,并且每臺服務器都缺一不可,如果某臺服務器故障,則部分功能缺失,或導致整體無法運行。
分布式存在的主要作用是大幅度的提高效率,緩解服務器的訪問和存儲壓力。區別分布式的方式是一個業務分拆多個子業務,部署在不同的服務器上。
例如:將一個大的系統劃分為多個業務模塊,業務模塊分別部署到不同的機器上,各個業務模塊之間通過接口進行數據交互。
上圖中 Service A、B、C、D 分別是業務組件,通過 API Geteway 進行業務訪問。
什么是微服務
微服務的概念和分布式比較相似,微服務是一種架構風格。簡單來說微服務就是很小的服務,小到一個服務只對應一個單一的功能。每個微服務僅關注于完成一件任務并很好地完成該任務,這個服務可以單獨部署運行。 各個微服務之間是松耦合的,服務之間可以通過 RPC 來相互交互。每個微服務都是由獨立的小團隊開發、測試、部署,上線,負責它的整個生命周期。
在做架構設計時,當你估算過最大用戶量和并發量后,計算出單個應用服務器能否滿足需求。如果用戶量只有幾百人的小應用,單體應用就能搞定,即所有應用部署在一個應用服務器里。如果是很大用戶量,且某些功能會被頻繁訪問,或者某些功能計算量很大,建議將應用拆解為多個子系統,各自負責各自功能,這就是微服務架構。
微服務的設計是為了不因為某個模塊的升級和 BUG 影響現有的整個系統業務。微服務與分布式的細微差別是,微服務的應用不一定是分散在多個服務器上,它也可以是同一個服務器。
微服務相比分布式服務來說,它的粒度更小,服務之間耦合度更低。由于每個微服務都由獨立的小團隊負責,因此它敏捷性更高。分布式服務最后都會向微服務架構演化,這是一種趨勢。不過服務微服務化后帶來的挑戰也是顯而易見的,例如服務粒度小,數量大,后期運維難度會增大。
集群、分布式、微服務的異同及聯系
1. 分布式是以縮短單個任務的執行時間來提升效率的,而集群則是通過提高單位時間內執行的任務數來提升效率。
例如:如果一個任務由 10 個子任務組成,每個子任務單獨執行需 1 小時,則在一臺服務器上執行該任務需 10 小時。
- 采用分布式方案,提供 10 臺服務器,每臺服務器只負責處理一個子任務,不考慮子任務間的依賴關系,執行完這個任務只需一個小時。(這種工作模式的一個典型代表就是 Hadoop 的 Map/Reduce 分布式計算模型)
- 采用集群方案,同樣提供 10 臺服務器,每臺服務器都能獨立處理這個任務。假設有 10 個任務同時到達,10 個服務器將同時工作,1 小時后,10 個任務同時完成。這樣整體來看,還是 1 小時內完成一個任務。
注:分布式需要做好事務管理。
2. 集群模式是不同服務器部署同一套服務對外訪問,實現服務的負載均衡。區別集群的方式是根據部署多臺服務器業務是否相同,分布式中的每一個節點,都可以做集群。而集群并不一定就是分布式的。
舉例:就比如新浪網訪問的人多了,他可以做一個群集。前面放一個響應服務器,后面幾臺服務器完成同一業務。如果有業務訪問的時候,響應服務器看哪臺服務器的負載不是很重,就將任務調度給哪一臺去完成。
而分布式,從窄意上理解也跟集群差不多。但是它的組織比較松散,不像集群有一個組織性,一臺服務器垮了,其它的服務器可以頂上來。分布式的每一個節點都完成不同的業務,一個節點垮了那這個業務就不可訪問了。
注:集群模式需要做好 Session 共享,確保在不同服務器切換的過程中不會因為沒有獲取到 Session 而引起服務終止。
3. 分布式與微服務的關系
分布式和微服務的架構很相似,只是部署的方式不一樣而已。
生產環境下的微服務肯定是分布式部署的,分布式部署的應用不一定是微服務架構的。比如集群部署,它是把相同應用復制到不同服務器上,但是邏輯功能上還是單體應用。
4. 在開發中我們可以將分布式和集群分開嗎?
針對這個問題,我們可以根據分布式的介紹看出,其主要的功能是用來將我們的系統模塊化,將系統進行解耦的,方便我們以后的維護和開發的。但是其并不能解決我們的并發問題,也無法保證我們的系統在服務器宕機后的正常運轉。
而集群恰好彌補了分布式的缺陷,集群就是多個服務器處理相同的業務。這在一方面可以解決或者說改善我們系統的并發問題,一方面可以解決我們服務器如果出現一定數量的宕機后,系統仍然可以正常運轉。
好的設計應該是分布式和集群相結合,先分布式再集群。具體實現就是業務拆分成很多子業務,然后針對每個子業務進行集群部署。這樣每個子業務如果出了問題,整個系統完全不會受影響。
因此,分布式和集群是一對好基友,誰也離不開誰。