天天看點

linux下lvs搭建負載均衡叢集

常用的負載均衡開源軟體有: 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 &amp;&amp; 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 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/all/send_redirects</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/default/send_redirects</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/eth0/send_redirects</code>

<code>echo</code> <code>0 &gt; </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>-&gt; RemoteAddress:Port       Forward Weight ActiveConn InActConn</code>

<code>TCP  192.168.22.11:80 wlc</code>

<code>  </code><code>-&gt; 192.168.11.100:80            Masq   2      0          26        </code>

<code>  </code><code>-&gt; 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>&gt;</code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>echo</code> <code>"2"</code> <code>&gt;</code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>echo</code> <code>"1"</code> <code>&gt;</code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>echo</code> <code>"2"</code> <code>&gt;</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>-&gt; RemoteAddress:Port      Forward Weight ActiveConn InActConn</code>

<code>TCP  192.168.11.110:80 rr</code>

<code>  </code><code>-&gt; 192.168.11.100:80       Route    1          0         3         </code>

<code>  </code><code>-&gt; 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,如需轉載請自行聯系原作者

繼續閱讀