常用的負載均衡開源軟體有: nginx、lvs、keepalived
商業的硬體負載裝置: F5、Netscale
1、 LB、LVS介紹
LB叢集是load balance 叢集的簡寫,翻譯成中文就是負載均衡叢集;
LVS是一個實作負載均衡叢集的開源軟體項目;
LVS架構從邏輯上可分為排程層(Director)、server叢集層(Real server)和共享存儲層;
LVS可分為三種工作模式:
NAT(排程器将請求的目标ip即vip位址改為Real server的ip, 傳回的資料包也經過排程器,排程器再把源位址修改為vip)
TUN(排程器将請求來的資料包封裝加密通過ip隧道轉發到後端的real server上,而real server會直接把資料傳回給用戶端,而不再經過排程器)
DR(排程器将請求來的資料包的目标mac位址改為real server的mac位址,傳回的時候也不經過排程器,直接傳回給用戶端)
LVS的排程算法:輪叫排程(Round Robin)(簡稱rr) ,權重輪叫(Weighted Round Robin)(簡稱wrr),最少連結(least connection)(LC),權重最少連結(Weighted Least Connections)(WLC) 等等;
2、LVS/NAT 配置
準備工作:
需要準備三台機器幹淨的centos6.6系統,Director機器需要安裝兩塊網卡;
三台伺服器一台作為director, 兩台作為real server
Director 有一個外網ip:192.168.22.11 和一個内網ip:192.168.11.11
兩台Real Server 隻有内網ip為:192.168.11.100 和 192.168.11.101,并且需要設定内網網關為director的内網ip:192.168.11.11
1
2
3
4
5
6
<code>DEVICE=eth1 </code>
<code>TYPE=Ethernet</code>
<code>ONBOOT=</code><code>yes</code>
<code>BOOTPROTO=static</code>
<code>IPADDR=192.168.11.100</code>
<code>GATEWAY=192.168.11.11</code>
更改完網關後需要重新開機網卡,先down後up,在一條指令實作;如果ifdown之後,ssh會中斷;
# ifdown eth1 && ifup eth1
Director上安裝ipvsadm:#yum install -y ipvsadm
兩台real server安裝nginx,需要先安裝epel擴充源。
yum install -y epel-release
yum install -y nginx
安裝完成後啟動nginx:/etc/init.d/nginx start
更改三台伺服器的hostname為 dr、rs1、rs2
Direcotr 上 vi /usr/local/sbin/lvs_nat.sh //增加如下内容:
7
8
9
10
11
12
13
14
15
16
17
18
<code>#! /bin/bash</code>
<code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/ip_forward</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/all/send_redirects</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/default/send_redirects</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/eth0/send_redirects</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/eth1/send_redirects</code>
<code>iptables -t nat -F</code>
<code>iptables -t nat -X</code>
<code>iptables -t nat -A POSTROUTING -s 192.168.11.0</code><code>/24</code> <code>-j MASQUERADE</code>
<code>IPVSADM=</code><code>'/sbin/ipvsadm'</code>
<code>$IPVSADM -C</code>
<code>$IPVSADM -A -t 192.168.22.11:80 -s wlc</code>
<code>$IPVSADM -a -t 192.168.22.11:80 -r 192.168.11.100:80 -m -w 2</code>
<code>$IPVSADM -a -t 192.168.22.11:80 -r 192.168.11.101:80 -m -w 1</code>
直接運作這個腳本就可以完成lvs/nat的配置了:
/bin/bash /usr/local/sbin/lvs_nat.sh
dr檢視nat的iptables
<code>[root@dr ~]</code><code># iptables -t nat -nvL</code>
<code>Chain POSTROUTING (policy ACCEPT 1 packets, 124 bytes)</code>
<code> </code><code>pkts bytes target prot opt </code><code>in</code> <code>out </code><code>source</code> <code>destination </code>
<code> </code><code>0 0 MASQUERADE all -- * * 192.168.11.0</code><code>/24</code> <code>0.0.0.0</code><code>/0</code>
ipvsadm -ln 檢視ipvsadm的規則
浏覽器打開192.168.11.100、192.168.11.101顯示nginx的歡迎頁面
<a href="http://s3.51cto.com/wyfs02/M02/6E/22/wKioL1V1B5SCgG6RAALQ60a_4kg748.jpg" target="_blank"></a>
在rs1、rs2上面修改html檔案,用來區分;
<code>[root@rs1 ~]</code><code># cat /usr/share/nginx/html/index.html</code>
<code> </code><code>rs1rs1rs1</code>
<code>[root@rs2 ~]</code><code># cat /usr/share/nginx/html/index.html</code>
<code> </code><code>rs2rs2rs2</code>
通過浏覽器測試兩台機器上的内容
浏覽器打開 192.168.22.11,會顯示rs1或rs2的html内容;來回切換說明試驗OK;
更改輪詢規則為wlc,權重為2,進行測試
<a href="http://s3.51cto.com/wyfs02/M01/6E/22/wKioL1V1CHSizVU2AADW4nTQIGk933.jpg" target="_blank"></a>
用另一台linux機器curl測試,出現2次1,1次2,來回切換說明OK;
<code>[root@localhost ~]</code><code># curl 192.168.22.11</code>
<code>rs1rs1rs1</code>
<code>rs2rs2rs2</code>
在dr機器上ipvsadm -ln可以檢視,權重比,保持的連結比大概一樣;
<code> </code><code>-> RemoteAddress:Port Forward Weight ActiveConn InActConn</code>
<code>TCP 192.168.22.11:80 wlc</code>
<code> </code><code>-> 192.168.11.100:80 Masq 2 0 26 </code>
<code> </code><code>-> 192.168.11.101:80 Masq 1 0 13</code>
3、LVS/DR 配置
DR模式中,director隻負責分發,隻有進入的流量,吞吐量會非常大;real server直接給使用者提供資料,安全性會降低;
DR中的機器都需要配置公網ip,虛拟的ip每台機器都需要配置,使用者請求的時候請求虛拟ip,傳回的時候為輪詢rs提供;
三台機器,每台機器隻需要配置1個ip,vip是用腳本執行後會出現的,不用手動設定;
director(eth1:192.168.11.11 vip eth1:0 192.168.11.110)
real server1(eth1:192.168.11.100 vip lo:0: 192.168.11.110)
real server1(eth1:192.168.11.101 vip lo:0: 192.168.11.110)
Director 上 vim /usr/local/sbin/lvs_dr.sh //增加下面的内容
<code>ipv=</code><code>/sbin/ipvsadm</code>
<code>vip=192.168.11.110</code>
<code>rs1=192.168.11.100</code>
<code>rs2=192.168.11.101</code>
<code>ifconfig</code> <code>eth1:0 $vip broadcast $vip netmask 255.255.255.255 up</code>
<code>route add -host $vip dev eth1:0</code>
<code>$ipv -C</code>
<code>$ipv -A -t $vip:80 -s rr</code>
<code>$ipv -a -t $vip:80 -r $rs1:80 -g -w 1</code>
<code>$ipv -a -t $vip:80 -r $rs2:80 -g -w 1</code>
兩台rs上:vim /usr/local/sbin/lvs_dr_rs.sh
<code>ifconfig</code> <code>lo:0 $vip broadcast $vip netmask 255.255.255.255 up</code>
<code>route add -host $vip lo:0</code>
<code>echo</code> <code>"1"</code> <code>></code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>
<code>echo</code> <code>"2"</code> <code>></code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>
<code>echo</code> <code>"1"</code> <code>></code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>
<code>echo</code> <code>"2"</code> <code>></code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>
然後director上執行: bash /usr/local/sbin/lvs_dr.sh
兩台rs上執行: bash /usr/local/sbin/lvs_dr_rs.sh
執行完成後ifconfig可以顯示虛拟ip位址;dr顯示eth1:0,rs1、rs2顯示lo:0;
<code>eth1:0 Link encap:Ethernet HWaddr 00:0C:29:70:4E:58 </code>
<code> </code><code>inet addr:192.168.11.110 Bcast:192.168.11.110 Mask:255.255.255.255</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</code>
<code> </code><code>Interrupt:18 Base address:0x2080 </code>
<code> </code>
<code>lo:0 Link encap:Local Loopback </code>
<code> </code><code>inet addr:192.168.11.110 Mask:255.255.255.255</code>
<code> </code><code>UP LOOPBACK RUNNING MTU:65536 Metric:1</code>
ipvsadm -ln 列出規則
<code>[root@dr ~]</code><code># ipvsadm -ln</code>
<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code> </code><code>-> RemoteAddress:Port Forward Weight ActiveConn InActConn</code>
<code>TCP 192.168.11.110:80 rr</code>
<code> </code><code>-> 192.168.11.100:80 Route 1 0 3 </code>
<code> </code><code>-> 192.168.11.101:80 Route 1 0 3</code>
單獨啟動一台linux機器進行測試,浏覽器測試有緩存不明顯;
curl 192.168.11.110 進行測試,各出現1次說明rr輪詢規則OK;
<code>[root@localhost ~]</code><code># curl 192.168.11.110</code>
更改輪詢算法為wrr,權重為2;然後執行檔案,報錯提示檔案已存在;原因是/usr/local/sbin/lvs_dr.sh腳本檔案裡面已經up了eth1:0,是以需要在腳本裡面增加:ifconfig eth1:0 down,之後就不會報錯;
<code>$ipv -A -t $vip:80 -s wrr</code>
<code>$ipv -a -t $vip:80 -r $rs1:80 -g -w 2</code>
<code>[root@dr ~]</code><code># bash /usr/local/sbin/lvs_dr.sh</code>
<code>SIOCADDRT: 檔案已存在</code>
其中一台rs如果挂了之後,還是會輪詢通路,是以會出現一會能打開一會打不開;
模拟,rs2停止nginx:/etc/init.d/nginx stop
使用curl測試,請求還是會發送到rs2上面,但是已經提示不能連接配接到主機;
<code>curl: (7) couldn't connect to host</code>
lvs本身不會剔除已經死掉的real server,是以需要結合keeplived;
本文轉自 模範生 51CTO部落格,原文連結:http://blog.51cto.com/mofansheng/1659585,如需轉載請自行聯系原作者