Nginx 重要算法介紹

1、一致性Hash算法

這裏寫圖片描述

一致性Hash算法是現代系統架構中的最關鍵算法之一,在分佈式計算系統、分佈式存儲系統、數據分析等衆多領域中廣泛應用。

  • hash算法的關鍵在於它能夠根據不同的屬性數據,生成一串不相同的hash值,並且能夠將這個hash值轉換爲
    02321
    範圍整數(即上圖中的圓環)
  • 一臺服務器的某個或者某一些屬性當然也可以進行hash計算(通常是這個服務器的IP地址和開放端口),並且根據計算分佈在這個圓環上的某一個點。也就是圖中圓環上的藍色點。
  • 一個處理請求當然也可以根據這個請求的某一個或者某一些屬性進行hash計算(可以是這個請求的IP、端口、cookie值、URL值或者請求時間等等),並且根據計算記過分佈在這個圓環上的某一個點上。也就是上圖圓環上的黃色點。
  • 我們約定落在某一個藍點A左側和藍點B右側的黃色點所代表的請求,都有藍點A所代表的服務器進行處理,這樣就完成解決了「誰來處理」的問題。在藍色點穩定存在的前提下,來自於同一個Hash約定的請求所落在的位置都是一樣的,這就保證了服務處理映射的穩定性。
  • 當某一個藍色點由於某種原因下線,其所影響到的黃色點也是有限的。即下一次客戶端的請求將由其他的藍色點所代表的服務器進行處理。

2、輪詢與加權輪詢

這裏寫圖片描述

  • 當有任務需要傳遞到下層節點進行處理時,任務來源點會按照一個固定的順序,將任務依次分配到下層節點,如果下層可用的節點數量爲X,那麼第N個任務的分配規則爲:
    =(NmodX)+1
  • 輪詢處理在很多架構思想中都有體現:DNS解析多IP時、LVS向下轉發消息時、Nginx向下轉發消息時、Zookeeper向計算節點分配任務時。瞭解基本的輪詢過程有助於我們在進行軟件架構設計時進行思想借鑑。
  • 但是上面的輪詢方式是有缺陷的,由於各種客觀原因我們可能無法保證任務處理節點的處理能力都是一樣的(CPU、IO、內存頻率等不同)。所以A節點業務能同時處理100個任務,但是B節點可能同時只能處理50個任務。
  • 在這種情況下我們需要依據下層節點某個或者多個屬性設置權值。這個屬性可能是網絡帶寬、CPU繁忙程度或者就是各一個固定的權值。

那麼加權輪詢的分配依據是什麼呢?有很多分配依據,例如:概率算法(此算法中包括蒙特卡羅算法,拉斯維加斯算法和舍伍德算法,在網絡上有很多介紹資料)、最大公約數法。這裏我們對最大公約數算法進行介紹,因爲該方法簡單實用:

這裏寫圖片描述

  • 首先按照某種規則計算得到每個處理節點的權值,上文已經說到計算規則可能是這個服務節點的CPU利用率、網絡佔用情況或者在配置文件中的固定權重。
  • 求這些權值的最大公約數,在上圖中三個節點的權值分別是100、80、60.那麼求得的最大公約數就是20(如果您忘記了最大公約數的定義,請自行復習)。那麼這三個節點的被除結果分別是5、4、3,求和值爲12。
  • 得到以上的計算結果,就可以開始進行請求分配了,公式同樣爲:
    (NmodX)+1=Y

其中N表示當前的第N次任務;X表示整除後的求和結果;Y爲處理節點。

總結一下:加權輪詢是輪詢方案的補充,通過將處理節點的屬性轉換成權值可以有效的描述處理節點的處理能力,實現更科學的處理任務分配。加權輪詢的關鍵在於加權算法,最大公約數算法簡單實用,定位效率高。