做爲一名架構師,咱們要專業,要能看懂代碼,及時光着臂膀去機房,也能獨擋一面!及時同事搞不定問題,或者撂挑子,你也能給老大一個堅決的眼神:不怕,有我在!還能在會議室上口若懸河,如若無人,讓不懂技術的妹子看你時眼神迷離,就好想落霞與孤鶩齊飛!java
分佈式架構是一個很是複雜的體系,任何技術都不是孤立的存在,任何技術都沒法適應全部場景。做爲一名分佈式系統架構或者資深研發人員,咱們必須儘量多的學習與之相關的各類知識,掌握各類技術的演進路線,正式從一名碼農蛻變成爲架構師mysql
什麼是分佈式?web
互聯網應用的特色是:高併發,海量數據。互聯網應用的用戶數是沒有上限的(取決於其開放特性),這也是和傳統應用的本質區別。高併發指系統單位時間內收到的請求數量(取決於使用的用戶數),沒有上限。海量數據包括:海量數據的存儲和海量數據的處理。這兩個工程難題均可以使用分佈式系統來解決。redis
簡單理解,分佈式系統就是把一些計算機經過網絡鏈接起來,而後協同工做。協同工做須要解決兩個問題:sql
1)任務分解數據庫
把一個問題拆解成若干個獨立任務,每一個任務在一臺節點上運行,實現多任務的併發執行。緩存
2)節點通訊安全
節點之間互相通訊,須要設計特定的通訊協議來實現。協議能夠採用RPC或Message Queue等方式。服務器
分佈式和集羣的關係 分佈式:一個業務分拆多個子業務,部署在不一樣的服務器上網絡
集羣:同一個業務,部署在多個服務器上
計算機發展歷史
1946年情人節(2.14) , 世界上第一臺電子數字計算機誕生在美國賓夕法尼亞大學大學,它的名字是:ENIAC; 這臺計算機佔地170平米、重達30噸,每秒可進行5000次加法運算。 第一臺電子計算機誕生之後,意味着一個突飛猛進的IT時代的到來。一方面單臺計算機的性能每一年都在提高:從最先的8位CPU到如今的64位CPU;從早期的MB級內存到如今的GB級別內存;從慢速的機械存儲到如今的固態SSD硬盤存儲。
tips: 電子計算機的問世,最重要的奠定人是英國科學家艾蘭· 圖靈(Alan Turing)和美籍匈牙利科學家馮· 諾依曼(John Von· Neumann)。圖靈的貢獻是創建了圖靈機的理論模型,奠基了人工智能的基礎。而馮· 諾依曼則是首先提出了計算機體系結構的設想。
經典理論-馮.諾依曼體系:計算機硬件由運算器、控制器、存儲器、輸入設備、輸出設備五大部分組成。直到今天,計算機仍沒有跳出該體系的範疇。
ENIAC以後,電子計算機便進入了IBM主導的大型機時代,IBM大型機之父吉恩.阿姆達爾被認爲是有史以來最偉大的計算機設計師之一。1964年4月7日,在阿姆達爾的帶領下,歷時三年,耗費50億美圓,第一臺IBM大型機SYSTEM/360誕生。這使得IBM在20實際50~60年代統治整個大型計算機工業,奠基了IBM計算機帝國的江山。 2.1 IBM大型機曾支撐美國航天登月計劃
2.2 IBM主機一直服務於金融等核心行業的關鍵領域
因爲高可靠性和超強的計算能力,幾遍在X86和雲計算飛速發展的狀況下,IBM的大型機依然緊緊佔據着必定的高端市場份額
20世紀80年代,在大型機霸主的時代,計算機架構同時向兩個方向發展 以X86 CPU爲架構的價格便宜的面向我的的PC
以RISC CPU爲架構的價格昂貴的面向企業的小型UNIX服務器
分佈式架構發展的里程碑 大型主機的出現。憑藉着大型機超強的計算和I/O處理能力、穩定性、安全性等,在很長一段時間內,大型機引領了計算機行業及商業計算領域的發展。
而集中式的計算機系統架構也成爲了主流。
隨着計算機的發展,這種架構愈來愈難以適應人們的需求,好比說
因爲大型主機的複雜性,致使培養一個可以熟練運維大型主機的人的成本很高 大型主機很貴,通常只有土豪(政府、金融、電信)才能用得起 單點問題,一臺大型主機出現故障,那麼整個系統將處於不可用狀態。而對於大型機的使用羣體來講,這種不可用致使的損失是很是大的 科技在進步,技術在進步。PC機性能不斷提高,不少企業放棄大型機改用小型機及普通PC來搭建系統架構 阿里巴巴在2009年發起了一項"去IOE"運動
當初指的是IBM小型機、Oracle數據庫、EMC的高端存儲
2009年「去IOE」戰略透露,到2013年5月17日最後一臺IBM小型機在支付寶下線。
爲何要去IOE?
阿里巴巴過去一直採用的是Oracle數據庫,並利用小型機和高端存儲設備提供高性能的數據處理和存儲服務。隨着業務的不斷髮展,數據量和業務量呈爆發性增加,傳統的集中式Oracle數據庫架構在擴展性方面遭遇瓶頸。
傳統的商業數據庫軟件(Oracle,DB2),多以集中式架構爲主,這些傳統數據庫軟件的最大特色就是將全部的數據都集中在一個數據庫中,依靠大型高端設備來提供高處理能力和擴展性。集中式數據庫的擴展性主要採用向上擴展(Scale up)的方式,經過增長CPU,內存,磁盤等方式提升處理能力。這種集中式數據庫的架構,使得數據庫成爲了整個系統的瓶頸,已經愈來愈不適應海量數據對計算能力的巨大需求
架構的發展演變過程
一個成熟的大型網站系統架構並非一開始就設計的很是完美,也不是一開始就具有高性能、高可用、安全性等特性,而是隨着用戶量的增長、業務功能的擴展逐步完善演變過來的。在這個過程當中,開發模式、技術架構等都會發生很是大的變化。而針對不一樣業務特徵的系統,會有各自的側重點,好比像淘寶這類的網站,要解決的是海量商品搜索、下單、支付等問題;像騰訊,要解決的是數億級別用戶的實時消息傳輸;百度所要解決的是海量數據的搜索。每個種類的業務都有本身不一樣的系統架構。咱們簡單模擬一個架構演變過程。
什麼是大型網站
如何定義一個網站是否是大型網站,通常咱們會從兩個緯度去考衡,訪問量以及數據量,兩者缺一不可。
咱們以javaweb爲例,來搭建一個簡單的電商系統,從這個系統中來看系統的演變歷史;要注意的是,接下來的演示模型,關注的是數據量、訪問量提高,網站結構發生的變化, 而不是具體關注業務功能點。其次,這個過程是爲了讓你們更好的瞭解網站演進過程當中的一些問題和應對策略。
假如咱們系統具有如下功能:
用戶模塊:用戶註冊和管理
商品模塊:商品展現和管理
交易模塊:建立交易及支付結算
階段一 , 單應用架構
網站的初期也能夠認爲是互聯網發展的早起,咱們常常會在單機上跑咱們全部的程序和軟件。
把全部軟件和應用都部署在一臺機器上,這樣就完成一個簡單系統的搭建,這個時候的講究的是效率
階段二,應用服務器和數據庫服務器分離
隨着網站的上線,訪問量逐步上升,服務器的負載慢慢提升,在服務器尚未超載的時候,咱們應該作好規劃,提高網站的負載能力。假如代碼層面的優化已經沒辦法繼續提升,在不提升單臺機器的性能,增長機器是一個比較好的方式,投入產出比很是高。這個階段增長機器的主要目的是講web服務器和數據庫服務器拆分,這樣不只提升了單機的負載能力,也提升了容災能力
階段三,應用服務器集羣-應用服務器負載告警,如何讓應用服務器走向集羣
隨着訪問量的繼續增長,單臺應用服務器已經沒法知足需求。在假設數據庫服務器尚未遇到性能問題的時候,咱們能夠增長應用服務器,經過應用服務器集羣將用戶請求分流到各個服務器中,從而繼續提高負載能力。此時多臺應用服務器之間沒有直接的交互,他們都是依賴數據庫各自對外提供服務
架構發展到這個階段,各類問題也會慢慢呈現
用戶請求由誰來轉發到具體的應用服務器 用戶若是每次訪問到的服務器不同,那麼如何維護session
階段四,數據庫壓力變大,數據庫讀寫分離
架構演變到這裏,並非終點。上面咱們把應用層的性能拉上來了,可是數據庫的負載也在慢慢增大,那麼怎麼去提升數據庫層面的負載呢?有了前面的思路之後,天然會想到增長服務器。可是假如咱們單純的把數據庫一分爲二,而後對於後續數據庫的請求,分別負載到兩臺數據庫服務器上,那麼必定會形成數據庫不統一的問題。因此咱們通常先考慮讀寫分離的方式
這個架構的變化會帶來幾個問題
主從數據庫之間的數據同步 ; 可使用mysql自帶的master-slave方式實現主從複製 對應數據源的選擇 ; 採用第三方數據庫中間件,例如mycat 階段五,使用搜索引擎緩解讀庫的壓力
數據庫作讀庫的話,嚐嚐對模糊查找效率不是特別好,像電商類的網站,搜索是很是核心的功能,即使是作了讀寫分離,這個問題也不能有效解決。那麼這個時候就須要引入搜索引擎了
使用搜索引擎可以大大提升咱們的查詢速度,可是同時也會帶來一些附加的問題,好比維護索引的構建。
階段六,引入緩存機制緩解數據庫的壓力
隨着訪問量的持續增長,逐漸出現許多用戶訪問統一部份內容的狀況,對於這些熱點數據,不必每次都從數據庫去讀取,咱們可使用緩存技術,好比memcache、redis來做爲咱們應用層的緩存;另外在某些場景下,好比咱們對用戶的某些IP的訪問頻率作限制,那這個放內存中又不合適,放數據庫又太麻煩,這個時候可使用Nosql的方式好比mongDB來代替傳統的關係型數據庫
階段七,數據庫的水平/垂直拆分
咱們的網站演進的變化過程,交易、商品、用戶的數據都還在同一個數據庫中,儘管採起了增長緩存,讀寫分離的方式,可是隨着數據庫的壓力持續增長,數據庫的瓶頸仍然是個最大的問題。所以咱們能夠考慮對數據的垂直拆分和水平拆分
垂直拆分:把數據庫中不一樣業務數據拆分到不一樣的數據庫
水平拆分:把同一個表中的數據拆分到兩個甚至跟多的數據庫中,水平拆分的緣由是某些業務數據量已經達到了單個數據庫的瓶頸,這時能夠採起講表拆分到多個數據庫中
階段八,應用的拆分
隨着業務的發展,業務愈來愈多,應用的壓力愈來愈大。工程規模也愈來愈龐大。這個時候就能夠考慮講應用拆分,按照領域模型講咱們的用戶、商品、交易拆分紅多個子系統
這樣拆分之後,可能會有一些相同的代碼,好比用戶操做,在商品和交易都須要查詢,因此會致使每一個系統都會有用戶查詢訪問相關操做。這些相同的操做必定是要抽象出來,不然就會是一個坑。因此經過走服務化路線的方式來解決
那麼服務拆分之後,各個服務之間如何進行遠程通訊呢?
經過RPC技術,比較典型的有:webservice、hessian、http、RMI等等
前期經過這些技術可以很好的解決各個服務之間通訊問題,but,互聯網的發展是持續的,因此架構的演變和優化還在持續。
咱們經過這個例子來說解了電商網站的架構演進。我要強調一下,這個架構的演進不是某個網站真實的例子,其實是經過這樣一個演進過程給你們帶來一個全局的觀念和感覺。以及給你們在後續課程學習過程當中的一些思路。
如何把單擊擴展到分佈式 前面咱們講到了馮.諾依曼模型,計算機一共由5個部分組成,從用戶角度來看,分佈式系統就像一臺超級計算機。理論上也應該由輸入、輸出、運算、存儲和控制這5部分組成。
輸入設備的變化
在分佈式系統架構中,輸入設備能夠分兩類,第一類是互相鏈接的多個節點,在接收其餘節點傳來的信息做爲該節點的輸入;另外一種就是傳統意義上的人機交互的輸入設備了
輸出設備的變化
輸出和輸入相似,也有兩種,一種是系統中的節點向其餘節點傳輸信息時,該節點能夠看做是輸出設備;另外一種就是傳統意義上的人際交互的輸出設備,好比用戶的終端
控制器的變化
在單機中,控制器指的是CPU中的控制器,在分佈式系統中,控制器主要的做用是協調或控制節點之間的動做和行爲;好比硬件負載均衡器;LVS軟負載;規則服務器等
運算器
在分佈式系統中,運算器是由多個節點來組成的。運用多個節點的計算能力來協同完成總體的計算任務
存儲器
在分佈式系統中,咱們須要把承擔存儲功能的多個節點組織在一塊兒,組成一個總體的存儲器;好比數據庫、redis(key-value存儲)