隨著越來越多的人參與到網際網路的浪潮來,曾經的單體應用架構越來越無法滿足需求,所以,分布式集群架構出現,也因此,分布式搭建開發成為了web開發者必掌握的技能之一。
包含但不限於zookeeper、dubbo、訊息佇列(activemq、kafka、rabbitmq)、nosql(redis、mongodb)、niginx、分庫分表mycat、netty等內容。
簡單的說,「分工協作,專人做專事」就是分布式的概念。
就好比你是你們公司唯一的碼農,那麼前後端都需要你自己來開發(單體架構),但隨著業務的增長,你確實忙不過來了,老闆給你招來了乙個前端,那麼你就只需要專注後端開發就行了(分布式)。
但是軟體的分布式搭建遠遠不像現實例子中這麼簡單,需要考慮和處理很多方面的問題,我們先了解以下幾個常見的概念:
上圖就是乙個簡單的分布式架構,但並不是所有的應用一開始就要設計為分布式架構。
因為一開始業務量並不大,沒有必要耗費大量的時間和成本去完成乙個分布式架構,甚至有可能到最後都用不上,因此在設計時我們應該遵循演進原則,由簡入深。
下面就來簡單分析一下分布式架構的演進過程。
以**為例,為了簡單說明,這裡就只列出使用者、訂單、配送服務。
如圖,大部分應用最開始都是將應用和資料庫放到一台物理機上提供服務,但隨著訪問量的提公升,伺服器負載越來越高。
我們首先會優化**、對機器做垂直擴容(記憶體、容量)等,但單台機器的效能是存在上限的,且對單機擴容的價效比會隨著效能的提公升越來越低,那我們就會想到增加伺服器。
在一開始,我們可能只會增加一台伺服器,並將應用和資料庫分離:
隨著訪問量的繼續增加,單台應用伺服器也無法滿足需求了,我們就需要搭建應用伺服器集群來對外提供服務了
但是,在搭建應用伺服器集群之後,問題就出現了,使用者在訪問時,應該到哪個伺服器上去?
如何平均伺服器壓力?以及使用者的session如何維護(a首先訪問了1號應用伺服器並登陸,但下次請求可能是去到2號伺服器,但這台伺服器上並沒有使用者的session資訊)?
我們可以在使用者層和應用層之間加上乙個負載均衡器來平衡伺服器的負載,session可以採取同步的方式,或者增加單獨的session共享伺服器。
應用層的問題暫時解決了,但是此時資料庫又頂不住了。那該如何做呢?
只是簡單的增加資料庫的伺服器來提供儲存和訪問能力麼?那肯定不行,這樣資料就不一致了。
所以我們需要將資料庫分為讀庫和寫庫。查詢請求都到讀庫去,而寫入請求都到寫庫去。
但這樣也存在幾個問題:
問題看似都解決了,但是每個資料庫都儲存的是同樣的資料,隨著業務繼續擴大, 我們就不得不考慮對資料庫做水平或垂直拆分:
應用拆分
業務繼續增長,資料庫達到瓶頸時可以繼續增加伺服器解決,但是應用層呢?也只是單純的增加伺服器麼?
基於二八原則,其實大部分訪問量是集中在20%的功能上的,如果我們只是單純的增加伺服器,那麼無疑會浪費掉許多的資源,所以我們會想到能不能針對這20%的應用做擴充套件呢?
當然是可以的,只不過我們需要先將應用拆分為多個子系統(一般是根據業務):
隨著應用拆分隨之而來的問題是,公用的**如何處理?各服務之間如何通訊?
公用**我們不可能放到每個服務中去,而是應該提出來對外提供服務,同時服務之間的呼叫可以通過rpc或者http方式來實現。
演化至此,這樣的架構就是乙個成熟的分布式架構了。
但是,架構還是會隨著業務和技術的提公升不停地演化;而此時你有沒有發現這樣的乙個架構和馮諾伊曼結構很像呢!
輸入輸出裝置對應使用者和服務之間的輸入輸出,資料庫伺服器就像是儲存裝置,而整個應用層就像是乙個cpu(控制器、運算器)。
所以,分布式架構可以簡單的理解為將多台計算機組成的一台超級計算機。
在設計分布式架構時,我們需要了解幾個基本的概念。
這些理論限於篇幅原因,這裡就不展開詳述,讀者可自行查閱。下面主要來談談分布式架構的高可用設計。
在分布式架構中,常常面臨的兩個矛盾的問題是一致性和高可用,這兩個是無法同時滿足的,那我們舍誰取誰呢?
從使用者的角度分析,我們寧可獲取到舊資料,也不願意等半天都打不開應用,所以常常是保證高可用,讓資料達到最終一致性,那麼如何設計高可用的分布式架構呢?主要從以下幾個方面:
高可用的分布式架構需要考慮非常多的方面,針對不同的場景有不同的解決方案,而對於不同的公司而言也不需要一應俱全,需要在實踐中多思考總結,根據自己的業務情況來設計。
本文從理論層面講述了分布式的基本概念、演化過程,以及設計,從巨集觀角度搞清楚分布式的起源以及分布式帶來的一系列問題,也就能明白各項技術出現的原因以及應用的場景。
用大白話聊聊分布式系統
一提起 分布式系統 大家的第一感覺就是好高大上啊,深不可測,看各類大牛關於分布式系統的演講或者書籍,也大多是一臉懵逼。本文期望用淺顯易懂的大白話來就什麼是分布式系統 分布式系統有哪些優勢 分布式系統會面臨 挑戰 如何來設計分布式等方面的話題來展開討論。關於這個定義,我們直觀的感受就是 從程序角度看,...
資料庫 事務(個人大白話詳講)
場景 支付寶裡,a使用者向b使用者轉賬一筆錢,那麼a使用者的轉出操作和b使用者的接受操作就需要封裝為乙個事務了 一 什麼是事務?1,定義 資料庫事務是訪問 讀 並可能更新 寫 資料庫中各種資料項的乙個執行單元。2,組成 乙個資料庫事務通常包含對資料庫進行讀或寫的乙個操作序列。3,目的 總結 事務的目...
白話分布式系統
一提起 分布式系統 大家的第一感覺就是好高大上啊,深不可測,看各類大牛關於分布式系統的演講或者書籍,也大多是一臉懵逼。本文期望用淺顯易懂的大白話來就什麼是分布式系統 分布式系統有哪些優勢 分布式系統會面臨 挑戰 如何來設計分布式等方面的話題來展開討論。關於這個定義,我們直觀的感受就是 從程序角度看,...