分佈式系統的技術棧

構建分佈式系統的目的是增加系統容量,提高系統的可用性,轉換成技術方面,也就是完成下面兩件事。

大流量處理。通過集羣技術把大規模併發請求的負載分散到不同的機器上。
關鍵業務保護。提高後臺服務的可用性,把故障隔離起來阻止多米諾骨牌效應(雪崩效應)。如果流量過大,需要對業務降級,以保護關鍵業務流轉。

說白了就是幹兩件事。一是提高整體架構的吞吐量,服務更多的併發和流量,二是爲了提高系統的穩定性,讓系統的可用性更高。

提高架構的性能

咱們先來看看,提高系統性能的常用技術。


緩存系統。加入緩存系統,可以有效地提高系統的訪問能力。從前端的瀏覽器,到網絡,再到後端的服務,底層的數據庫、文件系統、硬盤和 CPU,全都有緩存,這是提高快速訪問能力最有效的手段。對於分佈式系統下的緩存系統,需要的是一個緩存集羣。這其中需要一個 Proxy 來做緩存的分片和路由。

負載均衡系統。負載均衡系統是水平擴展的關鍵技術,它可以使用多臺機器來共同分擔一部分流量請求。

異步調用。異步系統主要通過消息隊列來對請求做排隊處理,這樣可以把前端的請求的峯值給“削平”了,而後端通過自己能夠處理的速度來處理請求。這樣可以增加系統的吞吐量,但是實時性就差很多了。同時,還會引入消息丟失的問題,所以要對消息做持久化,這會造成“有狀態”的結點,從而增加了服務調度的難度。

數據分區和數據鏡像。數據分區是把數據按一定的方式分成多個區(比如通過地理位置),不同的數據區來分擔不同區的流量。這需要一個數據路由的中間件,會導致跨庫的 Join 和跨庫的事務非常複雜。而數據鏡像是把一個數據庫鏡像成多份一樣的數據,這樣就不需要數據路由的中間件了。你可以在任意結點上進行讀寫,內部會自行同步數據。然而,數據鏡像中最大的問題就是數據的一致性問題。對於一般公司來說,在初期,會使用讀寫分離的數據鏡像方式,而後期會採用分庫分表的方式。

提高架構的穩定性

接下來,咱們再來看看提高系統系統穩定性的一些常用技術。


服務拆分。服務拆分主要有兩個目的:一是爲了隔離故障,二是爲了重用服務模塊。但服務拆分完之後,會引入服務調用間的依賴問題。

服務冗餘。服務冗餘是爲了去除單點故障,並可以支持服務的彈性伸縮,以及故障遷移。然而,對於一些有狀態的服務來說,冗餘這些有狀態的服務帶來了更高的複雜性。其中一個是彈性伸縮時,需要考慮數據的複製或是重新分片,遷移的時候還要遷移數據到其它機器上。

限流降級。當系統實在扛不住壓力時,只能通過限流或者功能降級的方式來停掉一部分服務,或是拒絕一部分用戶,以確保整個架構不會掛掉。這些技術屬於保護措施。

高可用架構。通常來說高可用架構是從冗餘架構的角度來保障可用性。比如,多租戶隔離,災備多活,或是數據可以在其中複製保持一致性的集羣。總之,就是爲了不出單點故障。

高可用運維。高可用運維指的是 DevOps 中的 CI/CD(持續集成 / 持續部署)。一個良好的運維應該是一條很流暢的軟件發佈管線,其中做了足夠的自動化測試,還可以做相應的灰度發佈,以及對線上系統的自動化控制。這樣,可以做到“計劃內”或是“非計劃內”的宕機事件的時長最短。

分佈式系統的關鍵技術

而通過上面的分析,我們可以看到,引入分佈式系統,會引入一堆技術問題,需要從以下幾個方面來解決。

服務治理。服務拆分、服務調用、服務發現、服務依賴、服務的關鍵度定義……服務治理的最大意義是需要把服務間的依賴關係、服務調用鏈,以及關鍵的服務給梳理出來,並對這些服務進行性能和可用性方面的管理。

架構軟件管理。服務之間有依賴,而且有兼容性問題,所以,整體服務所形成的架構需要有架構版本管理、整體架構的生命週期管理,以及對服務的編排、聚合、事務處理等服務調度功能。

自動化運維。有了 DevOps 後,我們就可以對服務進行自動伸縮、故障遷移、配置管理、狀態管理等一系列的自動化運維技術了。

資源調度管理。應用層的自動化運維需要基礎層的調度支持,也就是雲計算 IaaS 層的計算、存儲、網絡等資源調度、隔離和管理。

整體架構監控。如果沒有一個好的監控系統,那麼自動化運維和資源調度管理只可能成爲一個泡影,因爲監控系統是你的眼睛。沒有眼睛,沒有數據,就無法進行高效的運維。所以說,監控是非常重要的部分。這裏的監控需要對三層系統(應用層、中間件層、基礎層)進行監控。

流量控制。最後是我們的流量控制,負載均衡、服務路由、熔斷、降級、限流等和流量相關的調度都會在這裏,包括灰度發佈之類的功能也在這裏。

此時,你會發現,要做好這麼多的技術,或是要具備這麼多的能力,簡直就是一個門檻,是一個成本巨高無比的技術棧,看着就都頭暈。要實現出來得投入多少人力、物力和時間啊。是的,這就是分佈式系統中最大的坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章