架構設計(2)---分散式架構的演進過程
一.分散式架構的發展歷史
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都是以集中式的為主,存在的缺點就是擴充套件性的不足,集中式的擴充套件主要是採用的是向上的擴充套件不是水平的擴充套件,這樣時間長了,早晚都會遇到系統瓶頸。
一.分散式架構的常見概念
叢集
小飯店原來是一個廚師,切菜洗菜備料炒菜全乾。後來客人多了,廚房一個廚師忙不過來,又請了個廚師,兩個廚師都能炒一樣的菜,這兩個廚師的關係就是叢集。
分散式
為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切菜,備菜,備料,廚師和配菜師的關係就是分散式的,一個配菜師也忙不過來,有請了個配菜師,這兩個配菜師的關係就是叢集了。所以說有分散式的架構中可能有叢集,但叢集不等於有分散式。
節點
節點是指一個可以獨立按照分散式協議完成一組邏輯的程式個體。在具體的專案中,一個節點表示的是一個作業系統上的程序。
副本機制
副本指的是在分散式系統中為資料或服務提供冗餘。
資料副本指在不同的節點上持久化同一份資料,當出現某一個節點的資料丟失時,可以從副本讀取資料。資料副本是分散式系統中結果資料丟失的唯一手段。
服務副本表示的是多個節點提供相同的服務,通過主從關係來實現服務的高可用方案。
中介軟體
中介軟體位與作業系統提供的服務之外,又不屬於應用,它是位與應用和系統層之間為開發者方便的處理通訊,輸入和輸出的一類軟體,能夠讓使用者關心自己應用的一部分。
架構的發展過程
一個成熟的大型網站系統架構並不是一開始就設計的非常完美的,也不是一開始就具備高效能,高可用,安全性等特性,而是隨著使用者量的增加,業務功能的擴充套件慢慢完善演變過來的。在這個發展過程中,開發模式,技術架構等都會發生非常大的變化。
假如系統具備一下功能:
使用者模組:使用者註冊和管理
商品模組:商品展示和管理
交易模組:建立交易及支付結算
階段一:單應用架構
系統的初級都是應用和資料庫都放在一臺伺服器上。
階段二:應用伺服器和資料庫伺服器分離
隨著網站的使用者量增大,流量增大,對應用伺服器和資料庫伺服器單獨的部署機器,這樣可以增加系統的效能,提高訪問的效率,提高單機的負載能力和容災的能力。
如果想學習Java效能優化,工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加下454377428(1群)609164807(2群)群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。
階段三:應用伺服器叢集-應用伺服器負載告警
隨著訪問量和流量的增加,假設資料庫沒有遇到瓶頸,對應用伺服器叢集來對請求進行分流,提高程式的效能。存在的問題:使用者的請求由誰來轉發,session如何來管理的問題。
階段四:資料庫壓力變大-資料庫讀寫分離
讀寫分離的話,這樣以後的請求,查詢的請求就可以去從庫裡面讀資料,寫的資料可以到主庫中了,但是會帶來幾個問題:
1.主從的資料庫之間的資料同步:可以使用mysql自帶的master-slave方式實現主從複製
2.對應的資料來源的選擇:採用第三方資料庫中介軟體,例如:mycat
階段五:使用搜索引擎緩解讀庫的壓力
資料庫做讀庫的話,常常對模糊查詢的效能不是很好,特別是對於大型的網際網路公司來說,想搜尋的模組就比較核心了,這是可以使用搜索引擎了,雖然可以大幅度的提高查詢的速度,但是同時也會帶來一些問題比如索引的構建。
階段六:引入快取機制緩解資料庫的壓力
對一些熱點的資料,可以使用redis,memcache來作為應用層的快取;另外在某些場景下,可以使用mongodb來替代關係型資料庫來儲存。
如果想學習Java效能優化,工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加下454377428(1群)609164807(2群)群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。
階段七:資料庫的水平/垂直拆分
垂直拆分:把資料庫中不同的業務資料拆分到不同的資料庫中。
水平拆分:把同一個表中的資料拆分到兩個甚至更多的資料庫中,水平拆分的原因是某些業務量資料量大的已經達到了單個數據庫的瓶頸,這時候可以採取將表拆分到多個數據庫中。
階段八:應用的拆分
隨著業務的發展,業務越來越多,應用的壓力越來越大。工程規模也越來越龐大。這個時候就可以考慮將應用拆分,按照領域模型將我們的使用者,商品,交易分拆成子系統。
這樣拆分以後,可能會有一些相同的程式碼,比如使用者操作,商品的交易查詢,所有會導致每個系統都會有使用者查詢和訪問相關的操作。這些相同的程式碼和模組一定要抽象出來。這樣有利於維護和管理。
服務拆分以後,服務之間的通訊可以通過RPC技術,比較典型的有:webservice、hession、http、RMI等。