1. 程式人生 > >分散式架構演進分析

分散式架構演進分析

分散式和叢集的關係

分散式:一個業務分拆多個子業務,部署在不同的伺服器上

叢集:同一個業務,部署在多個伺服器上

分散式架構的里程碑

    大型主機的出現。憑藉著大型機超強的計算和I/O處理能力、穩定性、安全性等,在很長一段時間內,大型機引領了計算機行業及商業計算領域的發展。而集中式的計算機系統架構也成為了主流。隨著計算機的發展,這種架構越來越難以適應人們的需求,比如說由於大型主機的複雜性,導致培養一個能夠熟練運維大型主機的人的成本很高大型主機很貴,一般只有土豪(政府、金融、電信)才能用得起單點問題,一臺大型主機出現故障,那麼整個系統將處於不可用狀態。而對於大型機的使用群體來說,這種不可用導致的損失是非常大的科技在進步,技術在進步。PC

機效能不斷提升,很多企業放棄大型機改用小型機及普通PC來搭建系統架構。

架構演變

一個成熟的大型網站系統架構並不是一開始就設計的非常完美,也不是一開始就具備高效能、高可用、安全性等特性,而是隨著使用者量的增加、業務功能的擴充套件逐步完善演變過來的。在這個過程中,開發模式、技術架構等都會發生非常大的變化。而針對不同業務特徵的系統,會有各自的側重點,比如像淘寶這類的網站,要解決的是海量商品搜尋、下單、支付等問題;像騰訊,要解決的是數億級別使用者的實時訊息傳輸;百度所要解決的是海量資料的搜尋。每一個種類的業務都有自己不同的系統架構。我們簡單模擬一個架構演變過程。

網站演變

如何定義一個網站是不是大型網站,一般我們會從兩個緯度去考衡,訪問量以及資料量,二者缺一不可。我們以

javaweb為例,來搭建一個簡單的電商系統,從這個系統中來看系統的演變歷史;要注意的是,接下來的演示模型,關注的是資料量、訪問量提升,網站結構發生的變化, 而不是具體關注業務功能點。其次,這個過程是為了讓大家更好的瞭解網站演進過程中的一些問題和應對策略。

里程碑之一:單應用架構

網站的初期也可以認為是網際網路發展的早起,我們經常會在單機上跑我們所有的程式和軟體。

把所有軟體和應用都部署在一臺機器上,這樣就完成一個簡單系統的搭建,這個時候的講究的是效率。

里程碑之二:應用伺服器和資料庫伺服器分離

隨著網站的上線,訪問量逐步上升,伺服器的負載慢慢提高,在伺服器還沒有超載的時候,我們應該做好規劃,提升網站的負載能力。假如程式碼層面的優化已經沒辦法繼續提高,在不提高單臺機器的效能,增加機器是一個比較好的方式,投入產出比非常高。這個階段增加機器的主要目的是講

web伺服器和資料庫伺服器拆分,這樣不僅提高了單機的負載能力,也提高了容災能力。

里程碑之三:應用伺服器叢集-應用伺服器負載告警,如何讓應用伺服器走向叢集

隨著訪問量的繼續增加,單臺應用伺服器已經無法滿足需求。在假設資料庫伺服器還沒有遇到效能問題的時候,我們可以增加應用伺服器,通過應用伺服器叢集將使用者請求分流到各個伺服器中,從而繼續提升負載能力。此時多臺應用伺服器之間沒有直接的互動,他們都是依賴資料庫各自對外提供服務。架構發展到這個階段,各種問題也會慢慢呈現使用者請求由誰來轉發到具體的應用伺服器使用者如果每次訪問到的伺服器不一樣,那麼如何維護session。

里程碑之四:資料庫壓力變大,資料庫讀寫分離

架構演變到這裡,並不是終點。上面我們把應用層的效能拉上來了,但是資料庫的負載也在慢慢增大,那麼怎麼去提高資料庫層面的負載呢?有了前面的思路以後,自然會想到增加伺服器。但是假如我們單純的把資料庫一分為二,然後對於後續資料庫的請求,分別負載到兩臺資料庫伺服器上,那麼一定會造成資料庫不統一的問題。所以我們一般先考慮讀寫分離的方式。

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

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

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

里程碑之五:採用搜尋引擎緩解讀庫的壓力

資料庫做讀庫的話,嚐嚐對模糊查詢效率不是特別好,像電商類的網站,搜尋是非常核心的功能,即便是做了讀寫分離,這個問題也不能有效解決。那麼這個時候就需要引入搜尋引擎了。

使用搜索引擎能夠大大提高我們的查詢速度,但是同時也會帶來一些附加的問題,比如維護索引的構建。

里程碑之六:採用快取機制緩解資料庫的壓力

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

里程碑之七:資料庫的水平/垂直拆分

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

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

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

里程碑之八:應用的拆分

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

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

那麼服務拆分以後,各個服務之間如何進行遠端通訊呢?

通過RPC技術,比較典型的有:webservicehessianhttpRMI等等。

前期通過這些技術能夠很好的解決各個服務之間通訊問題,but,網際網路的發展是持續的,所以架構的演變和優化還在持續。