1.3 分佈式系統概述

任務目的

  • 理解集羣、分佈式和負載均衡的概念
  • 理解集羣、分佈式的區別

任務清單

  • 任務1:分佈式集羣
  • 任務2:負載均衡

詳細任務步驟

任務1:分佈式集羣

  從開餐館說起:你開了一家餐館,自己掌勺後廚(即做菜)。隨着生意越來越好,發現自己忙不過來。於是你聘請了兩個廚師,你們三位廚師就是一個“集羣”。主要的職責是:洗菜、配菜、炒菜。你們關係如下:

Vditor

 

  隨着生意越來越好,兩種方式增加後廚的生產力:
  (1)繼續增加廚師——相當於擴大集羣;
  (2)引入流水線的機制,精細化分工。找人分擔廚師洗菜、配菜等工作。類似下圖。

Vditor

 

  其實,流水線體現了分而治之的思想。即將一個大任務分解爲多個小任務,提高小任務的生產力,從而提高了整體的生產力。而“分佈式”解決問題的思路:正是吸取了將大任務分佈爲多個小任務的思想,纔得到通過跨地域的分佈解決大問題。

  那麼,集羣和分佈式的區別是什麼?

  (1)從解決問題的角度看:分佈式是以縮短單個任務的執行時間來提升效率的;集羣則是通過提高單位時間內執行的任務數來提升效率
  (2)從軟件部署的角度看:分佈式是指將不同的業務分佈在不同的地方;集羣則是將幾臺服務器集中在一起,實現同一業務

  如下圖,每個人都有不同的分工,一起協作幹一件事情,叫做“分佈式”。

Vditor

 

  再看下圖,每個划槳人乾的都是一樣的活,叫做集羣。

Vditor

 

  分佈式中的每一個節點,都可以做集羣,集羣並不一定就是分佈式的。其實這個賽龍舟的圖,整體來看屬於分佈式,包括打鼓和划槳兩個分佈式節點,而划槳的節點又是集羣的狀態。

  現實生活中例子還有很多,例如,這樣的古代樂隊的圖就屬於集羣。

Vditor

 

  而現代樂隊這樣的圖就屬於分佈式。

Vditor

 

  綜上所述,一個較爲理想的分佈式集羣應該是這樣的:一個分佈式系統,是通過多個節點組成的,各節點都是集羣化,並且各集羣還是分佈式的。

任務2:負載均衡

  集羣服務器之間如何分工,需要藉助的是負載均衡

  負載均衡是指將請求分攤到多個操作單元也就是分開部署的服務器上,Nginx是常用的反向代理服務器,可以用來做負載均衡。集羣與負載均衡之間有緊密聯繫,可以結合理解。

  負載均衡的本質和分佈式系統一樣,是分治。由一個獨立的統一入口來收斂流量,再做二次分發的過程就是負載均衡。

  怎麼均衡的背後是策略在起作用,而策略的背後是由某些算法或者說邏輯來組成的。

  下面來羅列一下日常工作中最常見負載均衡策略:

(1)輪詢

Vditor

 

  這是最常用也是最簡單的策略,平均分配,人人都有、一人一次。

(2)加權輪詢

Vditor

 

  在輪詢的基礎上,增加了一個權重的概念。權重是一個泛化後的概念,可以用任意方式來體現,本質上是能者多勞的思想。比如,可以根據宿主的性能差異配置不同的權重。

(3)最快響應

Vditor

 

  這也是一種動態負載均衡策略,它的本質是根據每個節點對過去一段時間內的響應情況來分配,響應越快分配的越多。具體的運作方式也有很多,上圖的這種可以理解爲:將最近一段時間的請求耗時的平均值記錄下來,結合前面的加權輪詢來處理,所以等價於2:1:3的加權輪詢。

(4)Hash法

Vditor

 

  Hash法的負載均衡與之前的幾種不同在於,它的結果是由客戶端決定的。通過客戶端帶來的某個標識經過一個標準化的散列函數進行打散分攤。

  上圖中的散列函數運用的是最簡單粗暴的取餘法。

  那麼,負載均衡和分佈式的區別又是什麼?

  負載均衡:請求是不可拆分的,是獨立的一個請求,被服務器當中的任何一臺接收並處理即可。

  分佈式:任何一個任務(請求)需要節點相互協作共同完成,是可以拆分的。

總結:

(1)集羣 
- 多個人緊密協作,來完成一個工作,就像一個人似的。
- 比如:餐館裏的所有廚師就可以看做一個集羣
- 集羣的好處:
* 做菜的能力比一個人時增加了
* 多招一個廚師,就能輕易增加做菜的數量(橫向伸縮)

(2)分佈式
- 一個任務由多個人協作完成。
- 比如:餐館裏有負責洗菜、配菜的配菜師,有專門負責做菜的廚師。

Vditor

 

(3)負載均衡
- 將一系列任務逐項分發給多個人,完成任務的能力增加,而且讓大家都不閒着(提高資源利用率),減少任務等待的時間(降低延遲)
- 比如:餐館裏做菜的廚師有多個,新的菜來了讓誰做呢?
* 可以像發牌似的,一人一個輪流來(輪詢)
* 有人做的快,有人做的慢,可以按照一定的比例輪流(加權輪詢)

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