分布式架構(gòu)演進總結(jié)

一、前言?  隨著社會的發(fā)展,技術(shù)的進步,以前的大型機架構(gòu)很顯然由于高成本、難維護等原因漸漸地變得不再那么主流了,替代它的就是當下最火的分布式架構(gòu),從大型機到分布式,經(jīng)歷了好幾個階段,我們弄明白各個階段的架構(gòu),才能更好地理解和體會分布式架構(gòu)的好處,那么本文我們就來聊聊分布式架構(gòu)的演進過程,希望能給大家?guī)硌矍耙涣恋母杏X。二、背景說明?  我們都知道一個成熟的大型網(wǎng)站的系統(tǒng)架構(gòu)并非一開始就設(shè)計的非常完美,也沒有一開始就具備高性能、高并發(fā)、高可用、安全性等特性,而是隨著用戶量的增加、業(yè)務(wù)功能的擴展逐步演變過來的,慢慢的完善的。 在這個過程中,開發(fā)模式、技術(shù)架構(gòu)等都會隨著迭代發(fā)生非常大的變化。 而針對不同業(yè)務(wù)特征的系統(tǒng),各自都會有自己的側(cè)重點,例如像淘寶這類的網(wǎng)站,要解決的重點問題就是海量商品搜索、下單、支付等問題; 像騰訊這類的網(wǎng)站,要解決的是數(shù)億級別用戶的實時消息傳輸;而像百度這類的公司所要解決的又是海量數(shù)據(jù)的搜索。每一個種類的業(yè)務(wù)都有自己不同的系統(tǒng)架構(gòu)。

?  下面我們來簡單模擬一個架構(gòu)演變過程。 我們以 javaweb 為例,來搭建一個簡單的電商系統(tǒng),從這個系統(tǒng)中來看系統(tǒng)的演變過程。要注意的是接下來的演示模型, 關(guān)注的是數(shù)據(jù)量、訪問量提升,網(wǎng)站結(jié)構(gòu)的變化, 而不關(guān)注具體業(yè)務(wù)的功能點。其次,這個過程是為了讓大家能更好的了解網(wǎng)站演進過程中的一些問題和應(yīng)對策略。

?假如我們系統(tǒng)具備以下功能:

用戶模塊:用戶注冊和管理。

商品模塊:商品展示和管理。

交易模塊:創(chuàng)建交易及支付結(jié)算。

三、階段一:單應(yīng)用架構(gòu)?

  這個階段是網(wǎng)站的初期,也可以認為是互聯(lián)網(wǎng)發(fā)展的早期,系統(tǒng)架構(gòu)如上圖所示。我們經(jīng)常會在單臺服務(wù)器上運行我們所有的程序和軟件。 把所有軟件和應(yīng)用都部署在一臺機器上,這樣就完成一個簡單系統(tǒng)的搭建,這個階段的講究的是效率。效率決定生死。四、階段二:應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器分離?  隨著網(wǎng)站的上線,訪問量逐步上升,服務(wù)器的負載慢慢提高,我們應(yīng)該在服務(wù)器還沒有超載的時候就做好規(guī)劃、提升網(wǎng)站的負載能力。假若此時已經(jīng)沒辦法在代碼層面繼續(xù)優(yōu)化提高,那么在單臺機器的性能遇到瓶頸的時候,增加機器是一個比較簡單好用的方式,投入產(chǎn)出比相當高。這個階段增加機器的主要目的是將 web 服務(wù)器和 數(shù)據(jù)庫服務(wù)器拆分開來,這樣做的話不僅提高了單機的負載能力,也提高了整個系統(tǒng)的容災(zāi)能力。

  ?這個階段的系統(tǒng)架構(gòu)如上圖所示,應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器完全隔離開來,相互互不影響,大大減少了網(wǎng)站宕機的風(fēng)險,此階段我們已經(jīng)開始關(guān)注到應(yīng)用服務(wù)器的管理了。五、階段三:應(yīng)用服務(wù)器集群?  這個階段,隨著訪問量的繼續(xù)不斷增加,單臺應(yīng)用服務(wù)器已經(jīng)無法滿足我們的需求。 假設(shè)我的數(shù)據(jù)庫服務(wù)器還沒有遇到性能問題,那我們可以通過增加應(yīng)用服務(wù)器的方式來將應(yīng)用服務(wù)器集群化,這樣就可以將用戶請求分流到各個服務(wù)器中,從而達到繼續(xù)提升系統(tǒng)負載能力的目的。此時各個應(yīng)用服務(wù)器之間沒有直接的交互,他們都是依賴數(shù)據(jù)庫各自對外提供服務(wù)。

系統(tǒng)架構(gòu)發(fā)展到這個階段,各種問題也會接踵而至:

用戶請求交由誰來轉(zhuǎn)發(fā)到具體的應(yīng)用服務(wù)器上(誰來負責(zé)負載均衡)

用戶如果每次訪問到的服務(wù)器不一樣,那么如何維護

session,達到session共享的目的。

那么此時,系統(tǒng)架構(gòu)又會變成如下方式:

?  負載均衡又可以分為軟負載和硬負載。軟負載我們可以選擇Nginx、Apache等,硬負載我們可以選擇F5等。而session共享問題我們可以通過配置tomcat的session共享解決。六、階段四:數(shù)據(jù)庫壓力變大,數(shù)據(jù)庫讀寫分離  架構(gòu)演變到上面的階段,并不是終點。通過上面的設(shè)計,應(yīng)用層的性能被我們拉上來了, 但數(shù)據(jù)庫的負載也在逐漸增大,那如何去提高數(shù)據(jù)庫層面的性能呢?有了前面的設(shè)計思路以后,我們自然也會想到通過增加服務(wù)器來提高性能。但假如我們單純的把數(shù)據(jù)庫一分為二,然后對于數(shù)據(jù)庫的請求,分別負載到兩臺數(shù)據(jù)庫服務(wù)器上,那必定會造成數(shù)據(jù)庫數(shù)據(jù)不統(tǒng)一的問題。 所以我們一般先考慮將數(shù)據(jù)庫讀寫分離。

這個架構(gòu)設(shè)計的變化會帶來如下幾個問題:

主從數(shù)據(jù)庫之間的數(shù)據(jù)需要同步(可以使用 mysql 自帶的 master-slave 方式實現(xiàn)主從復(fù)制 )

應(yīng)用中需要根據(jù)業(yè)務(wù)進行對應(yīng)數(shù)據(jù)源的選擇( 采用第三方數(shù)據(jù)庫中間件,例如 mycat )

七、階段五:使用搜索引擎緩解讀庫的壓力?  我們都知道數(shù)據(jù)庫常常對模糊查找效率不是很高,像電商類的網(wǎng)站,搜索是非常核心的功能,即使是做了讀寫分離,這個問題也不能得到有效解決。那么這個時候我們就需要引入搜索引擎了,使用搜索引擎能夠大大提升我們系統(tǒng)的查詢速度,但同時也會帶來一 些附加的問題,比如維護索引的構(gòu)建、數(shù)據(jù)同步到搜索引擎等。

八、階段六:引入緩存機制緩解數(shù)據(jù)庫的壓力?  然后,隨著訪問量的持續(xù)不斷增加,逐漸會出現(xiàn)許多用戶訪問同一內(nèi)容的情況,那么對于這些熱點數(shù)據(jù),沒必要每次都從數(shù)據(jù)庫重讀取,這時我們可以使用到緩存技術(shù),比如 redis、memcache 來作為我們應(yīng)用層的緩存。另外在某些場景下,如我們對用戶的某些 IP 的訪問頻率做限制, 那這個放內(nèi)存中就又不合適,放數(shù)據(jù)庫又太麻煩了,那這個時候可以使用 Nosql 的方式比如 mongDB 來代替?zhèn)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫。

九、階段七:數(shù)據(jù)庫的水平/垂直拆分  我們的網(wǎng)站演進的變化過程,交易、商品、用戶的數(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)達到了單個數(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ù)之間如何進行遠程通信呢? 通過 RPC 技術(shù),比較典型的有:dubbo、webservice、hessian、http、RMI 等等。前期通過這些技術(shù)能夠很好的解決各個服務(wù)之間通信問題,但是, 互聯(lián)網(wǎng)的發(fā)展是持續(xù)的,所以架構(gòu)的演變和優(yōu)化也還在持續(xù)。后續(xù)。。。。。。。。繼續(xù)升級演進。。。。。

原文鏈接:

分布式架構(gòu)演進總結(jié) - 在途中# - 博客園

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容