一.分布式架構(gòu)的發(fā)展歷史
? ? ?1946年,世界上第一臺(tái)電子計(jì)算機(jī)在美國(guó)的賓夕法尼亞大學(xué)誕生,它的名字是:ENICAC ,這臺(tái)計(jì)算機(jī)的體重比較大,計(jì)算速度也不快,但是而代表了計(jì)算機(jī)時(shí)代的到來(lái),再以后的互聯(lián)網(wǎng)的發(fā)展中也有基礎(chǔ)性的意義棵逊。
? ? ?計(jì)算機(jī)的組成是有五部分完成的,分別是:輸入設(shè)備,輸出設(shè)備,存儲(chǔ)器,存儲(chǔ)器里面由運(yùn)算器和控制器,有一個(gè)馮諾依曼的模型非常形象的對(duì)象計(jì)算機(jī)的組成進(jìn)行了描述,不過(guò)計(jì)算機(jī)也是有數(shù)據(jù)流,指令流,控制流來(lái)進(jìn)行計(jì)算的和正常運(yùn)轉(zhuǎn)的硫麻。如圖:
? ? ? ENIAC之后,電子計(jì)算機(jī)進(jìn)入到了IBM主導(dǎo)的大型機(jī)的時(shí)代,? ?在1946年第一臺(tái)IBM大型機(jī)SYSTEM/360誕生,這使得IBM在20世紀(jì)50~60年代統(tǒng)治了整個(gè)大型計(jì)算機(jī)的工業(yè)件舵,在大型主機(jī)時(shí)代,計(jì)算機(jī)架構(gòu)向兩個(gè)方向發(fā)展CISC(微處理器執(zhí)行的計(jì)算機(jī)語(yǔ)言指令集)CPU為架構(gòu)的價(jià)格便宜的個(gè)人PC和RISC(精簡(jiǎn)指令集計(jì)算機(jī))價(jià)格高的小型UNIX服務(wù)器。
? ? ?大型主機(jī)的出現(xiàn),憑借著計(jì)算能力和處理能力,高的穩(wěn)定性和安全性,在很長(zhǎng)的一段時(shí)間內(nèi)引領(lǐng)到計(jì)算領(lǐng)域的發(fā)展鲸沮。但是集中式的計(jì)算機(jī)系統(tǒng)來(lái)帶來(lái)了一些問(wèn)題,來(lái)越來(lái)越不能滿足用戶的需求比如說(shuō):
? ? ? 1.大型的主機(jī)非常貴,一般的小企業(yè)用不起。
? ? ? 2.大型主機(jī)比較復(fù)雜,培養(yǎng)人才的成本比較高锈候。
? ? ? 3.單點(diǎn)問(wèn)題,如過(guò)大型機(jī)出現(xiàn)故障,整個(gè)系統(tǒng)都掛了運(yùn)行不了,使企業(yè)的損失非常大杜恰。
? ? ? 4.隨著技術(shù)的進(jìn)步,個(gè)人PC電腦的性能越來(lái)越高,成本也越來(lái)越低获诈。
阿里巴巴在2009年發(fā)起了一項(xiàng)去“IOE”的驅(qū)動(dòng)
? ??IOE指的是IBM的小型機(jī),Oracle的數(shù)據(jù)庫(kù)和EMC的高端存儲(chǔ)設(shè)備,2009年的去IOE的運(yùn)動(dòng),一直到2003的支付寶的最后一臺(tái)IBM的小型機(jī)的下線心褐。
為什么要去IOE
? ??阿里巴巴過(guò)去數(shù)據(jù)庫(kù)使用的是Oracle,并使用小型機(jī)和高端存儲(chǔ)設(shè)備提供高性能的數(shù)據(jù)處理和存儲(chǔ)服務(wù)舔涎。隨著公司的業(yè)務(wù)量的上升,用戶規(guī)模的不斷上漲,傳統(tǒng)的集中式的架構(gòu)Oracle數(shù)據(jù)庫(kù)在擴(kuò)展方面遭遇了瓶頸嚎于。向傳統(tǒng)的Oracle,DB2都是以集中式的為主,存在的缺點(diǎn)就是擴(kuò)展性的不足,集中式的擴(kuò)展主要是采用的是向上的擴(kuò)展不是水平的擴(kuò)展,這樣時(shí)間長(zhǎng)了知染,早晚都會(huì)遇到系統(tǒng)瓶頸。
想學(xué)習(xí)大數(shù)據(jù)或者對(duì)大數(shù)據(jù)技術(shù)感興趣的朋友,這里我整理了一套大數(shù)據(jù)的學(xué)習(xí)視頻免費(fèi)分享給大家,從入門到實(shí)戰(zhàn)都有肤视,大家可以加我的微信:Lxiao_28獲仁獗蕖1枚健(備注領(lǐng)取資料)秩冈。也歡迎進(jìn)微信群交流丹锹,或者獲取Java高級(jí)技術(shù)學(xué)習(xí)資料。
一.分布式架構(gòu)的常見概念
? ?集群
? ??小飯店原來(lái)是一個(gè)廚師哩治,切菜洗菜備料炒菜全干。后來(lái)客人多了馁启,廚房一個(gè)廚師忙不過(guò)來(lái)驾孔,又請(qǐng)了個(gè)廚師,兩個(gè)廚師都能炒一樣的菜惯疙,這兩個(gè)廚師的關(guān)系就是集群翠勉。
分布式
? ? ? ?為了讓廚師專心炒菜,把菜做到極致,又請(qǐng)了個(gè)配菜師負(fù)責(zé)切菜,備菜,備料,廚師和配菜師的關(guān)系就是分布式的,一個(gè)配菜師也忙不過(guò)來(lái),有請(qǐng)了個(gè)配菜師,這兩個(gè)配菜師的關(guān)系就是集群了龙亲。所以說(shuō)有分布式的架構(gòu)中可能有集群,但集群不等于有分布式嘁灯。
節(jié)點(diǎn)
? ? ?節(jié)點(diǎn)是指一個(gè)可以獨(dú)立按照分布式協(xié)議完成一組邏輯的程序個(gè)體。在具體的項(xiàng)目中,一個(gè)節(jié)點(diǎn)表示的是一個(gè)操作系統(tǒng)上的進(jìn)程滥壕。
副本機(jī)制
? ? ? ?副本指的是在分布式系統(tǒng)中為數(shù)據(jù)或服務(wù)提供冗余蒿偎。
? ? ? ?數(shù)據(jù)副本指在不同的節(jié)點(diǎn)上持久化同一份數(shù)據(jù),當(dāng)出現(xiàn)某一個(gè)節(jié)點(diǎn)的數(shù)據(jù)丟失時(shí),可以從副本讀取數(shù)據(jù)朽们。數(shù)據(jù)副本是分布式系統(tǒng)中結(jié)果數(shù)據(jù)丟失的唯一手段。
? ? ? ?服務(wù)副本表示的是多個(gè)節(jié)點(diǎn)提供相同的服務(wù),通過(guò)主從關(guān)系來(lái)實(shí)現(xiàn)服務(wù)的高可用方案诉位。
中間件
? ? ?中間件位與操作系統(tǒng)提供的服務(wù)之外,又不屬于應(yīng)用,它是位與應(yīng)用和系統(tǒng)層之間為開發(fā)者方便的處理通信,輸入和輸出的一類軟件,能夠讓用戶關(guān)心自己應(yīng)用的一部分骑脱。
架構(gòu)的發(fā)展過(guò)程
? ? ?一個(gè)成熟的大型網(wǎng)站系統(tǒng)架構(gòu)并不是一開始就設(shè)計(jì)的非常完美的,也不是一開始就具備高性能,高可用苍糠,安全性等特性叁丧,而是隨著用戶量的增加,業(yè)務(wù)功能的擴(kuò)展慢慢完善演變過(guò)來(lái)的岳瞭。在這個(gè)發(fā)展過(guò)程中,開發(fā)模式,技術(shù)架構(gòu)等都會(huì)發(fā)生非常大的變化拥娄。
? ? ? 假如系統(tǒng)具備一下功能:
? ? ? 用戶模塊:用戶注冊(cè)和管理
? ? ? 商品模塊:商品展示和管理
? ? ? 交易模塊:創(chuàng)建交易及支付結(jié)算
?階段一:單應(yīng)用架構(gòu)
? ? ? ?系統(tǒng)的初級(jí)都是應(yīng)用和數(shù)據(jù)庫(kù)都放在一臺(tái)服務(wù)器上。
階段二:應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器分離
? ? ? ??隨著網(wǎng)站的用戶量增大瞳筏,流量增大,對(duì)應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器單獨(dú)的部署機(jī)器,這樣可以增加系統(tǒng)的性能,提高訪問(wèn)的效率,提高單機(jī)的負(fù)載能力和容災(zāi)的能力稚瘾。
階段三:應(yīng)用服務(wù)器集群-應(yīng)用服務(wù)器負(fù)載告警
? ? ??隨著訪問(wèn)量和流量的增加,假設(shè)數(shù)據(jù)庫(kù)沒(méi)有遇到瓶頸,對(duì)應(yīng)用服務(wù)器集群來(lái)對(duì)請(qǐng)求進(jìn)行分流,提高程序的性能。存在的問(wèn)題:用戶的請(qǐng)求由誰(shuí)來(lái)轉(zhuǎn)發(fā),session如何來(lái)管理的問(wèn)題乏矾。
階段四:數(shù)據(jù)庫(kù)壓力變大-數(shù)據(jù)庫(kù)讀寫分離
? ? ??讀寫分離的話,這樣以后的請(qǐng)求孟抗,查詢的請(qǐng)求就可以去從庫(kù)里面讀數(shù)據(jù),寫的數(shù)據(jù)可以到主庫(kù)中了,但是會(huì)帶來(lái)幾個(gè)問(wèn)題:
? ? ? 1.主從的數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步:可以使用mysql自帶的master-slave方式實(shí)現(xiàn)主從復(fù)制
? ? ? 2.對(duì)應(yīng)的數(shù)據(jù)源的選擇:采用第三方數(shù)據(jù)庫(kù)中間件,例如:mycat
階段五:使用搜索引擎緩解讀庫(kù)的壓力
? ? ?數(shù)據(jù)庫(kù)做讀庫(kù)的話,常常對(duì)模糊查詢的性能不是很好,特別是對(duì)于大型的互聯(lián)網(wǎng)公司來(lái)說(shuō),想搜索的模塊就比較核心了,這是可以使用搜索引擎了,雖然可以大幅度的提高查詢的速度,但是同時(shí)也會(huì)帶來(lái)一些問(wèn)題比如索引的構(gòu)建迁杨。
階段六:引入緩存機(jī)制緩解數(shù)據(jù)庫(kù)的壓力
? ? ?對(duì)一些熱點(diǎn)的數(shù)據(jù),可以使用redis,memcache來(lái)作為應(yīng)用層的緩存;另外在某些場(chǎng)景下,可以使用mongodb來(lái)替代關(guān)系型數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)凄硼。
階段七:數(shù)據(jù)庫(kù)的水平/垂直拆分
? ? ?垂直拆分:把數(shù)據(jù)庫(kù)中不同的業(yè)務(wù)數(shù)據(jù)拆分到不同的數(shù)據(jù)庫(kù)中铅协。
? ? ?水平拆分:把同一個(gè)表中的數(shù)據(jù)拆分到兩個(gè)甚至更多的數(shù)據(jù)庫(kù)中,水平拆分的原因是某些業(yè)務(wù)量數(shù)據(jù)量大的已經(jīng)達(dá)到了單個(gè)數(shù)據(jù)庫(kù)的瓶頸,這時(shí)候可以采取將表拆分到多個(gè)數(shù)據(jù)庫(kù)中。
階段八:應(yīng)用的拆分
? ? ?隨著業(yè)務(wù)的發(fā)展,業(yè)務(wù)越來(lái)越多,應(yīng)用的壓力越來(lái)越大摊沉。工程規(guī)模也越來(lái)越龐大狐史。這個(gè)時(shí)候就可以考慮將應(yīng)用拆分,按照領(lǐng)域模型將我們的用戶,商品说墨,交易分拆成子系統(tǒng)骏全。
這樣拆分以后,可能會(huì)有一些相同的代碼,比如用戶操作,商品的交易查詢,所有會(huì)導(dǎo)致每個(gè)系統(tǒng)都會(huì)有用戶查詢和訪問(wèn)相關(guān)的操作。這些相同的代碼和模塊一定要抽象出來(lái)尼斧。這樣有利于維護(hù)和管理姜贡。
服務(wù)拆分以后,服務(wù)之間的通信可以通過(guò)RPC技術(shù),比較典型的有:webservice、hession棺棵、http楼咳、RMI等。
原文:代碼屠夫18開源中國(guó)