前言
博主最近在學(xué)中間件,理解互聯(lián)網(wǎng)應(yīng)用架構(gòu)的演進(jìn)過(guò)程,對(duì)于理解中間件在整體結(jié)構(gòu)中的定位是十分重要的
常見(jiàn)概念
應(yīng)用(Application)/系統(tǒng)(System)
完成某種服務(wù)的一個(gè)/一組程序
模塊(Module)/組件(Component)
系統(tǒng)中,一個(gè)獨(dú)立的功能稱之為一個(gè)組件
分布式(Distributed)
系統(tǒng)中的模塊被部署到多個(gè)服務(wù)器上,這些模塊協(xié)同完成一系列工作,這樣的系統(tǒng)叫分布式系統(tǒng)
集群(Cluster)
系統(tǒng)中的模塊被部署到多個(gè)服務(wù)器上,完成特定目標(biāo)的一個(gè)/多個(gè)模塊被稱為集群
主(Master)/從(Slave)
集群中,承擔(dān)更多職責(zé)的程序被稱為主,承擔(dān)附屬職責(zé)的程序被稱為從。主節(jié)點(diǎn)需要向從節(jié)點(diǎn)同步數(shù)據(jù)
中間件(Middleware)
和業(yè)務(wù)無(wú)關(guān)的服務(wù),功能更加通用。1. 數(shù)據(jù)庫(kù) 2. 緩存 3. 消息隊(duì)列
八大架構(gòu)演進(jìn)過(guò)程
單機(jī)架構(gòu)
將所有服務(wù)(應(yīng)用服務(wù)+數(shù)據(jù)服務(wù))部署在同一臺(tái)服務(wù)器上
用戶訪問(wèn)應(yīng)用服務(wù),應(yīng)用服務(wù)根據(jù)用戶需求訪問(wèn)數(shù)據(jù)庫(kù)服務(wù),并將得到的數(shù)據(jù)返回給用戶
由于互聯(lián)網(wǎng)早期,應(yīng)用/web訪問(wèn)量小,所以單機(jī)足以滿足需求
優(yōu)點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-724681.html
- 部署簡(jiǎn)單
- 成本低
缺點(diǎn): - 存在性能瓶頸,用戶無(wú)限增長(zhǎng)但資源有限
- 數(shù)據(jù)庫(kù)和應(yīng)用競(jìng)爭(zhēng)資源
應(yīng)用數(shù)據(jù)分離架構(gòu)
由于單機(jī)架構(gòu)的性能缺陷,當(dāng)用戶量增多時(shí),網(wǎng)站的響應(yīng)速度變慢
此時(shí)演變出了應(yīng)用數(shù)據(jù)分離架構(gòu):將應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)部署在不同服務(wù)器上
應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)間的交互通過(guò)網(wǎng)絡(luò)完成
(具體來(lái)說(shuō):使用cpp-httplib/Spring編寫應(yīng)用程序,應(yīng)用服務(wù)接收用戶請(qǐng)求并將其轉(zhuǎn)換成數(shù)據(jù)庫(kù)語(yǔ)句,接著將語(yǔ)句通過(guò)數(shù)據(jù)庫(kù)客戶端與網(wǎng)絡(luò)發(fā)送給數(shù)據(jù)庫(kù)服務(wù)端,服務(wù)端完成數(shù)據(jù)操作)
對(duì)于應(yīng)用服務(wù)器:可以適當(dāng)增加CPU、內(nèi)存資源,因?yàn)闃I(yè)務(wù)的邏輯將占用更多的CPU和內(nèi)存
而對(duì)于存儲(chǔ)服務(wù)器:可以適當(dāng)增加磁盤資源,甚至使用SSD固態(tài)硬盤,提高數(shù)據(jù)的讀寫速度
優(yōu)點(diǎn):
- 性能相比單機(jī)架構(gòu)有所提升
- 數(shù)據(jù)庫(kù)和應(yīng)用分離,提高了容災(zāi)能力
缺點(diǎn):
- 硬件成本變高
- 無(wú)法應(yīng)對(duì)海量并發(fā)
應(yīng)用服務(wù)集群架構(gòu)
當(dāng)用戶的請(qǐng)求量增加,應(yīng)用服務(wù)無(wú)法及時(shí)處理這些海量請(qǐng)求,導(dǎo)致響應(yīng)時(shí)長(zhǎng)過(guò)長(zhǎng),用戶體驗(yàn)差
此時(shí)增加應(yīng)用服務(wù)器數(shù)量(橫向擴(kuò)展),在應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)之間引入負(fù)載均衡(決策層),使應(yīng)用服務(wù)以集群的方式運(yùn)作。引入負(fù)載均衡后,每臺(tái)應(yīng)用服務(wù)器承擔(dān)相同的壓力
負(fù)載均衡器對(duì)于請(qǐng)求的承擔(dān)能力要遠(yuǎn)大于應(yīng)用服務(wù)器,因?yàn)樨?fù)載均衡器只涉及到分配算法,不需要處理請(qǐng)求
這一架構(gòu)涉及到兩個(gè)軟件設(shè)計(jì)哲學(xué):
- 一個(gè)設(shè)備扛不住,就多加幾個(gè)設(shè)備
- 沒(méi)有什么問(wèn)題是加一層無(wú)法解決的
當(dāng)并發(fā)量越來(lái)越大時(shí),Nginx扛不住了,那就多用幾個(gè)Nginx
Nginx一多,無(wú)法實(shí)現(xiàn)Nginx之間的負(fù)載均衡,再引入決策層,使用LVS/F5實(shí)現(xiàn)Nginx的負(fù)載均衡
LVS/F5也扛不住了,那就多個(gè)幾個(gè)LVS/F5
LVS/F5一多,無(wú)法實(shí)現(xiàn)負(fù)載均衡,直接修改DNS集群(添加多個(gè)IP地址),使之作為我們的負(fù)載均衡
DNS也扛不住?修改用戶電腦的host文件,直接繞過(guò)DNS解析
優(yōu)點(diǎn):
- 應(yīng)用服務(wù)高可用,不會(huì)因?yàn)橐粋€(gè)服務(wù)器出問(wèn)題,整個(gè)站點(diǎn)掛掉
- 服務(wù)具備高性能
- 應(yīng)用服務(wù)可以橫向擴(kuò)展
缺點(diǎn):
- 數(shù)據(jù)服務(wù)成為瓶頸
- 運(yùn)維工作增多,維護(hù)成本增加
- 硬件成本高
讀寫/主從分離架構(gòu)
y應(yīng)用服務(wù)能夠處理海量請(qǐng)求時(shí),數(shù)據(jù)服務(wù)成為性能瓶頸
將數(shù)據(jù)服務(wù)進(jìn)行讀寫/主從分離,主庫(kù)負(fù)責(zé)寫操作,從庫(kù)負(fù)責(zé)讀操作。主從數(shù)據(jù)庫(kù)使用數(shù)據(jù)同步技術(shù)保證數(shù)據(jù)一致
為什么要讀寫分離?互聯(lián)網(wǎng)應(yīng)用一般讀多寫少,部署多個(gè)從數(shù)據(jù)庫(kù)負(fù)責(zé)讀操作,可以有效地提高響應(yīng)速度
但是應(yīng)用服務(wù)如何區(qū)分讀寫請(qǐng)求并將其發(fā)送給不同的數(shù)據(jù)庫(kù)?因此在應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)之間引入一層中間層,該中間層能夠識(shí)別讀寫流量被分流(負(fù)載均衡)給響應(yīng)的數(shù)據(jù)服務(wù)。該中間層對(duì)應(yīng)的軟件:MyCat,TDDL
優(yōu)點(diǎn):
- 讀寫分離后,數(shù)據(jù)服務(wù)的讀寫能力都得到提升
- 數(shù)據(jù)庫(kù)擁有從庫(kù)(備份),可用性(容災(zāi)能力)提升
缺點(diǎn):
- 同步服務(wù)延遲高或者掛掉時(shí),導(dǎo)致讀庫(kù)和寫庫(kù)數(shù)據(jù)不一致
- 成本進(jìn)一步地增加
- 熱點(diǎn)數(shù)據(jù)的頻繁讀取導(dǎo)致數(shù)據(jù)庫(kù)的負(fù)載率很高
冷熱分離架構(gòu)
互聯(lián)網(wǎng)應(yīng)用中,20%的數(shù)據(jù)就能應(yīng)對(duì)80%的請(qǐng)求,這些數(shù)據(jù)被稱為熱點(diǎn)數(shù)據(jù)
對(duì)于熱點(diǎn)數(shù)據(jù),如果能做到更快的讀寫,那么響應(yīng)時(shí)長(zhǎng)將大大減少
所以引入緩存庫(kù),將熱度高的數(shù)據(jù)放入緩存庫(kù)中,由應(yīng)用服務(wù)判斷數(shù)據(jù)是否為熱點(diǎn)數(shù)據(jù)(是否需要訪問(wèn)主從數(shù)據(jù)庫(kù))
緩存庫(kù)的代表為redis
優(yōu)點(diǎn):
- 大幅降低數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,性能提高明顯
缺點(diǎn):
- 帶來(lái)了緩存一致性,緩存擊穿,緩存失敗,緩存雪崩等問(wèn)題
- 成本進(jìn)一步增加
- 數(shù)據(jù)不斷增多時(shí),單個(gè)數(shù)據(jù)庫(kù)的大小太大,查詢速度降低,導(dǎo)致數(shù)據(jù)庫(kù)再次成為性能瓶頸
垂直分庫(kù)架構(gòu)
冷熱分離架構(gòu)主要是為了應(yīng)對(duì)更高的請(qǐng)求量,但數(shù)據(jù)服務(wù)器的容量有限,當(dāng)數(shù)據(jù)量越來(lái)越大時(shí),存儲(chǔ)是一個(gè)問(wèn)題,如何高效地查詢也是一個(gè)問(wèn)題
若庫(kù)太大:將數(shù)據(jù)庫(kù)進(jìn)行拆分,每個(gè)數(shù)據(jù)服務(wù)器存儲(chǔ)一個(gè)/一部分的數(shù)據(jù)庫(kù)(分庫(kù))
若表太大:將表進(jìn)行水平拆分(分表),將不同表的列屬性進(jìn)行拆分,根據(jù)類型,屬性將字段存儲(chǔ)到不同的數(shù)據(jù)集群中,每個(gè)數(shù)據(jù)集群都有一個(gè)主庫(kù)與多個(gè)從庫(kù),查詢時(shí)不會(huì)干涉其他從庫(kù)。使用MyCat/TDDL中間件能夠自動(dòng)分庫(kù)/分表
如電商網(wǎng)站將用戶消息,訂單消息,產(chǎn)品消息分割成不同的數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)包含特定類型的數(shù)據(jù)
典型分布式數(shù)據(jù)庫(kù):Greenplum、TiDB、Postgresql XC、HAWQ 等
優(yōu)點(diǎn):
- 提高了數(shù)據(jù)吞吐量,數(shù)據(jù)服務(wù)不再是瓶頸
缺點(diǎn): - 處理事務(wù)的難度增加
- 數(shù)據(jù)服務(wù)和應(yīng)用服務(wù)耦合,應(yīng)用服務(wù)的修改將導(dǎo)致整體服務(wù)的重新部署
微服務(wù)架構(gòu)
之前的所有架構(gòu),一個(gè)應(yīng)用服務(wù)器負(fù)責(zé)很多業(yè)務(wù),這將導(dǎo)致一臺(tái)服務(wù)器的代碼變得復(fù)雜,同時(shí)耦合性增加。為了方便代碼的維護(hù),需要將負(fù)責(zé)復(fù)雜業(yè)務(wù)的服務(wù)器進(jìn)行拆分,拆分成功能單一的更小的服務(wù)器(微服務(wù))。同時(shí)將開(kāi)發(fā)人員進(jìn)行分組,以更好地開(kāi)發(fā)與維護(hù)服務(wù)
微服務(wù)是一種架構(gòu)風(fēng)格,按照業(yè)務(wù)模塊來(lái)劃分代碼使得每個(gè)模塊的職責(zé)更加清晰,相互之間的迭代升級(jí)能夠做到獨(dú)立
之前的架構(gòu)存在的問(wèn)題:
- 擴(kuò)展性差:修改一點(diǎn)程序就需要重新構(gòu)建代碼
- 持續(xù)開(kāi)發(fā)困難:重新構(gòu)建代碼導(dǎo)致無(wú)法輕松地發(fā)布版本
- 不可靠:系統(tǒng)中的一個(gè)功能出現(xiàn)bug,導(dǎo)致整個(gè)系統(tǒng)出問(wèn)題
- 不靈活:無(wú)法使用不同的技術(shù)構(gòu)建單體應(yīng)用程序
- 代碼維護(hù)難:功能耦合在一起,難以閱讀
為解決以上問(wèn)題,使用了微服務(wù)架構(gòu)
優(yōu)點(diǎn):
- 靈活性高,部署時(shí)彈性大
- 獨(dú)立擴(kuò)展
- 提高容錯(cuò)性
- 容易引入新技術(shù)
- 功能復(fù)用
缺點(diǎn):
- 運(yùn)維復(fù)雜度高:例如環(huán)境沖突問(wèn)題
- 系統(tǒng)的性能下降:獨(dú)立出來(lái)的每個(gè)模塊需要通過(guò)網(wǎng)絡(luò)進(jìn)行通信,網(wǎng)絡(luò)的速度比磁盤還慢
- 處理故障困難:一個(gè)請(qǐng)求困難調(diào)用了多個(gè)微服務(wù),出錯(cuò)難以定位
容器編排架構(gòu)
借助容器化技術(shù)(docker)將應(yīng)用/服務(wù)打包為鏡像,通過(guò)容器編排工具(如k8s)來(lái)動(dòng)態(tài)方法和部署鏡像,服務(wù)通過(guò)容器化方式運(yùn)行
出現(xiàn)原因:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-724681.html
- 微服務(wù)拆分太細(xì),服務(wù)的部署工作量大,配置復(fù)雜容易出錯(cuò)
- 微服務(wù)之間的運(yùn)行環(huán)境可能沖突,需要更多的資源或者修改配置來(lái)解決沖突
優(yōu)點(diǎn):
- 隔離性好:不會(huì)產(chǎn)生環(huán)境沖突
- 部署、運(yùn)維簡(jiǎn)單:k8s的容器編排
- 支持滾動(dòng)更新:版本間的升級(jí)與回滾通過(guò)命令即可完成
缺點(diǎn): - 技術(shù)棧多,學(xué)習(xí)成本高
- 服務(wù)器成本高
到了這里,關(guān)于互聯(lián)網(wǎng)應(yīng)用架構(gòu)的演進(jìn)(八大架構(gòu)的演進(jìn)過(guò)程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!