互联网分布式架构技术概述
簡介
作為一名架構(gòu)師,我們要專業(yè),要能看懂代碼,及時光著臂膀去機(jī)房,也能獨(dú)擋一面!及時同事搞不定問題,或者撂挑子,你也能給老大一個堅定的眼神:不怕,有我在!還能在會議室上滔滔不絕,如若無人,讓不懂技術(shù)的妹子看你時眼神迷離,就好想落霞與孤鶩齊飛!
分布式架構(gòu)是一個非常復(fù)雜的體系,任何技術(shù)都不是孤立的存在,任何技術(shù)都無法適應(yīng)所有場景。作為一名分布式系統(tǒng)架構(gòu)或者資深研發(fā)人員,我們必須盡可能多的學(xué)習(xí)與之相關(guān)的各種知識,掌握各種技術(shù)的演進(jìn)路線,正式從一名碼農(nóng)蛻變成為架構(gòu)師
什么是分布式?
互聯(lián)網(wǎng)應(yīng)用的特點(diǎn)是:高并發(fā),海量數(shù)據(jù)。互聯(lián)網(wǎng)應(yīng)用的用戶數(shù)是沒有上限的(取決于其開放特性),這也是和傳統(tǒng)應(yīng)用的本質(zhì)區(qū)別。高并發(fā)指系統(tǒng)單位時間內(nèi)收到的請求數(shù)量(取決于使用的用戶數(shù)),沒有上限。海量數(shù)據(jù)包括:海量數(shù)據(jù)的存儲和海量數(shù)據(jù)的處理。這兩個工程難題都可以使用分布式系統(tǒng)來解決。
簡單理解,分布式系統(tǒng)就是把一些計算機(jī)通過網(wǎng)絡(luò)連接起來,然后協(xié)同工作。協(xié)同工作需要解決兩個問題:
1)任務(wù)分解
把一個問題拆解成若干個獨(dú)立任務(wù),每個任務(wù)在一臺節(jié)點(diǎn)上運(yùn)行,實(shí)現(xiàn)多任務(wù)的并發(fā)執(zhí)行。
2)節(jié)點(diǎn)通信
節(jié)點(diǎn)之間互相通信,需要設(shè)計特定的通信協(xié)議來實(shí)現(xiàn)。協(xié)議可以采用RPC或Message Queue等方式。
分布式和集群的關(guān)系
分布式:一個業(yè)務(wù)分拆多個子業(yè)務(wù),部署在不同的服務(wù)器上
集群:同一個業(yè)務(wù),部署在多個服務(wù)器上
計算機(jī)發(fā)展歷史
第一臺電子計算機(jī)誕生以后,意味著一個日新月異的IT時代的到來。一方面單臺計算機(jī)的性能每年都在提升:從最早的8位CPU到現(xiàn)在的64位CPU;從早期的MB級內(nèi)存到現(xiàn)在的GB級別內(nèi)存;從慢速的機(jī)械存儲到現(xiàn)在的固態(tài)SSD硬盤存儲。
|
tips: 電子計算機(jī)的問世,最重要的奠基人是英國科學(xué)家艾蘭· 圖靈(Alan Turing)和美籍匈牙利科學(xué)家馮· 諾依曼(John Von· Neumann)。圖靈的貢獻(xiàn)是建立了圖靈機(jī)的理論模型,奠定了人工智能的基礎(chǔ)。而馮· 諾依曼則是首先提出了計算機(jī)體系結(jié)構(gòu)的設(shè)想。
經(jīng)典理論-馮.諾依曼體系:計算機(jī)硬件由運(yùn)算器、控制器、存儲器、輸入設(shè)備、輸出設(shè)備五大部分組成。直到今天,計算機(jī)仍沒有跳出該體系的范疇。
?
2.1 IBM大型機(jī)曾支撐美國航天登月計劃
2.2 IBM主機(jī)一直服務(wù)于金融等核心行業(yè)的關(guān)鍵領(lǐng)域
由于高可靠性和超強(qiáng)的計算能力,幾遍在X86和云計算飛速發(fā)展的情況下,IBM的大型機(jī)依然牢牢占據(jù)著一定的高端市場份額
以X86 CPU為架構(gòu)的價格便宜的面向個人的PC
以RISC CPU為架構(gòu)的價格昂貴的面向企業(yè)的小型UNIX服務(wù)器
分布式架構(gòu)發(fā)展的里程碑
大型主機(jī)的出現(xiàn)。憑借著大型機(jī)超強(qiáng)的計算和I/O處理能力、穩(wěn)定性、安全性等,在很長一段時間內(nèi),大型機(jī)引領(lǐng)了計算機(jī)行業(yè)及商業(yè)計算領(lǐng)域的發(fā)展。
而集中式的計算機(jī)系統(tǒng)架構(gòu)也成為了主流。
隨著計算機(jī)的發(fā)展,這種架構(gòu)越來越難以適應(yīng)人們的需求,比如說
由于大型主機(jī)的復(fù)雜性,導(dǎo)致培養(yǎng)一個能夠熟練運(yùn)維大型主機(jī)的人的成本很高
大型主機(jī)很貴,一般只有土豪(政府、金融、電信)才能用得起
單點(diǎn)問題,一臺大型主機(jī)出現(xiàn)故障,那么整個系統(tǒng)將處于不可用狀態(tài)。而對于大型機(jī)的使用群體來說,這種不可用導(dǎo)致的損失是非常大的
科技在進(jìn)步,技術(shù)在進(jìn)步。PC機(jī)性能不斷提升,很多企業(yè)放棄大型機(jī)改用小型機(jī)及普通PC來搭建系統(tǒng)架構(gòu)
阿里巴巴在2009年發(fā)起了一項"去IOE"運(yùn)動
當(dāng)初指的是IBM小型機(jī)、Oracle數(shù)據(jù)庫、EMC的高端存儲
2009年“去IOE”戰(zhàn)略透露,到2013年5月17日最后一臺IBM小型機(jī)在支付寶下線。
為什么要去IOE?
阿里巴巴過去一直采用的是Oracle數(shù)據(jù)庫,并利用小型機(jī)和高端存儲設(shè)備提供高性能的數(shù)據(jù)處理和存儲服務(wù)。隨著業(yè)務(wù)的不斷發(fā)展,數(shù)據(jù)量和業(yè)務(wù)量呈爆發(fā)性增長,傳統(tǒng)的集中式Oracle數(shù)據(jù)庫架構(gòu)在擴(kuò)展性方面遭遇瓶頸。
傳統(tǒng)的商業(yè)數(shù)據(jù)庫軟件(Oracle,DB2),多以集中式架構(gòu)為主,這些傳統(tǒng)數(shù)據(jù)庫軟件的最大特點(diǎn)就是將所有的數(shù)據(jù)都集中在一個數(shù)據(jù)庫中,依靠大型高端設(shè)備來提供高處理能力和擴(kuò)展性。集中式數(shù)據(jù)庫的擴(kuò)展性主要采用向上擴(kuò)展(Scale up)的方式,通過增加CPU,內(nèi)存,磁盤等方式提高處理能力。這種集中式數(shù)據(jù)庫的架構(gòu),使得數(shù)據(jù)庫成為了整個系統(tǒng)的瓶頸,已經(jīng)越來越不適應(yīng)海量數(shù)據(jù)對計算能力的巨大需求
架構(gòu)的發(fā)展演變過程
一個成熟的大型網(wǎng)站系統(tǒng)架構(gòu)并不是一開始就設(shè)計的非常完美,也不是一開始就具備高性能、高可用、安全性等特性,而是隨著用戶量的增加、業(yè)務(wù)功能的擴(kuò)展逐步完善演變過來的。在這個過程中,開發(fā)模式、技術(shù)架構(gòu)等都會發(fā)生非常大的變化。而針對不同業(yè)務(wù)特征的系統(tǒng),會有各自的側(cè)重點(diǎn),比如像淘寶這類的網(wǎng)站,要解決的是海量商品搜索、下單、支付等問題;像騰訊,要解決的是數(shù)億級別用戶的實(shí)時消息傳輸;百度所要解決的是海量數(shù)據(jù)的搜索。每一個種類的業(yè)務(wù)都有自己不同的系統(tǒng)架構(gòu)。我們簡單模擬一個架構(gòu)演變過程。
什么是大型網(wǎng)站
如何定義一個網(wǎng)站是不是大型網(wǎng)站,一般我們會從兩個緯度去考衡,訪問量以及數(shù)據(jù)量,二者缺一不可。
我們以javaweb為例,來搭建一個簡單的電商系統(tǒng),從這個系統(tǒng)中來看系統(tǒng)的演變歷史;要注意的是,接下來的演示模型,關(guān)注的是數(shù)據(jù)量、訪問量提升,網(wǎng)站結(jié)構(gòu)發(fā)生的變化, 而不是具體關(guān)注業(yè)務(wù)功能點(diǎn)。其次,這個過程是為了讓大家更好的了解網(wǎng)站演進(jìn)過程中的一些問題和應(yīng)對策略。
假如我們系統(tǒng)具備以下功能:
用戶模塊:用戶注冊和管理
商品模塊:商品展示和管理
交易模塊:創(chuàng)建交易及支付結(jié)算
階段一 , 單應(yīng)用架構(gòu)
網(wǎng)站的初期也可以認(rèn)為是互聯(lián)網(wǎng)發(fā)展的早起,我們經(jīng)常會在單機(jī)上跑我們所有的程序和軟件。
把所有軟件和應(yīng)用都部署在一臺機(jī)器上,這樣就完成一個簡單系統(tǒng)的搭建,這個時候的講究的是效率
階段二,應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器分離
隨著網(wǎng)站的上線,訪問量逐步上升,服務(wù)器的負(fù)載慢慢提高,在服務(wù)器還沒有超載的時候,我們應(yīng)該做好規(guī)劃,提升網(wǎng)站的負(fù)載能力。假如代碼層面的優(yōu)化已經(jīng)沒辦法繼續(xù)提高,在不提高單臺機(jī)器的性能,增加機(jī)器是一個比較好的方式,投入產(chǎn)出比非常高。這個階段增加機(jī)器的主要目的是講web服務(wù)器和數(shù)據(jù)庫服務(wù)器拆分,這樣不僅提高了單機(jī)的負(fù)載能力,也提高了容災(zāi)能力
階段三,應(yīng)用服務(wù)器集群-應(yīng)用服務(wù)器負(fù)載告警,如何讓應(yīng)用服務(wù)器走向集群
隨著訪問量的繼續(xù)增加,單臺應(yīng)用服務(wù)器已經(jīng)無法滿足需求。在假設(shè)數(shù)據(jù)庫服務(wù)器還沒有遇到性能問題的時候,我們可以增加應(yīng)用服務(wù)器,通過應(yīng)用服務(wù)器集群將用戶請求分流到各個服務(wù)器中,從而繼續(xù)提升負(fù)載能力。此時多臺應(yīng)用服務(wù)器之間沒有直接的交互,他們都是依賴數(shù)據(jù)庫各自對外提供服務(wù)
架構(gòu)發(fā)展到這個階段,各種問題也會慢慢呈現(xiàn)
用戶請求由誰來轉(zhuǎn)發(fā)到具體的應(yīng)用服務(wù)器
用戶如果每次訪問到的服務(wù)器不一樣,那么如何維護(hù)session
階段四,數(shù)據(jù)庫壓力變大,數(shù)據(jù)庫讀寫分離
架構(gòu)演變到這里,并不是終點(diǎn)。上面我們把應(yīng)用層的性能拉上來了,但是數(shù)據(jù)庫的負(fù)載也在慢慢增大,那么怎么去提高數(shù)據(jù)庫層面的負(fù)載呢?有了前面的思路以后,自然會想到增加服務(wù)器。但是假如我們單純的把數(shù)據(jù)庫一分為二,然后對于后續(xù)數(shù)據(jù)庫的請求,分別負(fù)載到兩臺數(shù)據(jù)庫服務(wù)器上,那么一定會造成數(shù)據(jù)庫不統(tǒng)一的問題。所以我們一般先考慮讀寫分離的方式
這個架構(gòu)的變化會帶來幾個問題
主從數(shù)據(jù)庫之間的數(shù)據(jù)同步 ; 可以使用mysql自帶的master-slave方式實(shí)現(xiàn)主從復(fù)制
對應(yīng)數(shù)據(jù)源的選擇 ; 采用第三方數(shù)據(jù)庫中間件,例如mycat
階段五,使用搜索引擎緩解讀庫的壓力
數(shù)據(jù)庫做讀庫的話,嘗嘗對模糊查找效率不是特別好,像電商類的網(wǎng)站,搜索是非常核心的功能,即便是做了讀寫分離,這個問題也不能有效解決。那么這個時候就需要引入搜索引擎了
使用搜索引擎能夠大大提高我們的查詢速度,但是同時也會帶來一些附加的問題,比如維護(hù)索引的構(gòu)建。
階段六,引入緩存機(jī)制緩解數(shù)據(jù)庫的壓力
隨著訪問量的持續(xù)增加,逐漸出現(xiàn)許多用戶訪問統(tǒng)一部分內(nèi)容的情況,對于這些熱點(diǎn)數(shù)據(jù),沒必要每次都從數(shù)據(jù)庫去讀取,我們可以使用緩存技術(shù),比如memcache、redis來作為我們應(yīng)用層的緩存;另外在某些場景下,比如我們對用戶的某些IP的訪問頻率做限制,那這個放內(nèi)存中又不合適,放數(shù)據(jù)庫又太麻煩,這個時候可以使用Nosql的方式比如mongDB來代替?zhèn)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫
階段七,數(shù)據(jù)庫的水平/垂直拆分
我們的網(wǎng)站演進(jìn)的變化過程,交易、商品、用戶的數(shù)據(jù)都還在同一個數(shù)據(jù)庫中,盡管采取了增加緩存,讀寫分離的方式,但是隨著數(shù)據(jù)庫的壓力持續(xù)增加,數(shù)據(jù)庫的瓶頸仍然是個最大的問題。因此我們可以考慮對數(shù)據(jù)的垂直拆分和水平拆分
垂直拆分:把數(shù)據(jù)庫中不同業(yè)務(wù)數(shù)據(jù)拆分到不同的數(shù)據(jù)庫
水平拆分:把同一個表中的數(shù)據(jù)拆分到兩個甚至跟多的數(shù)據(jù)庫中,水平拆分的原因是某些業(yè)務(wù)數(shù)據(jù)量已經(jīng)達(dá)到了單個數(shù)據(jù)庫的瓶頸,這時可以采取講表拆分到多個數(shù)據(jù)庫中
階段八,應(yīng)用的拆分
隨著業(yè)務(wù)的發(fā)展,業(yè)務(wù)越來越多,應(yīng)用的壓力越來越大。工程規(guī)模也越來越龐大。這個時候就可以考慮講應(yīng)用拆分,按照領(lǐng)域模型講我們的用戶、商品、交易拆分成多個子系統(tǒng)
這樣拆分以后,可能會有一些相同的代碼,比如用戶操作,在商品和交易都需要查詢,所以會導(dǎo)致每個系統(tǒng)都會有用戶查詢訪問相關(guān)操作。這些相同的操作一定是要抽象出來,否則就會是一個坑。所以通過走服務(wù)化路線的方式來解決
那么服務(wù)拆分以后,各個服務(wù)之間如何進(jìn)行遠(yuǎn)程通信呢?
通過RPC技術(shù),比較典型的有:webservice、hessian、http、RMI等等
前期通過這些技術(shù)能夠很好的解決各個服務(wù)之間通信問題,but,互聯(lián)網(wǎng)的發(fā)展是持續(xù)的,所以架構(gòu)的演變和優(yōu)化還在持續(xù)。
總結(jié)
我們通過這個例子來講解了電商網(wǎng)站的架構(gòu)演進(jìn)。我要強(qiáng)調(diào)一下,這個架構(gòu)的演進(jìn)不是某個網(wǎng)站真實(shí)的例子,實(shí)際上是通過這樣一個演進(jìn)過程給大家?guī)硪粋€全局的觀念和感受。以及給大家在后續(xù)課程學(xué)習(xí)過程中的一些思路。
如何把單擊擴(kuò)展到分布式
前面我們講到了馮.諾依曼模型,計算機(jī)一共由5個部分組成,從用戶角度來看,分布式系統(tǒng)就像一臺超級計算機(jī)。理論上也應(yīng)該由輸入、輸出、運(yùn)算、存儲和控制這5部分組成。
輸入設(shè)備的變化
在分布式系統(tǒng)架構(gòu)中,輸入設(shè)備可以分兩類,第一類是互相連接的多個節(jié)點(diǎn),在接收其他節(jié)點(diǎn)傳來的信息作為該節(jié)點(diǎn)的輸入;另一種就是傳統(tǒng)意義上的人機(jī)交互的輸入設(shè)備了
輸出設(shè)備的變化
輸出和輸入類似,也有兩種,一種是系統(tǒng)中的節(jié)點(diǎn)向其他節(jié)點(diǎn)傳輸信息時,該節(jié)點(diǎn)可以看作是輸出設(shè)備;另一種就是傳統(tǒng)意義上的人際交互的輸出設(shè)備,比如用戶的終端
控制器的變化
在單機(jī)中,控制器指的是CPU中的控制器,在分布式系統(tǒng)中,控制器主要的作用是協(xié)調(diào)或控制節(jié)點(diǎn)之間的動作和行為;比如硬件負(fù)載均衡器;LVS軟負(fù)載;規(guī)則服務(wù)器等
運(yùn)算器
在分布式系統(tǒng)中,運(yùn)算器是由多個節(jié)點(diǎn)來組成的。運(yùn)用多個節(jié)點(diǎn)的計算能力來協(xié)同完成整體的計算任務(wù)
存儲器
在分布式系統(tǒng)中,我們需要把承擔(dān)存儲功能的多個節(jié)點(diǎn)組織在一起,組成一個整體的存儲器;比如數(shù)據(jù)庫、redis(key-value存儲)
對Java架構(gòu)技術(shù)感興趣的同學(xué),歡迎加QQ群619881427,一起學(xué)習(xí),相互討論。
群內(nèi)已經(jīng)有小伙伴將知識體系整理好(源碼,筆記,PPT,學(xué)習(xí)視頻),歡迎加群免費(fèi)領(lǐng)取。
分享給喜歡的Java的,喜歡編程,有夢想成為架構(gòu)師的程序員們,希望能夠幫助到你們。
不是的Java的程序員也沒關(guān)系,幫忙轉(zhuǎn)發(fā)給更多朋友!謝謝。
分享一個小技巧點(diǎn)擊閱讀原文也。。可以輕松獲取學(xué)習(xí)資料哦!
關(guān)注微信公眾號:Java架構(gòu)師學(xué)習(xí),觀看更多的Java技術(shù)干貨資料分享
轉(zhuǎn)載于:https://www.cnblogs.com/xueSpring/p/9681440.html
總結(jié)
以上是生活随笔為你收集整理的互联网分布式架构技术概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ruby中的复制 dup clone
- 下一篇: 敏捷与 DevOps:是敌是友?