1. 程式人生 > >分散式框架演進過程

分散式框架演進過程

最近開始接觸分散式,就寫下自己學到筆記整理。學自咕泡學院。

分散式架構的常見概念

    單機:一臺伺服器處理整個專案所有的服務。

               例:一個飯店有一個廚師,這個廚師負責切菜炒菜全乾。

                

    叢集:把單機複製到多個伺服器,多個伺服器相互不依賴的為專案提供服務。

               例:後來客人多了,一個廚師忙不過來,又請來了一個或者2個廚師,這些廚師都幹一樣的活就是切菜炒菜。這些廚師的關係是叢集。

                

       分散式:多個服務相互依賴共同為專案提供服務,每個伺服器只為專案中其中一個功能提供服務。

               例如:為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切 菜,備菜,備料,廚師和配菜師的關係是分佈 式,一個配菜師 也忙不過來了,又請了個配菜師,兩個配菜師關係是叢集。

                

架構的發展過程

    一個成熟的大型網站系統架構並不是一開始就設計的非常完 美,也不是一開始就具備高效能、高可用、安全性等特性,而 是隨著使用者量的增加、業務功能的擴充套件逐步完善演變過來的。

    我們簡單模擬一個架構演變過程。 我們以javaweb為例,來搭建一個簡單的電商系統,從這個系 統中來看系統的演變歷史;要注意的是,接下來的演示模型, 關注的是資料量、訪問量提升,網站結構發生的變化, 而不是 具體關注業務功能點。

    假如我們系統具備以下功能: 使用者模組:使用者註冊和管理 商品模組:商品展示和管理 交易模組:建立交易及支付結算

階段一:單應用架構


    網站的初期,我們經常會在單機上跑我們所有的程式和軟體。 把所有軟體和應用都部署在一臺機器上,這樣就完成一個簡單 系統的搭建,這個時候的講究的是效率。

階段二:應用伺服器和資料庫伺服器分離

    隨著業務發展,訪問量的逐步上升,伺服器的複製慢慢提高。這個時候一臺伺服器已經沒辦法滿足正常的使用者訪問。加入程式碼層面的優化沒有辦法繼續提高,在不提高單臺伺服器的效能的情況下是一個比較好的方式。

    這個階段增加伺服器的主要目的就是將wen伺服器和資料庫伺服器拆分,這樣不僅能提高單臺伺服器的負載能力,也提高了容災能力。

        

階段三:應用伺服器叢集

    隨著訪問量的繼續增加,單臺應用伺服器已經無法滿足需求。在假設資料伺服器還沒有遇到效能問題的時候,我們可以增加應用伺服器,通過應用伺服器叢集來把使用者的請求分流到各個伺服器中,從而繼續提升負載能力,此時多臺應用伺服器之間沒 有直接的互動,他們都是依賴資料庫各自對外提供服務。

架構發展到這個階段,各種問題也會慢慢呈現

1. 使用者請求由誰來轉發到具體的應用伺服器

2. 使用者如果每次訪問到的伺服器不一樣,那麼如何維護 session

階段四:資料庫壓力變大,資料庫讀寫分離

    應用伺服器的提升帶來的問題就是資料庫的負載也在慢慢變大,如何來提高資料庫的負載呢?既然一臺資料庫伺服器不行,那就增加伺服器。但是假如我 們單純的把資料庫一分為二,然後對於後續資料庫的請求,分別負 載到兩臺資料庫伺服器上,那麼一定會造成資料庫不統一的問題。 所以我們一般先考慮讀寫分離的方式。因為應用中百分之80的情況是在讀資料,只有百分之20在寫資料。

這個架構的變化會帶來幾個問題 :

1. 主從資料庫之間的資料同步  ; 可以使用 mysql 自帶的 master-slave方式實現主從複製

2. 對應資料來源的選擇 ; 採用第三方資料庫中介軟體,例如mycat

階段五:使用搜索引擎緩解讀庫的壓力

    資料庫做讀庫的話,嚐嚐對模糊查詢效率不是特別好,像電商類的 網站,搜尋是非常核心的功能,即便是做了讀寫分離,這個問題也 不能有效解決。那麼這個時候就需要引入搜尋引擎了 使用搜索引擎能夠大大提高我們的查詢速度,但是同時也會帶來一 些附加的問題,比如維護索引的構建。
   

階段六:引入快取機制緩解資料庫的壓力

        隨著訪問量的持續增加,逐漸出現許多使用者訪問統一部分內容的情 況,對於這些熱點資料,沒必要每次都從資料庫去讀取,我們可以 使用快取技術,比如memcache、redis來作為我們應用層的快取; 另外在某些場景下,比如我們對使用者的某些IP的訪問頻率做限制, 那這個放記憶體中又不合適,放資料庫又太麻煩,這個時候可以使用 Nosql的方式比如mongDB來代替傳統的關係型資料庫

    

階段七:資料庫的水平/垂直拆分

    我們的網站演進的變化過程,交易、商品、使用者的資料都還在同一 個數據庫中,儘管採取了增加快取,讀寫分離的方式,但是隨著數 據庫的壓力持續增加,資料庫的瓶頸仍然是個最大的問題。因此我 們可以考慮對資料的垂直拆分和水平拆分

垂直拆分:把資料庫中不同業務資料拆分到不同的資料庫

水平拆分:把同一個表中的資料拆分到兩個甚至跟多的資料庫中, 水平拆分的原因是某些業務資料量已經達到了單個數據庫的瓶頸, 這時可以採取講表拆分到多個數據庫中

階段八:應用的拆分

隨著業務的發展,業務越來越多,應用的壓力越來越大。工程規模 也越來越龐大。這個時候就可以考慮講應用拆分,按照領域模型講 我們的使用者、商品、交易拆分成多個子系統

這樣拆分以後,可能會有一些相同的程式碼,比如使用者操作,在商品 和交易都需要查詢,所以會導致每個系統都會有使用者查詢訪問相關 操作。這些相同的操作一定是要抽象出來,否則就會是一個坑。所 以通過走服務化路線的方式來解決 。

那麼服務拆分以後,各個服務之間如何進行遠端通訊呢? 通過RPC技術,比較典型的有:webservice、hessian、http、RMI 等等 前期通過這些技術能夠很好的解決各個服務之間通訊問題,but, 網際網路的發展是持續的,所以架構的演變和優化還在持續。

學自咕泡學院。