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