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