您好,登錄后才能下訂單哦!
下文給大家帶來LVS是如何實現web服務的負載均衡,希望能夠給大家在實際運用中帶來一定的幫助,負載均衡涉及的東西比較多,理論也不多,網上有很多書籍,今天我們就用億速云在行業內累計的經驗來做一個解答。
我們知道LVS項目已提供了一個實現可伸縮網絡服務的Linux Virtual Server框架。在LVS框架中,提供了含有三種"IP負載均衡技術"的IP虛擬云服務器軟件"IPVS"、"基于內容請求分發的內核Layer-7交 換機KTCPVS"和"集群管理軟件"。這里主要說說”IP負載均衡技術”他的管理工具就是ipvsadm。
1)ipvsadm語法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [-b sched-flags] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid syncid] ipvsadm --stop-daemon state ipvsadm -h
2)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 | 顯示內核中虛擬服務器列 |
-t | 說明虛擬服務器提供的是tcp服務,此選項后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port] |
-u | 說明虛擬服務器提供的是udp服務,此選項后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port] |
-f fwmar | 說明是經過iptables標記過的服務類型 |
-s | 此選項后面跟LVS使用的調度算法;有這樣幾個選項:rr|wrr|lc|wlc|lblc|lblcr|dh|sh。默認的調度算法是: wlc |
-p [timeout] | 在某個Real Server上持續的服務時間。也就是說來自同一個用戶的多次請求,將被同一個Real Server處理。此參數一般用于有動態請求的操作中,timeout的默認值為360s(幫助文檔寫的是300s)。例如:-p 100,表示持續服務時間為00s。 |
-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 |
3)說明: 保存添加的虛擬ip記錄和ipvsadm的規則可以使用service ipvsadm save,還可以用-S或--save。清除所有記錄和規則除了使用-C,還以使用--clear。
2 web服務的負載均衡
1)實驗準備:準備4臺虛擬機
@@一臺作為VS服務器
@@一臺作為客戶端
@@兩臺主機作為web服務器,當然了,不只是web服務器。這里只是為了實驗方便,web服務最常見,
2)網絡拓撲及地址規劃
3)環境配置
為了實驗能順利實現,關閉防火墻和selinux;注意這只是實驗環境中。
[root@vin ~]# iptables -F # 清空防火墻規則 [root@vin ~]# setenforce 0 # 臨時禁用selinux [root@vin ~]#
4)web服務器配置
為了讓我們看清楚LVS是如何調度的,我們特意將兩臺web服務器的index.html頁面設置的不一樣。
@@安裝服務:
[root@vin ~]# yum install httpd -y [root@vin ~]# echo "Linux web1" > /var/www/html/index.html # 修改主頁,web2的主頁內容修改為Linux web2
@@設置路由:只留一個網卡并且將網關指向Director
[root@vin ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.14.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33 0.0.0.0 192.168.14.77 0.0.0.0 UG 0 0 0 ens33
5)VS調度器設置
@@ 安裝ipvsadm工具
[root@vin ~]# yum install ipvsadm -y # yum安裝,不過我已經安裝了 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Package ipvsadm-1.27-7.el7.x86_64 already installed and latest version Nothing to do [root@vin ~]# mount /dev/sr0 /mnt # 掛載光盤 mount: /dev/sr0 is write-protected, mounting read-only [root@vin ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm # rpm安裝 [root@vin ~]#
@@ 開啟核心轉發功能
[root@vin ~]# echo 1 > /proc/sys/net/ipv4/ip_forword
@@ 定義集群服務
[root@vin ~]# ipvsadm -A -t 172.18.14.100:80 -s wrr [root@vin ~]# ipvsadm -a -t 172.18.14.100:80 -r 192.168.14.55 -m -w 3 # 定義web1的權重為3 [root@vin ~]# ipvsadm -a -t 172.18.14.100:80 -r 192.168.14.66 -m -w 1 # 定義web2的權重為1(默認也是1;可省略) [root@vin ~]# ipvsadm -Ln # 查看幾區服務 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.18.14.100:80 wrr -> 192.168.14.55:80 Masq 3 0 0 -> 192.168.21.66:80 Masq 1 0 0
6)測試
在客戶端使用for循環向VIP發起http訪問請求
[root@vint ~]# for i in {1..10};do curl Linux web1 Linux web1 Linux web2 Linux web2 Linux web2 Linux web1 Linux web2 Linux web2 Linux web2 Linux web1 Linux web2
7)結果分析
觀察訪問結果,我們發現,LVS根據我們的算法WRR(加權輪詢)及對應的權重(3,1)進行了調度。
3 實現http與https同時調度
方案一:同過添加兩個集群服務,分別針對http和https的訪問
1)原理剖析:
要實現http(上面我們已經實現了)與https的調度,我們第一步要做的就是:為兩臺服務提供CA證書,而且這兩個服務器上的CA證書必須完全相同(可以采取先給一個授權,在復制到另外一臺服務器上),這里我們可以使用Director作為根CA的頒發機構來頒發證書,也可以使用web服務器的自簽名證書。然后我們在VS服務器上在添加一個用于https進行調度的集群服務,從而實現調度。
2)在web服務器上實現https服務
@@生成證書:這里就不在說怎么實現CA了,請參考博客:http://vinsent.blog.51cto.com/13116656/1964034
3)VS上添加集群服務
[root@vin ~]# ipvsadm -A -t 172.18.14.100:443 -s wrr [root@vin ~]# ipvsadm -a -t 172.18.14.100:443 -r 192.168.14.55 -m -w 3 # 定義web1的權重為3 [root@vin ~]# ipvsadm -a -t 172.18.14.100:443 -r 192.168.14.66 -m -w 1 # 定義web2的權重為1(默認也是1;可省略) [root@vin ~]# ipvsadm -Ln # 查看幾個集群服務 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.18.14.100:80 wrr -> 192.168.14.55:80 Masq 3 0 0 -> 192.168.21.66:80 Masq 1 0 0 TCP 172.18.14.100:443 wrr -> 192.168.14.55:443 Masq 3 0 0 -> 192.168.21.66:443 Masq 1 0 0
4)測試
[root@vint ~]# for i in {1..10};do curl http://172.18.14.100;curl
方案二:使用防火墻標記,實現http與https的統一調度。
1)明晰思路
上面實現了http與https通過LVS的調度分別按相應算法調度,但是他們的調度依然各是各的,我們怎么能讓VS服務將http與https能夠看成一個服務進行調度呢,此時我們想到了Netfilter中的MANGLE表,我們可以在防火墻上做策略,讓訪問我的https和http服務的請求給他們打上標記MARK,這樣,在調度的時候,我們只需要根據MARK實現調度即可,至于他是究竟是http還是https我們便不在關心。
2)在VS上配置iptables規則
[root@vint ~]# iptables -F [root@vint ~]# iptables -F -t nat # 保證防墻上沒有其他規則干擾;注意:這只是實驗環境 [root@vint ~]# iptables -A -t mangle PREROUTING -p tcp -m multiport --dport 80,443 \ >-d 172.18.14.100 -j MARK --set-mark 10
3)設置LVS集群服務
由于我們將二者集合起來調度,在Director看來,http訪問與https訪問都是同一個服務,所以我們想清空原有的集群服務,在重新添加集群服務。
[root@vint ~]# ipvsadm -C [root@vint ~]# ipvsadm -Ln # 確保規則清除 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@vint ~]# ipvsadm -Z # 清空計數器 [root@vin ~]# ipvsadm -A -t -f 10 -s wrr [root@vin ~]# ipvsadm -a -t -f -r 192.168.14.55 -m -w 3 # 定義web1的權重為3 [root@vin ~]# ipvsadm -a -t -f -r 192.168.14.66 -m -w 1 # 定義web2的權重為1(默認也是1;可省略)
4)測試
[root@vint ~]# for i in {1..10};do curl http://172.18.14.100;curl https://172.18.14.100;done
看了以上關于LVS是如何實現web服務的負載均衡,如果大家還有什么地方需要了解的可以在億速云行業資訊里查找自己感興趣的或者找我們的專業技術工程師解答的,億速云技術工程師在行業內擁有十幾年的經驗了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。