LVS实现web服务的负载均衡
本節索引
Ipvsadm工具介紹
Web服務的負載均衡
實現http與https的同時調度
1 ipvsadm工具
我們知道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-addressipvsadm?-Cipvsadm?-Ripvsadm?-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-addressipvsadm?-L|l?[options]ipvsadm?-Z?[-t|u|f?service-address]ipvsadm?--set?tcp?tcpfin?udpipvsadm?--start-daemon?state?[--mcast-interface?interface]?[--syncid?syncid]ipvsadm?--stop-daemon?stateipvsadm?-h2)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頁面設置的不一樣。
@@安裝服務:
@@設置路由:只留一個網卡并且將網關指向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?ens335)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??????????06)測試
在客戶端使用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?web27)結果分析
觀察訪問結果,我們發現,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??????????04)測試
[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?103)設置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筆者便簽
感謝您能讀到最后,如果這篇文章能讓你有所收獲,那將是我的榮幸,如果沒能幫到你,那就在送你一句話,與君共勉:If a thing is worth doing it is worth worth doing well ---- 事情值得做,就值得好好做。
轉載于:https://blog.51cto.com/vinsent/1975378
總結
以上是生活随笔為你收集整理的LVS实现web服务的负载均衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置kubernetes服务basic
- 下一篇: Servlet3.1规范翻译 - 应用生