1. 程式人生 > >LVS實現負載均衡

LVS實現負載均衡

lvs實現負載均衡

一、 LVS簡介

LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。

使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。LVS 是一個實現負載均衡集群的開源軟件項目,LVS架構從邏輯上可分為調度層、Server集群層和共享存儲。

LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公(www.real.com)、全球最大的開源網站(sourceforge.net)等。

二、LVS的基本工作原理

技術分享

1.當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至內核空間

2.PREROUTING鏈首先會接收到用戶請求,判斷目標IP確定是本機IP,將數據包發往INPUT鏈

3.IPVS是工作在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和自己已定義好的集群服務進行比對,如果用戶請求的就是定義的集群服務,那麽此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈

4.POSTROUTING鏈接收數據包後發現目標IP地址剛好是自己的後端服務器,那麽此時通過選路,將數據包最終發送給後端的服務器

三、LVS的組成

LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。

1. ipvs(ip virtual server):一段代碼工作在內核空間,叫ipvs,是真正生效實現調度的代碼。

2. ipvsadm:另外一段是工作在用戶空間,叫ipvsadm,負責為ipvs內核框架編寫規則,定義誰是集群服務,而誰是後端真實的服務器(Real Server)

-A --add-service在服務器列表中新添加一條新的虛擬服務器記錄

-t 表示為tcp服務

-u 表示為udp服務

-s --scheduler 使用的調度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默認調度算法是 wlc

ipvsadm -A -t 192.168.1.2:80 -s wlc -a --add-server #在服務器表中添加一條新的真實主機記錄

-t --tcp-service 說明虛擬服務器提供tcp服務

-u --udp-service 說明虛擬服務器提供udp服務

-r --real-server 真實服務器地址

-m --masquerading 指定LVS工作模式為NAT模式

-w --weight 真實服務器的權值

-g --gatewaying 指定LVS工作模式為直接路由器模式(也是LVS默認的模式)

-E –edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。

-D –delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。

-C –clear 清除內核虛擬服務器表中的所有記錄。

-R –restore 恢復虛擬服務器規則

-S –save 保存虛擬服務器規則,輸出為-R 選項可讀的格式

-e –edit-server 編輯一條虛擬服務器記錄中的某條真實服務器記錄

-d –delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄

-L|-l –list 顯示內核虛擬服務器表

--numeric, -n:以數字形式輸出地址和端口號

--exact:擴展信息,精確值

--connection,-c:當前IPVS連接輸出

--stats:統計信息

--rate :輸出速率信息 參數也可以從/proc/net/ip_vs*映射文件中查看

-Z –zero 虛擬服務表計數器清零(清空當前的連接數量等)

四、LVS相關術語

1. DS:Director Server,指的是前端負載均衡器節點。

2. RS:Real Server,後端真實的工作服務器。

3. VIP:向外部直接面向用戶請求,作為用戶請求的目標的IP地址。

4. DIP:Director Server IP,主要用於和內部主機通訊的IP地址。

5. RIP:Real Server IP,後端服務器的IP地址。

6. CIP:Client IP,訪問客戶端的IP地址。

五、IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR,詳述如下:

①VS/NAT: 即(Virtual Server via Network Address Translation)

也就是網絡地址翻譯技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最後將報文請求發送到選定的Real Server。在服務器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然後把數據發送給用戶,完成整個負載調度過程。

可以看出,在NAT方式下,用戶請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,調度器的處理能力將成為瓶頸。

技術分享

(a). 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP

(b). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈

(c). IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為後端服務器IP,然後將數據包發至POSTROUTING鏈。 此時報文的源IP為CIP,目標IP為RIP

(d). POSTROUTING鏈通過選路,將數據包發送給Real Server

(e). Real Server比對發現目標為自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP

(f). Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址,然後響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP

LVS-NAT模型的特性:

RS應該使用私有地址,RS的網關必須指向DIP

DIP和RIP必須在同一個網段內

請求和響應報文都需要經過Director Server,高負載場景中,Director Server易成為性能瓶頸

支持端口映射

RS可以使用任意操作系統

缺陷:對Director Server壓力會比較大,請求和響應都需經過director server

實例:實現基於NAT模式的LVS負載均衡:

準備三臺主機:一臺Director(橋接網卡、僅主機網卡):

DIP:192.168.159.135 VIP:172.17.253.97

一臺後臺服務器(僅主機):RIP:192.168.159.129 配置有小米電商網站

一臺後臺服務器(僅主機):RIP:192.168.159.139 配置有小米電商網站

步驟:

一、Director上操作:

①安裝ipvsadm:

yum install ipvsadm

②查看內核是否支持ipvs模塊:

grep -i -C 10 "ipvs" /boot/config-3.10.0-514.el7.x86_64

③加三條記錄:

開啟一個基於80端口的虛擬服務,調度方式為wrr

ipvsadm -A -t 172.17.253.97:80 -s wrr

配置web服務後端real server為nat工作方式,權重為1

ipvsadm -a -t 172.17.253.97:80 -r 192.168.159.129:80 -m -w 1

ipvsadm -a -t 172.17.253.97:80 -r 192.168.159.139:80 -m -w 1

查看:ipvsadm -L -n

④開啟路由轉發 vim /etc/sysctl.conf

net.ipv4.ip_forward=1 或:echo 1 > /proc/sys/net/ipv4/ip_forward

sysctl -p

二、兩個後臺服務器上操作:

添加路由route add default gw 192.168.159.135

查看:route -n

刪除:route del -net 169.254.0.0/16 dev eth0

實現基於LNMP的電子商務網站:

安裝步驟:

1.下載nginx源代碼yum install nginx

2.yum install mariadb、mariadb-server、php-mysql、php、php-fpm

3.mkdir -p /data/web

unzip -d /data/web/ xiaomi.zip 解壓縮

chown nobody.nobody /data/web -R 修改權限為nobody

4.cp /etc/nginx/nginx.conf.default etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf 修改配置文件

user nobody;

worker_processes 1;

#error_log logs/error.log;

#error_log logs/error.log notice;

error_log /var/log/nginx/error.log info;

http {

include mime.types;

default_type application/octet-stream;

log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" ‘

‘"$http_user_agent" "$http_x_forwarded_for"‘;

access_log /var/log/nginx/access.log main;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

#keepalive_timeout 0;

keepalive_timeout 65;

gzip on;

server {

listen 80;

server_name xiaomi.com;

root /data/web;

location / {

index index.php index.html index.htm;

}

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

systemctl start nginx 重啟服務

5.vim /etc/php.ini 修改PHP.ini中功能配置

#修改時鐘配置 date.timezone = Asia/Shanghai

;http://www.php.net/manual/en/ini.core.php#ini.short-open-tag

#可以在php.ini中設置short_open_tag = On

systemctl start php-fpm

6.vim /etc/php-fpm.d/www.conf 修改文件中權限

; RPM: apache Choosed to be able to access some dir as httpd

user = nobody

; RPM: Keep a group allowed to write in log dir.

group = nobody

7.create database xiaomi;-->show databases;創建數據庫

vim /data/web/data/config.php 修改數據庫文件

$db_host = "127.0.0.1:3306";

// 數據庫名稱

$db_name = "shangcheng";

// 數據庫用戶名

$db_user = "root";

// 數據庫密碼

$db_pass = "123456";

systemctl restart mariadb.service

8.網站部署和驗證

1、打開http://192.168.159.129/ebak/index.php 後臺恢復系統 賬號 admin 密碼 123456

2、配置連接數據庫並連接到數據庫

3、恢復網站數據信息,並驗證http://192.168.159.129/index.php能正常訪問

三、瀏覽器訪問:http://172.17.253.97

測試:分別在兩臺後端服務器上建立html頁面,測試負載均衡

客戶端訪問:curl http://172.17.253.97/index.html-->test1和test2循環

② VS/TUN :即(Virtual Server via IP Tunneling)

也就是IP隧道技術實現虛擬服務器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器采用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網絡。因此,在TUN方式中,調度器將只處理用戶的報文請求,集群系統的吞吐量大大提高。

技術分享

(a)當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP

(b)PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈

(c)IPVS比對數據包請求的服務是否為集群服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然後發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP

(d)POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸)。 此時源IP為DIP,目標IP為RIP

(e)RS接收到報文後發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裏面還有一層IP首部,而且目標是自己的lo接口VIP,那麽此時RS開始處理此請求,處理完成之後,通過lo接口送給eth0網卡,然後向外傳遞。 此時的源IP地址為VIP,目標IP為CIP

(f)響應報文最終送達至客戶端

LVS-Tun模型特性

RIP、VIP、DIP全是公網地址

RS的網關不會也不可能指向DIP

所有的請求報文經由Director Server,但響應報文必須不能進過Director Server

不支持端口映射

RS的系統必須支持隧道

③VS/DR: 即(Virtual Server via Direct Routing)

也就是用直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上。

技術分享

(a)當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP

(b)PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈

(c)IPVS比對數據包請求的服務是否為集群服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址

(d)由於DS和RS在同一個網絡中,所以是通過二層來傳輸。POSTROUTING鏈檢查目標MAC地址為RIP的MAC地址,那麽此時數據包將會發至Real Server。

(e)RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之後,將響應報文通過lo接口傳送給eth0網卡然後向外發出。 此時的源IP地址為VIP,目標IP為CIP

(f)響應報文最終送達至客戶端

LVS-DR模型的特性

保證前端路由將目標地址為VIP報文統統發給Director Server,而不是RS

RS可以使用私有地址;也可以是公網地址,如果使用公網地址,此時可以通過互聯網對RIP進行直接訪問

RS跟Director Server必須在同一個物理網絡中

所有的請求報文經由Director Server,但響應報文必須不能進過Director Server

不支持地址轉換,也不支持端口映射

RS可以是大多數常見的操作系統

RS的網關絕不允許指向DIP(因為我們不允許他經過director)

RS上的lo接口配置VIP的IP地址

缺陷:RS和DS必須在同一機房中

實例:實現基於DR模式的LVS負載均衡:

準備三臺主機:都是橋接模式

一臺Director,DIP:172.17.253.97 VIP:172.17.253.110

一臺後臺服務器,RIP:172.17.253.140 VIP:172.17.253.110

一臺後臺服務器,RIP:172.17.253.193 VIP:172.17.253.110

步驟:

一、Director上操作:

①安裝ipvsadm:

yum install ipvsadm

②查看內核是否支持ipvs模塊:

grep -i -C 10 "ipvs" /boot/config-3.10.0-514.el7.x86_64

③配置VIP到本地網卡別名eth0:0上,並只廣播自己:

ifconfig eth0:0 172.17.253.110 broadcast 172.17.253.110 netmask 255.255.255.255 up

④添加路由:route add -host 172.17.253.110 dev eth0:0

⑤配置lvs服務,添加三條記錄:

開啟一個基於80端口的虛擬服務,調度方式為wrr:

ipvsadm -A -t 172.17.253.110:80 -s wrr

配置web服務後端real server 為DR工作方式,權重為1

ipvsadm -a -t 172.17.253.110:80 -r 172.17.253.140:80 -g -w 1 -g:直接路由模式

ipvsadm -a -t 172.17.253.110:80 -r 172.17.253.193:80 -g -w 1

ipvsadm -L -n

二、後臺服務器上操作:

①配置VIP到本地回環網卡lo上,並只廣播自己:

ifconfig lo:0 172.17.253.110 broadcast 172.17.253.110 netmask 255.255.255.255 up

②配置本地回環網卡路由:

route add -host 172.17.253.110 lo:0

③忽略ip與mac不匹配的問題:

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

三、測試:分別在兩臺後端服務器上建立html頁面,測試負載均衡

客戶端訪問:curl http://172.17.253.110/index.html-->test1和test2循環

通常情況下企業中最常用的是 DR 實現方式,而 NAT 配置上比較簡單和方便

六、LVS的八種調度算法

1. 輪叫調度 rr

這種算法是最簡單的,就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器,不管後端 RS 配置和處理能力,非常均衡地分發下去。

2. 加權輪叫 wrr

這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設置權重,權重越高,那麽分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每臺服務器的性能,並給每臺服務器添加要給權值,如果服務器A的權值為1,服務器B的權值為2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。

3. 最少鏈接 lc

這個算法會根據後端 RS 的連接數來決定把請求分發給誰,比如 RS1 連接數比 RS2 連接數少,那麽請求就優先發給 RS1

4. 加權最少鏈接 wlc

這個算法比 lc 多了一個權重的概念。

5. 基於局部性的最少連接調度算法 lblc

這個算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的服務器,如果這臺服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其它可行的服務器

6. 復雜的基於局部性最少的連接算法 lblcr

記錄的不是要給目標 IP 與一臺服務器之間的連接記錄,它會維護一個目標 IP 到一組服務器之間的映射關系,防止單點服務器負載過高。

7. 目標地址散列調度算法 dh

該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關系,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。

8. 源地址散列調度算法 sh

與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。


實驗一、實現LVS持久連接(基於上面的DR實驗):

功能:無論ipvs使用何種scheduler,其都能夠實現在指定時間範圍內始終將來自同一個ip地址的請求發往同一個RS;此功能是通過lvs持久連接模板實現,其與調度方法無關。

步驟:

①在iptables打上標記,把80端口標記為99

iptables -t mangle -A PREROUTING -d 192.168.159.110 -p tcp --dport 80 -j MARK --set-mark 99

②在iptables打上標記,把443端口標記為99

iptables -t mangle -A PREROUTING -d 192.168.159.110 -p tcp --dport 443 -j MARK --set-mark 99

③清除之前的虛擬服務器表的記錄:ipvsadm -C

④在lvs上建立基於99號標記的虛擬服務

ipvsadm -A -f 99 -s rr -p

⑤設置後端服務地址

ipvsadm -a -f 99 -r 192.168.159.121 -g

ipvsadm -a -f 99 -r 192.168.159.120 -g

⑥測試:使用不同主機測試,同一主機訪問到頁面的不變

客戶端訪問:curl http://192.168.159.110/index.html-->test2

實驗二、實現健康狀態監測(基於上面DR和持久連接的實驗):

一、安裝工具包:

1.安裝ldirectord:

①yum install lftp

②lftp 172.17.0.1

lftp 172.17.0.1:~> cd /pub/Sources/7.x86_64/crmsh/

lftp 172.17.0.1:/pub/Sources/7.x86_64/crmsh>

get ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

③yum localinstall lbirectord-3.9.6-0rc1.1.1.x86_64.rpm

二、編輯配置文件:

①拷貝配置文件模板

cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/

②編輯配置文件,修改下面幾行

vim /etc/ha.d/ldirectord.cf

quiescent=no

no表示刪除檢測不過關的realserver記錄,yes表示設置其權重為0而不是刪除記錄。

virtual=192.168.159.110:80

real=192.168.159.120:80 gate 2 2表示權重

real=192.168.159.121:80 gate 2

scheduler=wrr

request="ok.html"

receive="ok"

三、清除虛擬服務器表的所有記錄:ipvsadm -C

四、啟動服務:systemctl start ldirectord。會自動生成虛擬服務器表

查看 ipvsadm -L -n

五、在realserver後端服務器上準備ok.html頁面,內容為ok。

real-server的配置:

real-server1上:cd /data/web/然後輸入echo "ok" > ok.html

real-server2上:cd /data/web/然後輸入echo "ok" > ok.html

六、測試:當修改其中一個realserver的ok.html時,虛擬服務器表中就少了該機器的記錄,而且客戶端訪問時也不訪問該機器了。

當ok.html頁面恢復後,虛擬服務器表中的記錄就又添加了,而且客戶端也能訪問到該服務器了

(註:根據內容檢測,當內容不一致時,就會被down掉lvs-server上:ipvsadm -L -n-->192.168.159.120:80

real-server2上:修改ok.html文件內容為down

lvs-server上:ipvsadm -L -n-->127.0.0.1:80

LVS實現負載均衡