天天看點

LVS實作負載均衡(Nat模式、DR模式)

LVS (linux virtual server)是實作叢集伺服器的一種開放源代碼軟體,LVS叢集采用IP負載均衡技術和基于内容請求分發技術.負載均衡器(Load Ba-lancer,LB)具有很好的吞吐率,将請求均衡地轉移到不同的伺服器上執行,且負載均衡器能自動屏蔽伺服器的故障,進而将一組伺服器建構成為一個高性能的、高可用的虛拟伺服器.整個伺服器叢集的結構對使用者是透明的,而且無需修改用戶端和伺服器端的程式。具有透明性、可伸縮性、高可用性和易管理性等優點。

LVS 叢集中實作的三種IP 負載均衡技術,

1、Virtual Server via Network Address Translation (VS/NAT): 也有說端口映射的,其目标是将一組伺服器構成一個高性能的、高可用的虛拟伺服器。因為這種技術容易形成單點故障,進而造成網路無法通路,并且存在帶寬瓶頸,最多可以有10個伺服器節點。

<a href="http://blog.51cto.com/attachment/201212/182031579.jpg" target="_blank"></a>

2、Virtual Server via Direct Routing (VS/DR) :直接路由實作虛拟伺服器的方法(負載能力最強),通過改寫請求封包的 M AC 位址,将請求發送到真實伺服器,而真實伺服器将響應直接傳回給客戶,VS/DR技術可極大地提高叢集系統的伸縮性,這種方法沒有 IP隧道的開銷,但是要求排程器與真實伺服器都有一塊網卡連在同一實體網段上,并且也解決了NAT模式産生的瓶頸問題,可以有大量的節點,最多可以有100個伺服器節點。

<a href="http://blog.51cto.com/attachment/201212/182043610.jpg" target="_blank"></a>

3、Virtual Server via IP Tunneling (VS/TUN ): 通過IP 隧道實作虛拟服務。排程器把請求封包通過 IP 隧道轉發至真實伺服器,而真實伺服器将響應直接傳回給客戶,排程器隻處理請求封包,由于一般網絡服務應答比請求封包大許多,采用VS/TUN技術後,系統的最大吞吐量可以提高 10倍。

<a href="http://blog.51cto.com/attachment/201212/182055927.jpg" target="_blank"></a>

負載均衡叢集的架構

負載均衡的解決方案中,若幹台伺服器做同樣的工作,這樣一來以前由一台伺服器來做的工作已經配置設定給多個伺服器來做, 整個系統的處理能力得以提高。 在整個負載均衡叢集中由負載均衡器、真實伺服器組和共享存儲三部分構成。

1) Load Balancer(負載均衡器)

Load Balancer 是整個叢集系統的前端 , 負責把客戶請求通過特定的排程算法轉發到 Real Server 上。 Backup 是備份Load Balancer,當Load Balancer 不可用時接替它 , 成為實際的 Load Balancer。 Load Bal-ancer 通過 Ldirectord 監測各 Real Server 的健康狀況。 在 Real Server 不可用時把它從群中剔除,恢複時重新加入。

2) Server Array(真實伺服器組)

Server Array 是一組運作實際應用服務的機器,比如 WEB,Mail,FTP,DNS,Media 等等 。 在實際應用中 ,Load Balancer和 Backup 也可以兼任Real Server 的角色。

3) Shared Storage(共享存儲)

Shared Storage 為所有 Real Server 提供共享存儲空間和一緻的資料内容。

目前,Linux 平台下的叢集軟體有很多,其中 Linux Virtual Server(LVS)最為流行。 LVS 安裝在負載均衡器上,使用虛拟 IP 位址對外服務,當接受到客戶請求後它根據特定的排程算法将客戶機請求轉發到選擇的真實伺服器,LVS 支援的排程算法如下。

固定算法:

1) rr循環(Round Robin)

排程器通過“輪叫”排程算法将外部請求按順序輪流配置設定到叢集中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接配接數和系統負載。

2) wrr 權重循環(Weighted Round Robin)

排程器通過“權重輪叫”排程算法根據真實伺服器的不同處理能力來排程通路請求。 這樣可以保證處理能力強的伺服器處理更多的通路流量。 排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。

3) dh 目标位址散列(Destination Hashing)

目标位址散列排程算法根據請求的目标 IP 位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。

4) sh 源位址散列(Source Hashing)

源位址散列排程算法根據請求的源 IP 位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。

動态算法:

1) lc 最少連結(Least Connections)

排程器通過“最少連接配接”排程算法動态地将網絡請求排程到已建立的連結數最少的伺服器上。 如果叢集系統的真實伺服器具有相近的系統性能,采用“最小連接配接”排程算法可以較好地均衡負載。

2) wlc 權重最少連結(Weighted Least Connections)

在叢集系統中的伺服器性能差異較大的情況下,排程器采用“權重最少連結”排程算法優化負載均衡性能,具有較高權值的伺服器将承受較大比例的活動連接配接負載。 排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。

3) lblc 基于局部性的最少連結(Locality-Based Least Connections)基于局部性的“最少連結”排程算法是針對目标 IP 位址的負載均衡,目前主要用于 Cache 叢集系統。 該算法根據請求的目标 IP位址找出該目标 IP 位址最近使用的伺服器,若該伺服器是可用的且沒有超載,将請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處于一半的工作負載,則用“最少連結”的原則選出一個可用的伺服器,将請求發送到該伺服器。

4) lblcr 帶複制的基于局部性最少連結(Locality-Based Least Connections with Replication)

帶複制的基于局部性“最少連結”排程算法也是針對目标 IP 位址的負載均衡,目前主要用于 Cache 叢集系統。 它與 LBLC算法的不同之處是它要維護從一個目标 IP 位址到一組伺服器的映射,而 LBLC 算法維護從一個目标 IP 位址到一台伺服器的映射。 該算法根據請求的目标 IP 位址找出該目标 IP 位址對應的伺服器組,按“最小連接配接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器,若伺服器超載;則按“最小連接配接”原則從這個叢集中選出一台伺服器,将該伺服器加入到伺服器組中,将請求發送到該伺服器。 同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。

5)SED:最少的期望權值 隻考慮active激活的連接配接,不考慮inactive連接配接。計算方法:(active+1)*256

6)NQ:永不排隊 若果某個節點未處于活動連接配接,就将下一個請求發送給該節點進行處理

案例1

案例要求:如下圖所示,外網使用者直接通路Director上的VIP位址192.168.2.2,使用網絡位址轉換(即VS/NAT 技術)director将請求分派給下面兩台realserver ,配置設定使用RR輪循排程算法和WRR權重輪循排程算法

<a href="http://blog.51cto.com/attachment/201212/181957761.jpg" target="_blank"></a>

1、檢查是否核心中已經加載了ip_vs相關的子產品

[root@localhost ~]# grep -i ip_vs /boot/config-2.6.18-164.el5

CONFIG_IP_VS=m

# CONFIG_IP_VS_DEBUG is not set

CONFIG_IP_VS_TAB_BITS=12

CONFIG_IP_VS_PROTO_TCP=y

CONFIG_IP_VS_PROTO_UDP=y

CONFIG_IP_VS_PROTO_ESP=y

CONFIG_IP_VS_PROTO_AH=y

CONFIG_IP_VS_RR=m

CONFIG_IP_VS_WRR=m

CONFIG_IP_VS_LC=m

CONFIG_IP_VS_WLC=m

CONFIG_IP_VS_LBLC=m

CONFIG_IP_VS_LBLCR=m

CONFIG_IP_VS_DH=m

CONFIG_IP_VS_SH=m

CONFIG_IP_VS_SED=m

CONFIG_IP_VS_NQ=m

CONFIG_IP_VS_FTP=m

2、安裝ipvsadm管理工具

[root@localhost ~]# mount -a

mount: block device /dev/cdrom is write-protected, mounting read-only

[root@localhost ~]# cd /media/cdrom/Cluster

[root@localhost Cluster]# ll ipvs*

-r--r--r-- 78 root root 32142 2009-07-29 ipvsadm-1.24-10.i386.rpm

[root@localhost Cluster]# rpm -ivh ipvsadm-1.24-10.i386.rpm

Preparing...                ########################################### [100%]

  1:ipvsadm                ########################################### [100%]

3、檢視ipvsadm的相關檔案

<a href="http://blog.51cto.com/attachment/201212/181651179.jpg" target="_blank"></a>

4、啟動ipvsadm管理服務,

<a href="http://blog.51cto.com/attachment/201212/181700407.jpg" target="_blank"></a>

發現無法啟動,因為還沒有在/etc/sysconfig/産生規則檔案ipvsadm。

5、檢視ipvsadm配置的幫忙文檔,定義服務,添加伺服器

[root@localhost ~]# ipvsadm -A -t 192.168.2.2:80  -srr //添加一個伺服器,并指定排程算法

注:-r --real-server ;-m:Use masquerading or nat

[root@localhost ~]# ipvsadm -a -t 192.168.2.2:80 -r 192.168.3.100 -m

[root@localhost ~]# ipvsadm -a -t 192.168.2.2:80 -r 192.168.3.200 -m

6、儲存配置的規則

<a href="http://blog.51cto.com/attachment/201212/181719535.jpg" target="_blank"></a>

7、因使用了nat,打開資料包轉發功能,

# vim /etc/sysctl.conf

7 net.ipv4.ip_forward = 1

# sysctl -p

8、在兩台realserver上分别配置web服務,将網關指向Director的DIP位址192.168.2.2,外網pc通路VIP,如下圖:

<a href="http://blog.51cto.com/attachment/201212/181758686.jpg" target="_blank"></a>

重新整理一下,兩網站間循環:

<a href="http://blog.51cto.com/attachment/201212/181806919.jpg" target="_blank"></a>

9、更改排程算法為wrr

# ipvsadm -E  -t 192.168.2.2:80  -s wrr

# ipvsadm -e -t 192.168.2.2:80 -r 192.168.3.100 -m -w 10

# ipvsadm -e -t 192.168.2.2:80 -r 192.168.3.200 -m -w 5

10、儲存規則,

service ipvsadm save

11、測試時,

再次通路,将會出現兩次web1,一次web2站點,這是由于realserver1的權重是realserver2的2倍。

案例2

如圖所示,director上的網卡eth0:0上配置VIP位址,eth0上配置DIP位址,外網使用者通過交換機通路到director的VIP,然後director通過DIP将請求發送至兩台realserver,然後兩台realserver 通過右側交換機到存儲伺服器上查找網頁,在将結果直接通過左側的交換機傳回給客戶機,繞開了director。

<a href="http://blog.51cto.com/attachment/201212/161145263.jpg" target="_blank"></a>

案例配置

1、director負載均衡器配置:

[root@director ~]# ipvsadm -At 192.168.2.254:80 -s rr

[root@director ~]# ipvsadm -at 192.168.2.254:80 -r 192.168.2.10 -g

[root@director ~]# ipvsadm -at 192.168.2.254:80 -r 192.168.2.20 -g

[root@director ~]# service ipvsadm save    //儲存配置

[root@director ~]# service ipvsadm start    //啟動服務

2、server1、server2配置相同(下例為server1配置):

#解決arp不響應的問題(對arp相關項的修改也是臨時性的,重新開機系統後消失)

[root@server1 ~]# sysctl -a |grep arp

net.ipv4.conf.eth0.arp_ignore = 0

net.ipv4.conf.eth0.arp_announce = 0

将arp_announce的值改為2,将arp_ignore的值改為為1

臨時修改:

[root@server1 ~]# echo 1 &gt;  /proc/sys/net/ipv4/conf/lo/arp_ignore   //隻回答目标IP位址是來訪網絡接口本地位址的ARP查詢請求

[root@server1 ~]# echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce  //對查詢目标使用最适當的本地位址

[root@server1 ~]# echo 1 &gt;  /proc/sys/net/ipv4/conf/all/arp_ignore

[root@server1 ~]# echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce

永久修改上面arp的不響應的問題,

#echo "net.ipv4.conf.eth0.arp_announce = 2" &gt;&gt; /etc/sysctl.conf

#echo "net.ipv4.conf.all.arp_announce = 2" &gt;&gt; /etc/sysctl.conf

#echo "net.ipv4.conf.eth0.arp_ignore = 1" &gt;&gt; /etc/sysctl.conf

#echo "net.ipv4.conf.all.arp_ignore = 1" &gt;&gt; /etc/sysctl.conf

#sysctl -p   重新加載檔案,使配置生效    

注:server2可以直接執行scp指令來拷貝syerver的配置檔案,

    #scp /etc/sysctl.conf  192.168.2.20:/etc/

[root@server1 ~]# ifconfig lo:0 192.168.2.254 netmask 255.255.255.255   //lo:0的位址

#添加一條路由

[root@server1 ~]# route add -host 192.168.2.254 dev  lo:0

注:

通過ifconfig、route修改的并沒有寫入配置檔案,重新開機網絡後就失效了。

可以通過下列方式添加強定ip,

<a href="http://blog.51cto.com/attachment/201212/161213872.jpg" target="_blank"></a>

測試

# ipvsadm -Ln或通過 watch -n 1 "ipvsadm -Ln"動态檢視負載情況

<a href="http://blog.51cto.com/attachment/201212/161224482.jpg" target="_blank"></a>

重新整理一次,以rr排程算法實作輪循,顯示sever2的網頁内容。

<a href="http://blog.51cto.com/attachment/201212/161232798.jpg" target="_blank"></a>

對于web伺服器而言已經實作了負載均衡,但其網頁内容來自不同的伺服器,當然如果是靜态網頁可以直接通過拷貝的方式就可以了,而對于動态網頁呢,就不是一件容易的事了,下面我們就借助NFS來實作群集伺服器中共享存儲的概念,使每個伺服器通路的資源均來自共享存儲伺服器。

NFS伺服器設定:

通過nfs來實作自動挂載

#mkdir /abc      //建立網站主目錄

#echo “this is web1 &amp;&amp; web2” &gt; index.html

vim /etc/exports

/abc  *(ro)

#service nfs  start   //啟動nfs服務

1、設定開機自動挂載

server1與server2相同配置,

#vim /etc/fstab        //編輯開機自動挂載

192.168.3.1:/abc        /var/www/html           nfs     defaults,soft,intr 0 0

#mount -a

并用mount檢視是否正常挂載

<a href="http://blog.51cto.com/attachment/201212/161604204.jpg" target="_blank"></a>

通過通路director的VIP,直接通路到了放置在(NFS)存儲器上的網頁檔案,

<a href="http://blog.51cto.com/attachment/201212/161633204.jpg" target="_blank"></a>

動态檢視負載均衡的比對情況(可以實作輪循):

<a href="http://blog.51cto.com/attachment/201212/161646353.jpg" target="_blank"></a>

2、實作了開機自動挂載,為了避免占用網絡資源,可以通過auofs服務來控制,實作自動挂載,當無用時,自動斷開連接配接。

server1與server2配置相同

1)編譯/etc/auto.master檔案,做如下添加:

<a href="http://blog.51cto.com/attachment/201212/161659906.jpg" target="_blank"></a>

2)編輯/etc/html.misc檔案

[root@server1 var]# vim /etc/html.misc

html  -fstype=nfs,soft,intr  192.168.3.1:/abc

3)啟動autofs服務。

4)同樣通路director的VIP,直接通路到了放置在(NFS)存儲器上的網頁檔案,并且60秒,若無連接配接,則伺服器會自動解除安裝掉/abc目錄。

本文轉自 劉園  51CTO部落格,原文連結:http://blog.51cto.com/colynn/1101174

繼續閱讀