[轉]LVS負載均衡(LVS簡介、三種工作模式、十種調度算法)

一、LVS簡介

? ? ? ?LVS(Linux Virtual Server)即Linux虛擬服務器,是由章文嵩博士主導的開源負載均衡項目,目前LVS已經被集成到Linux內核模塊中。該項目在Linux內核中實現了基于IP的數據請求負載均衡調度方案,其體系結構如圖1所示,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的Web請求會發送給LVS調度器,調度器根據自己預設的算法決定將該請求發送給后端的某臺Web服務器,比如,輪詢算法可以將外部的請求平均分發給后端的所有服務器,終端用戶訪問LVS調度器雖然會被轉發到后端真實的服務器,但如果真實服務器連接的是相同的存儲,提供的服務也是相同的服務,最終用戶不管是訪問哪臺真實服務器,得到的服務內容都是一樣的,整個集群對用戶而言都是透明的。最后根據LVS工作模式的不同,真實服務器會選擇不同的方式將用戶需要的數據發送到終端用戶,LVS工作模式分為NAT模式、TUN模式、以及DR模式。

二、三種工作模式的解析。

1、基于NAT的LVS模式負載均衡

? ? ? NAT(Network Address Translation)即網絡地址轉換,其作用是通過數據報頭的修改,使得位于企業內部的私有IP地址可以訪問外網,以及外部用用戶可以訪問位于公司內部的私有IP主機。VS/NAT工作模式拓撲結構如圖2所示,LVS負載調度器可以使用兩塊網卡配置不同的IP地址,eth0設置為私鑰IP與內部網絡通過交換設備相互連接,eth1設備為外網IP與外部網絡聯通。

????? ?第一步,用戶通過互聯網DNS服務器解析到公司負載均衡設備上面的外網地址,相對于真實服務器而言,LVS外網IP又稱VIP(Virtual IP Address),用戶通過訪問VIP,即可連接后端的真實服務器(Real Server),而這一切對用戶而言都是透明的,用戶以為自己訪問的就是真實服務器,但他并不知道自己訪問的VIP僅僅是一個調度器,也不清楚后端的真實服務器到底在哪里、有多少真實服務器。

? ?第二步,用戶將請求發送至124.126.147.168,此時LVS將根據預設的算法選擇后端的一臺真實服務器(192.168.0.1~192.168.0.3),將數據請求包轉發給真實服務器,并且在轉發之前LVS會修改數據包中的目標地址以及目標端口,目標地址與目標端口將被修改為選出的真實服務器IP地址以及相應的端口。

? ? 第三步,真實的服務器將響應數據包返回給LVS調度器,調度器在得到響應的數據包后會將源地址和源端口修改為VIP及調度器相應的端口,修改完成后,由調度器將響應數據包發送回終端用戶,另外,由于LVS調度器有一個連接Hash表,該表中會記錄連接請求及轉發信息,當同一個連接的下一個數據包發送給調度器時,從該Hash表中可以直接找到之前的連接記錄,并根據記錄信息選出相同的真實服務器及端口信息。

2、基于TUN的LVS負載均衡

? ? ? ?在LVS(NAT)模式的集群環境中,由于所有的數據請求及響應的數據包都需要經過LVS調度器轉發,如果后端服務器的數量大于10臺,則調度器就會成為整個集群環境的瓶頸。我們知道,數據請求包往往遠小于響應數據包的大小。因為響應數據包中包含有客戶需要的具體數據,所以LVS(TUN)的思路就是將請求與響應數據分離,讓調度器僅處理數據請求,而讓真實服務器響應數據包直接返回給客戶端。VS/TUN工作模式拓撲結構如圖3所示。其中,IP隧道(IP tunning)是一種數據包封裝技術,它可以將原始數據包封裝并添加新的包頭(內容包括新的源地址及端口、目標地址及端口),從而實現將一個目標為調度器的VIP地址的數據包封裝,通過隧道轉發給后端的真實服務器(Real Server),通過將客戶端發往調度器的原始數據包封裝,并在其基礎上添加新的數據包頭(修改目標地址為調度器選擇出來的真實服務器的IP地址及對應端口),LVS(TUN)模式要求真實服務器可以直接與外部網絡連接,真實服務器在收到請求數據包后直接給客戶端主機響應數據。

3、基于DR的LVS負載均衡

在LVS(TUN)模式下,由于需要在LVS調度器與真實服務器之間創建隧道連接,這同樣會增加服務器的負擔。與LVS(TUN)類似,DR模式也叫直接路由模式,其體系結構如圖4所示,該模式中LVS依然僅承擔數據的入站請求以及根據算法選出合理的真實服務器,最終由后端真實服務器負責將響應數據包發送返回給客戶端。與隧道模式不同的是,直接路由模式(DR模式)要求調度器與后端服務器必須在同一個局域網內,VIP地址需要在調度器與后端所有的服務器間共享,因為最終的真實服務器給客戶端回應數據包時需要設置源IP為VIP地址,目標IP為客戶端IP,這樣客戶端訪問的是調度器的VIP地址,回應的源地址也依然是該VIP地址(真實服務器上的VIP),客戶端是感覺不到后端服務器存在的。由于多臺計算機都設置了同樣一個VIP地址,所以在直接路由模式中要求調度器的VIP地址是對外可見的,客戶端需要將請求數據包發送到調度器主機,而所有的真實服務器的VIP地址必須配置在Non-ARP的網絡設備上,也就是該網絡設備并不會向外廣播自己的MAC及對應的IP地址,真實服務器的VIP對外界是不可見的,但真實服務器卻可以接受目標地址VIP的網絡請求,并在回應數據包時將源地址設置為該VIP地址。調度器根據算法在選出真實服務器后,在不修改數據報文的情況下,將數據幀的MAC地址修改為選出的真實服務器的MAC地址,通過交換機將該數據幀發給真實服務器。整個過程中,真實服務器的VIP不需要對外界可見。

三、LVS負載均衡調度算法

? ? ? 根據前面的介紹,我們了解了LVS的三種工作模式,但不管實際環境中采用的是哪種模式,調度算法進行調度的策略與算法都是LVS的核心技術,LVS在內核中主要實現了一下十種調度算法。

1.輪詢調度

輪詢調度(Round Robin 簡稱'RR')算法就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是實現簡單。輪詢算法假設所有的服務器處理請求的能力都一樣的,調度器會將所有的請求平均分配給每個真實服務器。

2.加權輪詢調度

加權輪詢(Weight Round Robin 簡稱'WRR')算法主要是對輪詢算法的一種優化與補充,LVS會考慮每臺服務器的性能,并給每臺服務器添加一個權值,如果服務器A的權值為1,服務器B的權值為2,則調度器調度到服務器B的請求會是服務器A的兩倍。權值越高的服務器,處理的請求越多。

3.最小連接調度

最小連接調度(Least Connections 簡稱'LC')算法是把新的連接請求分配到當前連接數最小的服務器。最小連接調度是一種動態的調度算法,它通過服務器當前活躍的連接數來估計服務器的情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中斷或者超時,其連接數減1。

(集群系統的真實服務器具有相近的系統性能,采用最小連接調度算法可以比較好地均衡負載。)

4.加權最小連接調度

加權最少連接(Weight Least Connections 簡稱'WLC')算法是最小連接調度的超集,各個服務器相應的權值表示其處理性能。服務器的缺省權值為1,系統管理員可以動態地設置服務器的權值。加權最小連接調度在調度新連接時盡可能使服務器的已建立連接數和其權值成比例。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。

5.基于局部的最少連接

基于局部的最少連接調度(Locality-Based Least Connections 簡稱'LBLC')算法是針對請求報文的目標IP地址的 負載均衡調度,目前主要用于Cache集群系統,因為在Cache集群客戶請求報文的目標IP地址是變化的。這里假設任何后端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和Cache命中率,從而提升整個集群系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則使用'最少連接'的原則選出一個可用的服務器,將請求發送到服務器。

6.帶復制的基于局部性的最少連接

帶復制的基于局部性的最少連接(Locality-Based Least Connections with Replication? 簡稱'LBLCR')算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統,它與LBLC算法不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。按'最小連接'原則從該服務器組中選出一一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按'最小連接'原則從整個集群中選出一臺服務器,將該服務器加入到這個服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。

7.目標地址散列調度

目標地址散列調度(Destination Hashing 簡稱'DH')算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且并未超載,將請求發送到該服務器,否則返回空。

8.源地址散列調度U

源地址散列調度(Source Hashing? 簡稱'SH')算法先根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且并未超載,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同,它的算法流程與目標地址散列調度算法的基本相似。

9.最短的期望的延遲

最短的期望的延遲調度(Shortest Expected Delay 簡稱'SED')算法基于WLC算法。舉個例子吧,ABC三臺服務器的權重分別為1、2、3 。那么如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用SED算法后會進行一個運算

A:(1+1)/1=2? ?B:(1+2)/2=3/2? ?C:(1+3)/3=4/3? ?就把請求交給得出運算結果最小的服務器。

10.最少隊列調度

最少隊列調度(Never Queue 簡稱'NQ')算法,無需隊列。如果有realserver的連接數等于0就直接分配過去,不需要在進行SED運算。


---------------------
作者:chenhuyang
來源:CSDN
原文:https://blog.csdn.net/weixin_40470303/article/details/80541639
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一張圖看懂微軟Power BI系列組件

一、Power BI簡介 Power BI是微軟最新的商業智能(BI)概念,它包含了一系列的組件和工具。話不多說,直接上圖吧: Power BI的核心理念就是讓我們用戶不需要強大的技術背景,只需要掌握Excel這樣簡單的工具就能快…

互聯網項目總結

2019獨角獸企業重金招聘Python工程師標準>>> 從去年年底開始專門被分配到互聯網小組做項目,一直想做個總結,但是苦于太貪玩。好吧,借著小組技術交流來一發。這里只對自己新學習的技術或者一些小技巧做簡要概述,不做深究…

【ArcGIS微課1000例】0036:分式標注案例教程

【拓展閱讀】:【ArcGIS Pro微課1000例】0015:ArcGIS Pro中屬性字段分式標注案例教程 文章目錄 1. 符號化2. 分式標注1. 符號化 右鍵數據圖層→符號系統,打開符號系統對話框,住符號系統選擇【唯一值】,字段1選擇NAME。 唯一值標注效果: 2. 分式標注 雙擊打開圖層屬性,切…

【轉】 ConstraintLayout 完全解析 快來優化你的布局吧

轉自: http://blog.csdn.net/lmj623565791/article/details/78011599 本文出自張鴻洋的博客 一、概述 ConstraintLayout出現有一段時間了,不過一直沒有特別去關注,也多多少少看了一些文字介紹,多數都是對使用可視化布局拖拽&#…

IoTDB 的C# 客戶端發布 0.13.0.7

IoTDB C# Client 0.13.0.7 已經發布, 此版本更新的內容為筆者為Apache-IoTDB-Client-CSharp實現了Ado.Net的兼容層,降低了對IoTDB的使用門檻。于此同時, IoTSharp也開始支持了IoTDB的數據入庫,隨著晚些時候IoTSharp 2.7 版本的發布…

[轉]Docker超詳細基礎教程,快速入門docker

一、docker概述 1.什么是docker Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬…

【Zookeeper】源碼分析之服務器(一)

一、前言 前面已經介紹了Zookeeper中Leader選舉的具體流程,接著來學習Zookeeper中的各種服務器。 二、總體框架圖 對于服務器,其框架圖如下圖所示 說明: ZooKeeperServer,為所有服務器的父類,其請求處理鏈為PrepReques…

linux下配置samba服務器(以CentOS6.7為例)

一、簡介(百度百科)Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。SMB(Server Messages Block,信息服務塊)是一種在局域網上共享文件和打印機的一種通信協議&#xff0c…

【ArcGIS微課1000例】0037:上下標標注記案例教程

在利用ArcGIS進行制圖時,進行標注(Label) 或注記(Annolation) 是必不可少的。但是除了常規的標注和注記以外,還時常需要一些特殊的標注或注記,比如上標、下標等。 文章目錄一、上標標注方法二、下標標注方法一、上標標注方法 上下標代碼模板…

Redis——緩存擊穿、穿透、雪崩

1、緩存穿透: (1)問題描述:key對應的數據并不存在,每次請求訪問key時,緩存中查找不到,請求都會直接訪問到數據庫中去,請求量超出數據庫時,便會導致數據庫崩潰。如一個用…

數據庫性能系列之子查詢

前言說起數據庫,想必一些朋友會認為,數據庫不就是天天CRUD嗎?只要我掌握了這幾招,根本不在話下。是的,其實我也很贊同這個觀點,對于大多數應用程序來說,只掌握這些內容,是可以勝任日…

shell printf命令:格式化輸出語句

shell printf命令:格式化輸出語句注意:使用printf的腳本比使用echo移植性好。如同echo命令,printf命令可以輸出簡單的字符串:[rootmaster ~]#printf "Hello, Shell\n"Hello, Shellprintf不像echo那樣會自動提供一個換行…

UVa 10905 孩子們的游戲

https://vjudge.net/problem/UVA-10905 題意&#xff1a; 給定n個正整數&#xff0c;把它們連接成一個最大的整數。 思路&#xff1a; 實在是沒想到直接用string來排序了。 1 #include<iostream> 2 #include<algorithm>3 #include<string>4 using namespace …

laravel 內部驗證碼

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.找到此文件composer.json 如下圖添加 "gregwar/captcha": "1.*" 行代碼 2.在命令行中執行 composer update 安裝完成后 3.找到控制器添加如下代碼 public function captcha($tmp) {//生成驗證…

k8s docker集群搭建

一、Kubernetes系列之介紹篇 1.背景介紹 云計算飛速發展 - IaaS - PaaS - SaaS Docker技術突飛猛進 - 一次構建&#xff0c;到處運行 - 容器的快速輕量 - 完整的生態環境 2.什么是kubernetes 首先&#xff0c;他是一個全新的基于容器技術的分布式架構領先方案。Kubernetes(k8…

leetcode 66 Plus One

給定一個數組&#xff0c;表示整數的各個位數&#xff0c;現要將其加上1&#xff0c;考慮進位。 vector<int> plusOne(vector<int>& digits) {int size digits.size();bool carry true;for (int i size - 1; i > 0; --i) {if (digits[i] 9 && c…

如何讓最小 API 綁定查詢字符串中的數組

前言在上次的文章中&#xff0c;我們實現了《讓 ASP.NET Core 支持綁定查詢字符串中的數組》&#xff1a;[HttpGet] public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values) {return string.Join(" ", values.Select(p…

Kubernetes api-server源碼閱讀2(Debug Kubernetes篇)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes api-server源碼閱讀 系列第二篇&#xff0c;主要講述如何實現 kubernetes api-server 的 debug 參考b站視頻地址&#xff1a;Kubernetes源碼開發之旅二 1.本篇章任務 Go-Delve&#xff1a;go語言的…

webrtc 視頻 demo

webrtc 視頻 demo webrtc網上封裝的很多&#xff0c;demo很多都是一個頁面里實現的&#xff0c;今天實現了個完整的 &#xff0c; A 發視頻給 BA webrtc.html作為offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

條件注釋判斷瀏覽器版本!--[if lt IE 9](轉載)

<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]--> <!--[if IE]> 所有的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以及IE6以下版本可識別 <![endif]--> <!--[if …