Linux系統(四)LVS集群負載均衡NAT模式

来源:http://www.cnblogs.com/knowledgesea/archive/2017/02/24/6406994.html
-Advertisement-
Play Games

序言 提到LVS,就從章文嵩博士開始吧,反正也不知道如何下筆來寫這一篇。章大博士,讀博時候創建這個lvs軟體項目,但是他提倡開源精神,在用戶的建議和反饋中,這個花了他兩周時間開發的開源軟體不斷得到改建和豐富。到1999年,該款軟體已在負載均衡領域中比較出名,章文嵩仍舊堅持開源,將源代碼分享給所有人。 ...


序言

提到LVS,就從章文嵩博士開始吧,反正也不知道如何下筆來寫這一篇。章大博士,讀博時候創建這個lvs軟體項目,但是他提倡開源精神,在用戶的建議和反饋中,這個花了他兩周時間開發的開源軟體不斷得到改建和豐富。到1999年,該款軟體已在負載均衡領域中比較出名,章文嵩仍舊堅持開源,將源代碼分享給所有人。好人自有好歸宿,章博士在2016年5月27日,去滴滴出任高級副總裁、負責CTO線基礎平臺部兼工程技術委員會主席。在來滴滴之前,章博士曾在阿裡任職近七年,歷任淘寶網資深技術總監、淘寶技術委員會主席、阿裡副總裁、阿裡開源委員會主席、阿裡雲CTO等。

那扯那麼多LVS是個什麼呢?

他是Linux Virtual Server的縮寫,是一個虛擬的伺服器集群系統,總之為使用集群技術來和Linux系統來實現一個高可用,高性能的伺服器。如果進一步的扯淡,建議百度百科一下,裡面清清楚楚,如果你看百科看不懂,那你加左上角的技術群,去跟裡面的大神聊聊吧。這裡我附帶一個直通章博士的LVS中文站點:http://zh.linuxvirtualserver.org/

LVS 集群分為三層結構:

  • 負載調度器(load balancer):它是整個LVS 集群對外的前端機器,負責將client請求發送到一組伺服器[多台LB IP]上執行,而client端認為是返回來一個同一個IP【通常把這個IP 稱為虛擬IP/VIP】
  • 伺服器池(server pool):一組真正執行client 請求的伺服器,一般是我們的web伺服器;除了web,還有FTP,MAIL,DNS
  • 共用存儲(shared stored):它為 server pool 提供了一個共用的存儲區,很容易讓伺服器池擁有相同的內容,提供相同的服務

LVS NAT模式簡述

章文嵩博士的博文在這裡,瞅瞅吧。http://www.linuxvirtualserver.org/zh/lvs3.html

 

接下來我們的示例,就採用如下ip配置部署。

具體數據包路由走向,參考我的文章 VMware虛擬網路連接模式詳解(NAT,Bridged,Host-only) 中的nat網路連接方式。

NAT模式的幾個要點

  1. dip這台伺服器為分發伺服器,他擁有2個ip一個客戶訪問的外網ip,一個ip作為vip真實伺服器的網關地址,且真實伺服器必須在一個網段中。
  2. 分發伺服器上安裝支持負載均衡各種演算法的軟體,來實現負載轉發功能。
  3. 分發伺服器還需要打開路由轉發功能。
  4. 中RIP真實伺服器可以使用任何的操作系統,但都需使用私有網路。
  5. NAT網路連接方式的弊端也是lvs nat模式的性能瓶頸所在,就是分發伺服器轉發所有的請求到真實伺服器與轉發請求響應數據到客戶端,這樣就是一個性能瓶頸。

LVS NAT模式配置操作

1、準備工作,3台伺服器。一臺用作Director server。2台用作real server。如上圖。

2、配置Director server為雙ip

[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.222.131  netmask 255.255.255.0  broadcast 192.168.222.255
        inet6 fe80::20c:29ff:feaf:ff3a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:af:ff:3a  txqueuelen 1000  (Ethernet)
        RX packets 53298  bytes 4735958 (4.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2690  bytes 453988 (443.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.136  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::20c:29ff:feaf:ff44  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:af:ff:44  txqueuelen 1000  (Ethernet)
        RX packets 11269  bytes 882315 (861.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1502  bytes 294418 (287.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 查看eth1具體配置,eth0為nat連網方式,不需要修改,eth1為host-only模式,需要修改為靜態ip,且配置ip地址。
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"   
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="192.168.2.136"
NETMASK="255.255.255.0"
  • 設置Director server,開啟路由轉發功能
[root@localhost network-scripts]# echo "1">"/proc/sys/net/ipv4/ip_forward"
  • 在Director server上安裝lvs管理工具:ipvsadmin,ipvsadmin這個工具稍後會深入一下。
[root@localhost ~]# yum install ipva
  • 配置負載均衡規則為輪詢 
[root@localhost ~]# ipvsadm -C   --清空轉發規則
[root@localhost ~]# ipvsadm -A -t 192.168.222.131:80 -s rr    --131上一單有80埠的tcp請求,即使用rr表示轉發策略為輪詢的方式轉發給一下的真實伺服器,這裡有好多負載均衡轉發演算法,在下麵會介紹下。
[root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.130 -m
[root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.129 -m
  • 到此Director server已經全部配置完畢。

3、配置Real server。real server為host-only模式,這裡要做的就很簡單啦。

  • 配置ip為靜態ip,且網關為Director server的內網ip 
[root@localhost network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="192.168.2.130"
NETMASK="255.255.255.0"
GATEWAY="192.168.2.136"
  • 2台real server的網路設置一樣,只是ip不一樣而已。這裡不一一列出,如上配置即可。
  • 安裝nginx ,安裝之後修改頁面,打開80埠即可。

4、看下結果,在主機上用瀏覽器打開。http://192.168.222.131/  ,不斷刷新頁面即可看到來到2個real server的不同web站點的網頁。

[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
192.168.2.129 c
[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
192.168.2.129 c

5、到此,lvs的nat模式的配置實現也已完成,這個配置其實很簡單的,對吧。哈哈。

ipvsadmin工具命令講解 

ipvsadm 參數詳解

  • -A (--add-service) 在內核的虛擬伺服器列表中添加一條新的虛擬IP記錄。也就是增加一臺新的虛擬伺服器。虛擬IP也就是虛擬伺服器的IP地址。
  • -E (--edit-service) 編輯內核虛擬伺服器列表中的一條虛擬伺服器記錄
  • -D (--delete-service) 刪除內核虛擬伺服器列表中的一條虛擬伺服器記錄
  • -C (--clear) 清除內核虛擬伺服器列表中的所有規則
  • -R (--restore) 恢復虛擬伺服器規則
  • -S (--save) 保存虛擬伺服器規則,輸出為-R 選項可讀的格式
  • -a (--add-server) 在內核虛擬伺服器列表的一條記錄里添加一條新的Real Server記錄。也就是在一個虛擬伺服器中增加一臺新的Real Server
  • -e (--edit-server) 編輯一條虛擬伺服器記錄中的某條Real Server記錄
  • -d (--delete-server) 刪除一條虛擬伺服器記錄中的某條Real Server記錄
  • -L|-l –list 顯示內核中虛擬伺服器列表
  • -Z (--zero) 虛擬伺服器列表計數器清零(清空當前的連接數量等)
  • --set tcp tcpfin udp 設置連接超時值
  • -t 說明虛擬伺服器提供的是tcp服務,此選項後面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
  • -u 說明虛擬伺服器提供的是udp服務,此選項後面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
  • -f  fwmark 說明是經過iptables標記過的服務類型
  • -s  此選項後面跟LVS使用的調度演算法,有這樣幾個選項: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,預設的調度演算法是: wlc
  • -p  [timeout] 在某個Real Server上持續的服務時間。也就是說來自同一個用戶的多次請求,將被同一個Real Server處理。此參數一般用於有動態請求的操作中,timeout 的預設值為360 分鐘。例如:-p 600,表示持續服務時間為600分鐘。
  • -r 指定Real Server的IP地址,此選項後面跟格式: [real-server-ip:port]
  • -g (--gatewaying) 指定LVS 的工作模式為直接路由模式(此模式是LVS 預設工作模式)
  • -i (-ipip) 指定LVS 的工作模式為隧道模式
  • -m (--masquerading) 指定LVS 的工作模式為NAT模式
  • -w (--weight) weight 指定Real Server的權值
  • -c (--connection) 顯示LVS目前的連接信息 如:ipvsadm -L -c
  • -L --timeout 顯示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
  • -L --daemon 顯示同步守護進程狀態,例如:ipvsadm -L –daemon
  • -L  --stats 顯示統計信息,例如:ipvsadm -L –stats
  • -L  --rate 顯示速率信息,例如:ipvsadm -L  --rate
  • -L  --sort 對虛擬伺服器和真實伺服器排序輸出,例如:ipvsadm -L --sort

保存添加的虛擬ip記錄和ipvsadm的規則可以使用service ipvsadm save,還可以用-S或--save。清除所有記錄和規則除了使用-C,還以使用--clear。

下麵列出幾個常用的查詢。

1、查看記錄和規則

[root@localhost network-scripts]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.222.131:80 rr
  -> 192.168.2.129:80             Masq    1      1          0         
  -> 192.168.2.130:80             Masq    1      0          0   

InActConn: 指非活躍連接數,我們將處於 TCP ESTABLISH 狀態以外的連接都稱為不活躍連接。例如處於 SYN_RECV 狀態的連接,處於 TIME_WAIT 狀態的連接等。

ActiveConn:是活動連接數,也就是tcp連接狀態的ESTABLISHED;

Weight:輪詢權重 

2、選項是統計自該條轉發規則生效以來的包 

[root@localhost network-scripts]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.222.131:http               50      263      134    46273    20519
  -> 192.168.2.129:http                 32      178       83    31215    13069
  -> 192.168.2.130:http                 18       85       51    15058     7450

 Conns    (connections scheduled) : 已經轉發過的連接數  

 InPkts   (incoming packets) :入包個數  

 OutPkts  (outgoing packets) : 出包個數  

 InBytes  (incoming bytes) :入流量(位元組)    

 OutBytes (outgoing bytes)  : 出流量(位元組)  

3、顯示速率信息

[root@localhost network-scripts]# ipvsadm -L --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.222.131:http                0        1        0      216       87
  -> 192.168.2.129:http                  0        1        0      212       85
  -> 192.168.2.130:http                  0        0        0        4        2

CPS (current connection rate) :每秒連接數  

InPPS (current in packet rate) : 每秒的入包個數  

OutPPS (current out packet rate): 每秒的出包個數  

InBPS (current in byte rate) : 每秒入流量(位元組)  

OutBPS   (current out byte rate)      每秒入流量(位元組)  

lvs中的集中調度模式

1、rr(round robin:輪詢。  --在伺服器池中無窮的迴圈遍歷。

2、wrr(weighted round robin):權重輪詢法。  --根據權重值,來分配請求連接,處理的請求連接數與權重值的比率一致。

3、lc(least-connection):最少連接法。  --當請求到達director時,director查看活動和非活動的連接數量,以確定把請求分發給哪個伺服器,director將集群節點目前的活動連接數量x256再加上不活動的連接數量,得到借點的開銷值。最低開銷值的節點勝出,被分發給新的入站請求。(如果開銷一樣,則第一個節點被選中)。

4、wlc(weighted least-connection):帶權重的最少連接法。  --先如lc算出集群節點的開銷值,然後除以分配給其的權重值,最小值節點勝出,將入站請求分發給它。

5、lblc(locality-based least-connection):基於本地的最少連接法。  --基於局部的最小連接,當realserver是緩存伺服器的時候用的比較多。

6、lblcr(locality-based least-connection with replication):帶複製的基於局部的最小連接。  --當realserver是緩存伺服器的時候用的比較多。

7、dh(destination hashing):目標散列法

8、sh(source hashing):源散列法。  --同一個ip的客戶端總是分發給同一個realserver。相當於有客戶粘性,與nginx中的iphash一致。

9、sed(shortest expected delay):最短預期延遲法。  --最短延時預測(ci+1)/ui,ci是連接數,ui是權重值。在wlc方法上做啦輕微改進,這些服務使用tcp,而且當群節點在處理每個請求時保持在活動狀態。計算方法:每個集群節點的的開銷值是通過將活動的連接數+1計算的。然後開銷值除以分配權重值,得到的就是sed值,值少的集群節點勝出。

10、nq(never queue):永不排隊法。  --沒有隊列,分配請求給空閑的伺服器,沒有空閑的伺服器就找響應最快的。

總結

接下來是大家最喜歡的總結內容啦,內容有三,如下:

1、希望能關註我其他的文章。

2、博客裡面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流群,我們一起學習探討。

3、你可以忘記點贊加關註,但千萬不要忘記掃碼打賞哦。


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

-Advertisement-
Play Games
更多相關文章
  • 一、終端登錄 1. 4.3+BSD終端登錄 系統管理員創建一個通常名為/etc/ttys的文件,其中,每個終端設備有一行,每一行說明設備名和傳到getty程式的參數,這些參數說明瞭終端的波特率。當系統bootstrap時內核創建進程ID 1,也就是init進程。init進程使系統進入多用戶狀態。in ...
  • Windows Server2016正式發佈已經有一段時間了。無可厚非,原生Docker的支持是這個版本一個非常大的亮點。 Windows Container 的安裝在網上有很多教程,我這裡不過多的描述,可以參考: https://docs.microsoft.com/zh-cn/virtualiz ...
  • 編譯環境:RVMDK CPU :STM32F103VC 錯誤:.\obj\movSERVO.sct(7): error: L6235E: More than one section matches selector - cannot all be FIRST/LAST. 原因:項目中同時包含以下啟動 ...
  • 讀取excel文件:libxls-1.4.0.zip下載地址:http://sourceforge.net/projects/libxls/安裝方法: ./configure make make install sudo cp -r -v /usr/local/libxls/include/libx ...
  • 裝系統 Deepin是一個國產的linux發行版,因為其極高的顏值和不需要折騰的操作吸引了我。正好厭倦了windows 10,又趕上大四的畢業設計,就拿來玩玩了。 首先,Deepin系統的安裝是非常傻瓜式的,參照官網上的 "教程" 幾步就可裝好。我採用的是體驗安裝,重啟之後即可選擇進入Deepin系 ...
  • 之前要在linux下麵安裝nginx,弄了半天,終於搞定了,下麵給大家詳細一下安裝流程及安裝報錯解決方案: 安裝共分為5步搞定: 1.進入src目錄(下載存放目錄) cd /usr/local/src/ 2.wget下載:http://nginx.org/en/download.html(nginx ...
  • Windows 10 中包含了一個 WSL(Windows Subsystem for Linux)子系統,我們可以在其中運行未經修改過的原生 Linux ELF 可執行文件。利用它我們可以做很多事情,對開發人員和普通用戶都是如此。當然對開發人員的吸引力更大一些,因為這意味著在一些情況,不再需要使用... ...
  • 本文首發於:http://www.fengzheng.pub/archives/238.html 背景說明 伺服器為阿裡雲 ECS,操作系統為 CentOS 6.5。 部署配置說明 第一步,安裝nginx 之所以要先安裝 nginx,是因為下麵配置功能變數名稱解析的時候可以直接在瀏覽器看到效果,當然了,先配 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...