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