服務(wù)端高并發(fā)分布式結(jié)構(gòu)
名詞基本概念
- 應(yīng)?(Application)/系統(tǒng)(System)
為了完成一整套服務(wù)的一個程序或相互配合的程序群。例子:為了完成?項任務(wù),?搭建的由?個?或者?群相互配的?組成的團(tuán)隊
- 模塊(Module)/組件(Component)
當(dāng)應(yīng)?較復(fù)雜時,為了分離職責(zé),將其中具有清晰職責(zé)的、內(nèi)聚性強(qiáng)的部分,抽象出概念,便于理解。例子:軍隊中為了進(jìn)?某據(jù)點(diǎn)的攻克,將?員分為突擊?組、爆破?組、掩護(hù)?組、通信?組等
- 分布式(Distributed)
分布式(Distributed)是指將計算、任務(wù)或數(shù)據(jù)分散到多個獨(dú)立的計算機(jī)或節(jié)點(diǎn)上進(jìn)行處理的方式。(即:將系統(tǒng)中的多個模塊被部署于不同服務(wù)器之上)與傳統(tǒng)的集中式系統(tǒng)相比,分布式系統(tǒng)具有更高的靈活性、可擴(kuò)展性和冗余性。
在分布式系統(tǒng)中,各個節(jié)點(diǎn)(模塊)可以通過網(wǎng)絡(luò)進(jìn)行通信和協(xié)作,共同完成任務(wù)。每個節(jié)點(diǎn)獨(dú)立地執(zhí)行一部分工作,并根據(jù)需要與其他節(jié)點(diǎn)進(jìn)行交互。節(jié)點(diǎn)之間可以相互傳遞消息、共享資源和數(shù)據(jù),以實(shí)現(xiàn)更加復(fù)雜和大規(guī)模的計算和服務(wù)。(跨主機(jī)之間的模塊之間的通信基本要借助?絡(luò)?撐完成)
例子1:Web服務(wù)器與數(shù)據(jù)庫分別?作在不同的服務(wù)器上,或者多臺Web服務(wù)器被分別部署在不同服務(wù)器上
例子2:為了更好的滿?現(xiàn)實(shí)需要,?個在同?個辦公場地的?作?組被分散到多個城市的不同?作場地中進(jìn)?遠(yuǎn)程配合?作完成?標(biāo)。
- 集群(Cluster)
被部署于多臺服務(wù)器上的、為了實(shí)現(xiàn)特定?標(biāo)的?個/組特定的組件,整個整體被稱為集群。比如,多個MySQL?作在不同服務(wù)器上,共同提供數(shù)據(jù)庫服務(wù)?標(biāo),可以被稱為?組數(shù)據(jù)庫集群
分布式和集群的區(qū)別
分布式強(qiáng)調(diào)的是物理形態(tài),即?作在不同服務(wù)器上并且通過?絡(luò)通信配合完成任務(wù)。 =>物理上的多臺主機(jī)
集群更在意邏輯形態(tài),即是否為了完成特定服務(wù)?標(biāo) =>邏輯上的多臺主機(jī),比如:一臺主機(jī)上部署多個服務(wù)器程序
- 主(Master)/從(Slave)
集群中,通常有?個程序需要承擔(dān)更多的職責(zé),被稱為主;其他承擔(dān)附屬職責(zé)的被稱為從。
?如MySQL集群中,只有其中?臺服務(wù)器上數(shù)據(jù)庫允許進(jìn)?數(shù)據(jù)的寫?(增/刪/改),其他數(shù)據(jù)庫的數(shù)據(jù)修改全部要從這臺數(shù)據(jù)庫同步?來,則把那臺數(shù)據(jù)庫稱為主庫,其他數(shù)據(jù)庫稱為從庫。主庫:可以讀和寫入 從庫:只可以進(jìn)行讀取
- 中間件(Middleware)
?類提供不同應(yīng)?程序?于相互通信的軟件,即處于不同技術(shù)、?具和數(shù)據(jù)庫之間的橋梁
例子:?家飯店開始時,會每天去市場挑選買菜,但隨著飯店業(yè)務(wù)量變?,成??個采購部,由采購部專職于采買業(yè)務(wù),稱為廚房和菜市場之間的橋梁
評價指標(biāo)
- 可?性(Availability)
考察單位時間段內(nèi),系統(tǒng)可以正常提供服務(wù)的概率/期望。例如:年化系統(tǒng)可?性=系統(tǒng)正常提供服務(wù)時?/?年總時?。平常說的4個9即系統(tǒng)可以提供99.99%的可?性,5個9是99.999%的可?性
- 響應(yīng)時?(ResponseTimeRT)
指??完成輸?到系統(tǒng)給出??反應(yīng)的時?,例如:點(diǎn)外賣業(yè)務(wù)的響應(yīng)時?=拿到外賣的時刻-完成點(diǎn)單的時刻
需要衡量的是最?響應(yīng)時?、平均響應(yīng)時?和中位數(shù)響應(yīng)時?。這個指標(biāo)原則上是越?越好,但很多情況下由于實(shí)現(xiàn)的限制,需要根據(jù)實(shí)際情況具體判斷
- 吞吐(Throughput)vs并發(fā)(Concurrent)
吞吐考察單位時間段內(nèi),系統(tǒng)可以成功處理的請求的數(shù)量。并發(fā)指系統(tǒng)同?時刻?持的請求最?量。實(shí)踐中,并發(fā)量往往?法直接獲取,很多時候都是?極短的時間段(?如1秒)的吞吐量做代替
例如?條輛?道?速公路,只有兩條通道,但是?分鐘可以通過20輛?,則并發(fā)是2,?分鐘的吞吐量是20
1.單機(jī)架構(gòu)
單機(jī)架構(gòu):只有一臺服務(wù)器,這臺服務(wù)器用來負(fù)責(zé)所有的工作。整個系統(tǒng)在物理上只由一個節(jié)點(diǎn)組成,所有的計算和存儲都發(fā)生在這個節(jié)點(diǎn)上,比如一個電商網(wǎng)站:
- Web服務(wù)器軟件:Tomcat、Netty、Nginx、Apache
- 數(shù)據(jù)庫軟件:MySQL、Oracle、PostgreSQL、SQL Server
注意:在單機(jī)程序當(dāng)中,本質(zhì)上可以把數(shù)據(jù)庫服務(wù)器也去掉,用一個應(yīng)用服務(wù)器即負(fù)責(zé)業(yè)務(wù),又負(fù)責(zé)數(shù)據(jù)存儲
大部分的中小公司的產(chǎn)品,都是這種單機(jī)架構(gòu),整個系統(tǒng)只有一個單機(jī)服務(wù)器。由于計算機(jī)硬件發(fā)展速度非常之快,主機(jī)的性能都很高,能支持非常高的并發(fā)和非常大的數(shù)據(jù)存儲,已經(jīng)能滿足大部分中小公司的需求。
單機(jī)架構(gòu)相對于分布式架構(gòu)來說,系統(tǒng)比較容易進(jìn)行管理和維護(hù),數(shù)據(jù)傳輸和處理的延遲較低,易于部署
當(dāng)業(yè)務(wù)需求進(jìn)一步增長時,用戶量和數(shù)據(jù)量等都會增加,一臺服務(wù)器難以應(yīng)對時,就需要引入更多的主機(jī)和其他硬件資源
缺點(diǎn)
- **有限的性能和擴(kuò)展性:**由于計算和存儲資源都集中在一個節(jié)點(diǎn)上,無法有效地利用分布式環(huán)境下多個節(jié)點(diǎn)的計算和存儲能力。當(dāng)系統(tǒng)的工作負(fù)載和數(shù)據(jù)量增加時,單機(jī)架構(gòu)可能無法滿足性能和擴(kuò)展性(比如主機(jī)上能夠增加的硬件資源等,都是有限的)的要求。
- 單點(diǎn)故障:由于只有一個節(jié)點(diǎn),如果這個節(jié)點(diǎn)出現(xiàn)故障或停機(jī),整個系統(tǒng)將無法正常運(yùn)行。
- 硬件資源限制:單個節(jié)點(diǎn)的硬件資源(CPU、內(nèi)存、磁盤,網(wǎng)絡(luò)等)是有限的,無法滿足大規(guī)模數(shù)據(jù)處理和存儲的需求。
- 服務(wù)器每次收到一個請求,都是需要消耗上述的硬件資源去處理請求,如果同一時刻處理的請求太多,就可能導(dǎo)致某個硬件資源不夠用,就會導(dǎo)致服務(wù)器處理請求的時間變長/處理出錯
如果真的遇到了上述的場景,如何處理
1.開源 => 增加更多的硬件資源,但是一臺主機(jī)上可以增加的硬件資源也是有限的,取決于主板的拓展能力,如果一臺主機(jī)拓展到極限了還是不夠,那么就只能引入多臺主機(jī)了,引入多臺主機(jī)后需要在軟件上做出對應(yīng)的調(diào)整和適配。此時系統(tǒng)就可以稱為是分布式系統(tǒng),系統(tǒng)復(fù)雜性大大提高,出現(xiàn)bug概率提高
2.節(jié)流 =>在軟件上做優(yōu)化,通過性能測試,找到是哪個環(huán)節(jié)出現(xiàn)的瓶頸
2.應(yīng)用數(shù)據(jù)分離架構(gòu)
系統(tǒng)的訪問量逐步上升,逐漸逼近了硬件資源的極限,?對當(dāng)前的性能壓?,我們需要未?綢繆去進(jìn)?系統(tǒng)重構(gòu)、架構(gòu)挑戰(zhàn),以提升系統(tǒng)的承載能?,可以選擇將應(yīng)?和數(shù)據(jù)分離的做法,可以最?代價的提升系統(tǒng)的承載能?
引入多臺主機(jī)后,就不是單機(jī)架構(gòu)了,系統(tǒng)就可稱為“分布式系統(tǒng)”
應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器就是不同的服務(wù)器。應(yīng)?服務(wù)通過?絡(luò)訪問數(shù)據(jù)庫服務(wù)當(dāng)中的數(shù)據(jù),并且可以根據(jù)不同服務(wù)的特點(diǎn)配置不同的服務(wù)器,從而達(dá)到更高的性價比
- 應(yīng)用服務(wù)器會包含更多的業(yè)務(wù)邏輯,需要大量的計算分析,對cpu,內(nèi)存性能要求高。所以可以配置CPU比較好的主機(jī)
- 數(shù)據(jù)庫服務(wù)器需要更大的硬盤空間,更快的數(shù)據(jù)訪問速度,對空間要求高??梢耘渲酶笥脖P的服務(wù)器,甚至可以上固態(tài)硬盤(SSD)
硬盤分類:
- 機(jī)械硬盤:便宜,訪問速度慢
- 固態(tài)硬盤:貴,訪問速度快
應(yīng)用服務(wù)集群架構(gòu)
隨著數(shù)據(jù)量進(jìn)一步增加,單臺應(yīng)?服務(wù)器已經(jīng)?法滿?需求了。單機(jī)應(yīng)?服務(wù)器?先遇到了瓶頸,此時可以有兩種解決方法:
- 垂直擴(kuò)展/縱向擴(kuò)展:通過購買性能更優(yōu)、價格更?的應(yīng)?服務(wù)器來應(yīng)對更多的流量。這種?案的優(yōu)勢在于完全不需要對系統(tǒng)軟件做任何的調(diào)整;但劣勢也很明顯:硬件性能和價格的增?關(guān)系是?線性的,意味著選擇性能2倍的硬件可能需要花費(fèi)超過4倍的價格,其次硬件性能提升是有明顯上限的
- ?平擴(kuò)展/橫向擴(kuò)展:通過調(diào)整軟件架構(gòu),增加應(yīng)?層硬件,將用戶流量分擔(dān)到不同的應(yīng)?層服務(wù)器上,來提升系統(tǒng)的承載能?
優(yōu)勢在于成本相對較低,并且提升的上限空間也很?。但劣勢是帶給系統(tǒng)更多的復(fù)雜性,需要技術(shù)團(tuán)隊有更豐富的經(jīng)驗,并且為了解決??流量向哪臺應(yīng)?服務(wù)器分發(fā)的問題,需要?個專?的系統(tǒng)組件(負(fù)載均衡器)做流量分發(fā)
- 用戶的請求先到達(dá)負(fù)載均衡器/網(wǎng)關(guān)服務(wù)器,
負(fù)載均衡器(Load Balancer):也是一個單獨(dú)的服務(wù)器,或者稱為網(wǎng)關(guān)。是一種用于分發(fā)網(wǎng)絡(luò)流量的設(shè)備或軟件。它位于應(yīng)用程序和網(wǎng)絡(luò)基礎(chǔ)設(shè)施之間,將傳入的流量(請求)分配到多個服務(wù)器或計算資源上,以實(shí)現(xiàn)負(fù)載的均衡和性能的優(yōu)化。(和之前學(xué)習(xí)的多線程思想相似,都是通過流量分發(fā)到多處進(jìn)行處理,以提高效率)
負(fù)載均衡器的主要功能包括:
- 流量分發(fā):接收傳入的請求流量,將其分發(fā)到后端的多個服務(wù)器或計算資源上,以確保每個服務(wù)器都能得到相對均等的工作負(fù)載。
-
負(fù)載調(diào)度:采用不同的調(diào)度算法,如輪詢、權(quán)重、最少連接等,來決定請求應(yīng)該被分發(fā)到哪個后端服務(wù)器上。根據(jù)服務(wù)器的性能和負(fù)載情況,動態(tài)地調(diào)整流量分發(fā)策略。
- 策略1:輪詢算法—將請求依次分給不同的應(yīng)?服務(wù)器
- 策略2:隨機(jī)選擇算法—每次隨機(jī)將請求分發(fā)給一臺應(yīng)用服務(wù)器
- 策略3:基于權(quán)重的輪詢算法—為不同的服務(wù)器(?如性能不同)賦予不同的權(quán)重,能者多勞
- 策略4:?致哈希散列算法—通過計算??的特征值(?如?IP?地址)得到哈希值,根據(jù)哈希結(jié)果做分發(fā),優(yōu)點(diǎn)是確保來?相同??的請求總是被分給指定的服務(wù)器
- 高可用性:可以監(jiān)控后端服務(wù)器的可用性,并在某個服務(wù)器發(fā)生故障或不可用時,自動將流量轉(zhuǎn)移到其他正常工作的服務(wù)器上,確保服務(wù)的連續(xù)性和高可用性。
- 健康檢查:可以定期檢查后端服務(wù)器的健康狀態(tài),如響應(yīng)時間、負(fù)載情況等,并根據(jù)檢查結(jié)果來決定是否將流量分發(fā)給該服務(wù)器。
- 擴(kuò)展性:通過添加更多的后端服務(wù)器,可以實(shí)現(xiàn)系統(tǒng)的水平擴(kuò)展,以滿足不斷增長的流量需求。
負(fù)載均衡器的流量承擔(dān)能力是遠(yuǎn)遠(yuǎn)超過應(yīng)用服務(wù)器的,因為它只用單純的分配任務(wù),服務(wù)器是需要進(jìn)行執(zhí)行任務(wù)的,所花時間是更長的。如果超過負(fù)載均衡器的承受能力,就引入更多的負(fù)載均衡器,也就是多個機(jī)房,用來分擔(dān)流量
- 負(fù)載均衡軟件:Nginx、HAProxy、LVS、F5等
讀寫分離/主從分離架構(gòu)
通過負(fù)載均衡解決了請求量過大的問題,大量請求可以得到并行處理了,?論擴(kuò)展多少臺服務(wù)器,這些請求最終都會從數(shù)據(jù)庫讀寫數(shù)據(jù),那么到一定程度上,就會到達(dá)瓶頸點(diǎn)。并且不能將數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器一樣進(jìn)行擴(kuò)展,因為將數(shù)據(jù)分散到不同的數(shù)據(jù)庫后,會破壞數(shù)據(jù)的一致性,例如轉(zhuǎn)賬,如果一個數(shù)據(jù)庫的數(shù)據(jù)修改了,另一個數(shù)據(jù)庫沒修改,就造成數(shù)據(jù)不一致
解決辦法:保留?個主要的數(shù)據(jù)庫作為寫?數(shù)據(jù)庫,其他的數(shù)據(jù)庫作為從屬數(shù)據(jù)庫。
- 從庫的所有數(shù)據(jù)全部來?主庫的數(shù)據(jù),經(jīng)過同步后,從庫可以維護(hù)著與主庫?致的數(shù)據(jù)
- 為了分擔(dān)數(shù)據(jù)庫的壓?,我們可以將寫數(shù)據(jù)請求全部交給主庫處理,但讀請求分散到各個從庫中
應(yīng)?中需要對讀寫請求做分離處理,所以可以利??些數(shù)據(jù)庫中間件,將請求分離的職責(zé)托管出去。例如:MyCat、TDDL、Amoeba、Cobar等類似數(shù)據(jù)庫中間件
引入緩存-冷熱分離架構(gòu)
實(shí)際上讀的頻率是遠(yuǎn)高于寫的頻率,因此主數(shù)據(jù)庫服務(wù)器一般是一個,從數(shù)據(jù)庫服務(wù)器有多個(一主多從),同時從數(shù)據(jù)庫通過負(fù)載均衡的方式,讓應(yīng)用服務(wù)器進(jìn)行訪問。針對數(shù)據(jù)庫響應(yīng)速度比較慢的問題,將數(shù)據(jù)進(jìn)行“冷熱”劃分,將熱點(diǎn)數(shù)據(jù)放到緩存中,冷的數(shù)據(jù)放到硬盤。
- 熱點(diǎn)數(shù)據(jù):?些數(shù)據(jù)的讀取頻率遠(yuǎn)?于其他數(shù)據(jù)的讀取頻率
針對熱數(shù)據(jù),為了提升其讀取的響應(yīng)時間,可以增加本地緩存,并在外部增加分布式緩存。緩存熱?商品信息或熱?商品的html??等。通過緩存能把絕?多數(shù)請求在讀寫數(shù)據(jù)庫前攔截掉,??降低數(shù)據(jù)庫壓?
注意:緩存服務(wù)器中存放一小部分熱點(diǎn)數(shù)據(jù),根據(jù)二八原則:20%的數(shù)據(jù),能夠支持80%的訪問量。數(shù)據(jù)庫中存儲的還是完整的數(shù)據(jù),只是將熱點(diǎn)數(shù)據(jù)放到緩存中了,緩存的速度非???,但是容量小,成本高,也是Redis出現(xiàn)的位置。Redis的核心功能就是作為緩存服務(wù)器
代價:數(shù)據(jù)的一致性問題,如果存儲服務(wù)器的數(shù)據(jù)被修改,訪問時使用的是緩存的數(shù)據(jù),那就出現(xiàn)錯誤了
分庫分表(垂直分庫)
引入分布式系統(tǒng)不光要去應(yīng)對高的請求量,也需要應(yīng)對更大的數(shù)據(jù)量。雖然一個服務(wù)器存儲的數(shù)據(jù)量可以達(dá)到幾十個TB,即使如此面對不同的應(yīng)用場景,也會存不下。需要使用多臺主機(jī)存儲數(shù)據(jù),所以可以針對數(shù)據(jù)庫進(jìn)行分庫分表
原本是一個數(shù)據(jù)庫服務(wù)器,這個服務(wù)器上存儲了多個數(shù)據(jù)庫,現(xiàn)在由于數(shù)據(jù)量太大,一個數(shù)據(jù)庫服務(wù)器存不下那么多數(shù)據(jù),就引入多個數(shù)據(jù)庫服務(wù)器,每個服務(wù)器上存儲一個或一部分?jǐn)?shù)據(jù)庫
如果某個表特別大,一臺服務(wù)器存不下,也可以針對表進(jìn)行拆分,使用多個存儲服務(wù)器進(jìn)行存儲
業(yè)務(wù)拆分?微服務(wù)
之前的應(yīng)用服務(wù)器,一個服務(wù)器中要實(shí)現(xiàn)所有的業(yè)務(wù),會導(dǎo)致這一個服務(wù)器的代碼越來越復(fù)雜。按照功能拆成多組微服務(wù),就可以便于代碼的維護(hù),互相之間對數(shù)據(jù)的直接訪問進(jìn)?隔離,可以利?Gateway、消息總線等技術(shù),實(shí)現(xiàn)相互之間的調(diào)?關(guān)聯(lián)。甚?可以把?些類似??管理、安全管理、數(shù)據(jù)采集等業(yè)務(wù)提成公共服務(wù)
應(yīng)用服務(wù)器復(fù)雜了之后,就需要更多的人力資源進(jìn)行維護(hù),增加了管理成本。為了減少管理成本,就可以把一個復(fù)雜的服務(wù)器,拆分成更多的,功能單一的,更小的服務(wù)器(微服務(wù)),有利于劃分組織結(jié)構(gòu),分多組進(jìn)行管理
引入微服務(wù)主要是為了解決人的管理問題,付出的代價有:
1.系統(tǒng)性能下降,多個被拆出來的服務(wù),功能之間需要更依賴網(wǎng)絡(luò)通信。解決辦法:引入更多的機(jī)器提升性能,萬兆網(wǎng)卡等等配套設(shè)施
2.系統(tǒng)復(fù)雜程度提高,可用性降低,出現(xiàn)問題的概率增加。 解決辦法:引入更豐富的報警機(jī)制,監(jiān)控系統(tǒng),以及運(yùn)維人員
總結(jié)
1.單機(jī)架構(gòu)(應(yīng)用程序+數(shù)據(jù)庫服務(wù)器)
2.數(shù)據(jù)庫和應(yīng)用程序分離
- 應(yīng)用程序和數(shù)據(jù)庫服務(wù)器分別放到不同的主機(jī)上進(jìn)行部署
3.引入負(fù)載均衡,將應(yīng)用服務(wù)器集群化
- 通過負(fù)載均衡器把請求比較均勻的分發(fā)給集群當(dāng)中的每個應(yīng)用服務(wù)器
- 好處是:當(dāng)集群當(dāng)中的某個主機(jī)掛了,其它的主機(jī)仍然可以承擔(dān)服務(wù),提高了整個系統(tǒng)的可用性
4.引入讀寫分離,數(shù)據(jù)庫主從結(jié)構(gòu)
- 一個數(shù)據(jù)庫節(jié)點(diǎn)作為主節(jié)點(diǎn), 其它N個數(shù)據(jù)庫節(jié)點(diǎn)作為從節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)寫數(shù)據(jù),從節(jié)點(diǎn)負(fù)責(zé)讀數(shù)據(jù),主節(jié)點(diǎn)需要把修改過的數(shù)據(jù)同步給從節(jié)點(diǎn)
5.引入緩存,冷熱數(shù)據(jù)分離
- 進(jìn)一步的提升了服務(wù)器針對請求的處理能力 【28原則】
- 引入的問題:數(shù)據(jù)庫和緩存的一致性問題
6.引入分庫分表,數(shù)據(jù)庫能夠進(jìn)一步拓展存儲空間文章來源:http://www.zghlxwxcb.cn/news/detail-725465.html
7.引入微服務(wù),從業(yè)務(wù)上進(jìn)一步拆分應(yīng)用服務(wù)器文章來源地址http://www.zghlxwxcb.cn/news/detail-725465.html
- 從業(yè)務(wù)功能的角度,把應(yīng)用服務(wù)器拆分成更多的功能更單一,更簡單,更小的服務(wù)器
到了這里,關(guān)于【Redis】高并發(fā)分布式結(jié)構(gòu)服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!