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實現負載均衡