LVS調度演算法

来源:https://www.cnblogs.com/caicairui/archive/2018/03/25/8645334.html
-Advertisement-
Play Games

內核中的連接調度演算法 IPVS在內核中的負載均衡調度是以連接為粒度的。在HTTP協議(非持久中),每個對象從WEB伺服器上獲取都需要建立一個TCP連接,同一用戶的不同請求會被調度到不同伺服器上,所以這種細粒度的調度在一定程度上可以避免單個用戶訪問的突發性引起伺服器間的負載不平衡。 在內核中的連接調度 ...


內核中的連接調度演算法

IPVS在內核中的負載均衡調度是以連接為粒度的。在HTTP協議(非持久中),每個對象從WEB伺服器上獲取都需要建立一個TCP連接,同一用戶的不同請求會被調度到不同伺服器上,所以這種細粒度的調度在一定程度上可以避免單個用戶訪問的突發性引起伺服器間的負載不平衡。

在內核中的連接調度演算法上,IPVS已實現了以下八種調度演算法:

  • 輪叫調度(Round-Robin Scheduling)
  • 加權輪叫調度(Weighted Round-Robin Scheduling)
  • 最小連接調度(Least-Connection Scheduling)
  • 加權最小連接調度(Weighted Least-Connection Scheduling)
  • 基於局部性的最少鏈接(Locality-Based Least Connections Scheduling)
  • 帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication Scheduling)
  • 目標地址散列調度(Destination Hashing Scheduling)
  • 源地址散列調度(Source Hashing Scheduling)

1、輪叫調度

該演算法是以輪叫的方式依次將請求調度不同的伺服器,即每次調度執行i = (i + 1)mod n,並選出第i台伺服器。演算法的優點是簡單,它無需記錄當前所有連接的狀態。它是一種無狀態調度。

在系統實現時,我們引入一個額外條件,當伺服器的權值為零時,表示該伺服器不可用而不被調度。這樣做的目的是將伺服器切出任務(如屏蔽伺服器故障和維護),同時與其他加權演算法保持一致。所以,演算法要作相應的改動,演算法流程如下:

假設有一組伺服器S = {S0, S1, …, Sn-1},一個指示變數i表示上一次選擇的
伺服器,W(Si)表示伺服器Si的權值。變數i被初始化為n-1,其中n > 0。

j = i;
do {
	j = (j + 1) mod n;
	if (W(Sj) > 0) {
		i = j;
		return Si;
	}
} while (j != i);
return NULL;  

輪叫調度演算法假設所有伺服器性能均相同,不管伺服器當前連接數和響應速度,該演算法簡單,不適用於伺服器組中處理性能不一樣的情況,而且當請求服務時間比較大時,輪叫調度演算法容易導致伺服器間的負載不平衡。

2、加權輪叫調度

該演算法可以解決伺服器間性能不一的情況,它是相應的權值表示伺服器的處理性能,伺服器的預設值為1。假設伺服器A的權值為1,B的權值為2,則表示伺服器的處理性能是A的兩倍。加權輪叫演算法是按權值的高低和輪叫方式分配請求到各台伺服器。加權值高的先收到的連接,權值高的伺服器處理更多的連接,相同權值的伺服器處理相同的連接數。演算法流程如下:

假設有一組伺服器S = {S0, S1, …, Sn-1},W(Si)表示伺服器Si的權值,一個
指示變數i表示上一次選擇的伺服器,指示變數cw表示當前調度的權值,max(S)
表示集合S中所有伺服器的最大權值,gcd(S)表示集合S中所有伺服器權值的最大
公約數。變數i初始化為-1,cw初始化為零。

while (true) {
  i = (i + 1) mod n;
if (i == 0) {
     cw = cw - gcd(S); 
     if (cw <= 0) {
       cw = max(S);
       if (cw == 0)
         return NULL;
     }
  } 
  if (W(Si) >= cw) 
    return Si;
}

  例如,有三個伺服器A、B和C分別有權值4/3/2,則在一個調度周期內,順序為AABABCABC.次方法也比較簡單,高效。當請求的服務時間變化很大,單獨的加權輪叫調度演算法依然會導致伺服器之間負載不平衡

3、最小連接調度

該演算法是將新的連接請求分配到當前連接數最小的伺服器,最小調度是一種動態調度演算法,它通過伺服器當前所活躍的連接數來估計伺服器的負載情況。調度器需要記錄各個伺服器已連接的數目,當一個請求被調度到某台伺服器時,其連接數加1;當連接中止或超時,其連接數減一。

在系統實現時,我們也引入當伺服器權值為零時,表示該伺服器不可用或不可被調度,演算法流程如下:

假設有一組伺服器S = {S0, S1, ..., Sn-1},W(Si)表示伺服器Si的權值,
C(Si)表示伺服器Si的當前連接數。

for (m = 0; m < n; m++) {
	if (W(Sm) > 0) {
		for (i = m+1; i < n; i++) {
			if (W(Si) <= 0)
				continue;
			if (C(Si) < C(Sm))
				m = i;
		}
		return Sm;
	}
}
return NULL;

4、加權最小連接調度

該演算法是最小連接調度的超集,各個伺服器用相應的權值表示其處理能力。伺服器的預設值為1,系統管理員可以動態的設置伺服器的權值。加權最小連接調度在調度新連接時儘可能使伺服器的已建立連接數和其權值成比例。

假設有一組伺服器S = {S0, S1, ..., Sn-1},W(Si)表示伺服器Si的權值,
C(Si)表示伺服器Si的當前連接數。所有伺服器當前連接數的總和為
CSUM = ΣC(Si)  (i=0, 1, .. , n-1)。當前的新連接請求會被髮送伺服器Sm,
當且僅當伺服器Sm滿足以下條件
  (C(Sm) / CSUM)/ W(Sm) = min { (C(Si) / CSUM) / W(Si)}  (i=0, 1, . , n-1)
  其中W(Si)不為零
因為CSUM在這一輪查找中是個常數,所以判斷條件可以簡化為
  C(Sm) / W(Sm) = min { C(Si) / W(Si)}  (i=0, 1, . , n-1)
  其中W(Si)不為零

因為除法所需的CPU周期比乘法多,且在Linux內核中不允許浮點除法,伺服器的
權值都大於零,所以判斷條件C(Sm) / W(Sm) > C(Si) / W(Si) 可以進一步優化
為C(Sm)*W(Si) > C(Si)* W(Sm)。同時保證伺服器的權值為零時,伺服器不被調
度。所以,演算法只要執行以下流程。

for (m = 0; m < n; m++) {
	if (W(Sm) > 0) {
		for (i = m+1; i < n; i++) {
			if (C(Sm)*W(Si) > C(Si)*W(Sm))
				m = i;
		}
		return Sm;
	}
}
return NULL;

  參考:http://www.linuxvirtualserver.org/zh/lvs4.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 問題說明 最近.Net EF core 程式部署到伺服器,伺服器資料庫安裝的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分頁查詢時報錯如下: How to avoid the “Incorrect syntax near 'OFFSET'. In ...
  • 一、前言 前段時間用.Net Entity Framework core搭建框架,需要配置浮點數的精度,發現.Net Entity Framework core 並沒有HasPrecision方法。在網上查找資料也比較少,最後通過官方文檔說明,嘗試使用HasColumnType配置浮點數精度成功。 ...
  • 項目添加引用System.Configuration.dll,using System.Configuration; 應用程式配置文件是標準的 XML 文件,XML 標記和屬性是區分大小寫的。 configuration是根節點,我們經常訪問的是appSettings,它是由.Net預定義配置節所有 ...
  • 寫代碼、寫SQL語句的同志可能會經常性地誤按"shift+space"將半形輸入切換成全形輸入法,但實際生活中,絕大多數情況下根本就不需要全形輸入,所以直接將它給禁用掉,免得煩惱。 如果是win7,打開註冊表,把HKEY_CURRENT_USER\Control Panel\Input Method ...
  • 1 概述 所有的 Unix Like 系統都會內建 vi 文書編輯器,其他的文書編輯器則不一定會存在。但是目前我們使用比較多的是 vim 編輯器。 Vim 具有程式編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程式設計。Vim是從 vi 發展出來的一個文本編輯器。代碼補完、編譯及錯誤跳轉等方 ...
  • 一、Xwiki簡介XWiki是一個由Java編寫的基於LGPL協議發佈的開源wiki和應用平臺。XWiki是一款基於java所編寫的wiki,它可以運行在如Tomcat,Jetty,JBoss,WebLogic,WebSphere等Servlet容器上並利用關係型資料庫(HSQL, MySQL等)來 ...
  • 這是最近遇到的兩個問題。 chrome登錄秘鑰環解決方案 說下密鑰環的作用,在linux中用於安全保存私密數據的模塊,用於加密保存密碼、證書、秘鑰等安全數據。 之前安裝完谷歌瀏覽器之後,每次打開都會出現你的登錄密碼和登錄密鑰環不符的問題,需要點擊取消按鈕多次才可以進入到瀏覽器頁面,非常麻煩。 在查詢 ...
  • 對於一段包含cd 命令的shell腳本(test.sh): 運行: 腳本運行時無法在上級目錄建立test文件 此時用 即可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...