1. 程式人生 > >一篇文章看懂分布式架構的演進過程,你也能輕松上手

一篇文章看懂分布式架構的演進過程,你也能輕松上手

Java Java開發 Java編程

技術分享圖片


一.分布式架構的發展歷史

1946年,世界上第一臺電子計算機在美國的賓夕法尼亞大學誕生,它的名字是:ENICAC ,這臺計算機的體重比較大,計算速度也不快,但是而代表了計算機時代的到來,再以後的互聯網的發展中也有基礎性的意義。

計算機的組成是有五部分完成的,分別是:輸入設備,輸出設備,存儲器,存儲器裏面由運算器和控制器,有一個馮諾依曼的模型非常形象的對象計算機的組成進行了描述,不過計算機也是有數據流,指令流,控制流來進行計算的和正常運轉的。如圖:

技術分享圖片


ENIAC之後,電子計算機進入到了IBM主導的大型機的時代, 在1946年第一臺IBM大型機SYSTEM/360誕生,這使得IBM在20世紀50~60年代統治了整個大型計算機的工業,在大型主機時代,計算機架構向兩個方向發展CISC(微處理器執行的計算機語言指令集)CPU為架構的價格便宜的個人PC和RISC(精簡指令集計算機)價格高的小型UNIX服務器。

大型主機的出現,憑借著計算能力和處理能力,高的穩定性和安全性,在很長的一段時間內引領到計算領域的發展。但是集中式的計算機系統來帶來了一些問題,來越來越不能滿足用戶的需求比如說:

1.大型的主機非常貴,一般的小企業用不起。

2.大型主機比較復雜,培養人才的成本比較高。

3.單點問題,如過大型機出現故障,整個系統都掛了運行不了,使企業的損失非常大。

4.隨著技術的進步,個人PC電腦的性能越來越高,成本也越來越低。


阿裏巴巴在2009年發起了一項去“IOE”的驅動

IOE指的是IBM的小型機,Oracle的數據庫和EMC的高端存儲設備,2009年的去IOE的運動,一直到2003的支付寶的最後一臺IBM的小型機的下線。


為什麽要去IOE

阿裏巴巴過去數據庫使用的是Oracle,並使用小型機和高端存儲設備提供高性能的數據處理和存儲服務。隨著公司的業務量的上升,用戶規模的不斷上漲,傳統的集中式的架構Oracle數據庫在擴展方面遭遇了瓶頸。向傳統的Oracle,DB2都是以集中式的為主,存在的缺點就是擴展性的不足,集中式的擴展主要是采用的是向上的擴展不是水平的擴展,這樣時間長了,早晚都會遇到系統瓶頸。


一.分布式架構的常見概念

集群

小飯店原來是一個廚師,切菜洗菜備料炒菜全幹。後來客人多了,廚房一個廚師忙不過來,又請了個廚師,兩個廚師都能炒一樣的菜,這兩個廚師的關系就是集群。

技術分享圖片


分布式

為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切菜,備菜,備料,廚師和配菜師的關系就是分布式的,一個配菜師也忙不過來,有請了個配菜師,這兩個配菜師的關系就是集群了。所以說有分布式的架構中可能有集群,但集群不等於有分布式。

技術分享圖片


節點

節點是指一個可以獨立按照分布式協議完成一組邏輯的程序個體。在具體的項目中,一個節點表示的是一個操作系統上的進程。


副本機制

副本指的是在分布式系統中為數據或服務提供冗余。

數據副本指在不同的節點上持久化同一份數據,當出現某一個節點的數據丟失時,可以從副本讀取數據。數據副本是分布式系統中結果數據丟失的唯一手段。

服務副本表示的是多個節點提供相同的服務,通過主從關系來實現服務的高可用方案。


中間件

中間件位與操作系統提供的服務之外,又不屬於應用,它是位與應用和系統層之間為開發者方便的處理通信,輸入和輸出的一類軟件,能夠讓用戶關心自己應用的一部分。


架構的發展過程

一個成熟的大型網站系統架構並不是一開始就設計的非常完美的,也不是一開始就具備高性能,高可用,安全性等特性,而是隨著用戶量的增加,業務功能的擴展慢慢完善演變過來的。在這個發展過程中,開發模式,技術架構等都會發生非常大的變化。

假如系統具備一下功能:

用戶模塊:用戶註冊和管理

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

交易模塊:創建交易及支付結算


階段一:單應用架構

系統的初級都是應用和數據庫都放在一臺服務器上。

技術分享圖片


階段二:應用服務器和數據庫服務器分離

隨著網站的用戶量增大,流量增大,對應用服務器和數據庫服務器單獨的部署機器,這樣可以增加系統的性能,提高訪問的效率,提高單機的負載能力和容災的能力。


階段三:應用服務器集群-應用服務器負載告警

隨著訪問量和流量的增加,假設數據庫沒有遇到瓶頸,對應用服務器集群來對請求進行分流,提高程序的性能。存在的問題:用戶的請求由誰來轉發,session如何來管理的問題。

技術分享圖片


階段四:數據庫壓力變大-數據庫讀寫分離

讀寫分離的話,這樣以後的請求,查詢的請求就可以去從庫裏面讀數據,寫的數據可以到主庫中了,但是會帶來幾個問題:

1.主從的數據庫之間的數據同步:可以使用mysql自帶的master-slave方式實現主從復制

2.對應的數據源的選擇:采用第三方數據庫中間件,例如:mycat

技術分享圖片


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

數據庫做讀庫的話,常常對模糊查詢的性能不是很好,特別是對於大型的互聯網公司來說,想搜索的模塊就比較核心了,這是可以使用搜索引擎了,雖然可以大幅度的提高查詢的速度,但是同時也會帶來一些問題比如索引的構建。

技術分享圖片


階段六:引入緩存機制緩解數據庫的壓力

對一些熱點的數據,可以使用redis,memcache來作為應用層的緩存;另外在某些場景下,可以使用mongodb來替代關系型數據庫來存儲。


階段七:數據庫的水平/垂直拆分

垂直拆分:把數據庫中不同的業務數據拆分到不同的數據庫中。

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

技術分享圖片


階段八:應用的拆分

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

技術分享圖片


這樣拆分以後,可能會有一些相同的代碼,比如用戶操作,商品的交易查詢,所有會導致每個系統都會有用戶查詢和訪問相關的操作。這些相同的代碼和模塊一定要抽象出來。這樣有利於維護和管理。

技術分享圖片


服務拆分以後,服務之間的通信可以通過RPC技術,比較典型的有:webservice、hession、http、RMI等。


如果你在Java的開發工作中遇到困難,或者學習遇到瓶頸,歡迎加入我們的Java總群:309603235,群內有Java的技術大牛,歡迎菜鳥,老鳥入坑。


一篇文章看懂分布式架構的演進過程,你也能輕松上手