Linux負載均衡雙機實現文件

蘭在晨發表於2014-02-15


安裝環境

環境配置

虛擬伺服器2臺:

Red Hat Enterprise Linux Server release 5.4  1C 記憶體:512M

應用伺服器:

Red Hat Enterprise Linux Server release 5.4  1C 記憶體:1G

Red Hat Enterprise Linux Server release 5.4  1C 記憶體:1G

 

VIP192.168.90.100

GATEWAY:192.168.90.200

Vserver1:192.168.90.220

Vserver2:192.168.90.221

 

RealServer1:192.168.90.223

RealServer2:192.168.90.224

 

 

系統架構

概念瞭解

         這在整個負載均衡+Ha的高可用架構中主要採用ipvsadmKeepAlived來實現。

1、  LVS

Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器叢集系統。本專案在19985月由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。目前有三種IP負載均衡技術(VS/NATVS/TUNVS/DR)八種排程演算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

2、  ipvsadm

IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連線的初始SYN報文到達時,IPVS就選擇一臺伺服器,將報文轉發給它。此後通過查發報文的IPTCP報文頭地址,保證此連線的後繼報文被轉發到相同的伺服器。這樣,IPVS無法檢查到請求的內容再選擇伺服器,這就要求後端的伺服器組是提供相同的服務,不管請求被送到哪一臺伺服器,返回結果都應該是一樣的。

3、  KeepAlived

keepalived是一個類似於layer3, 4 & 5交換機制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器當機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web伺服器。

實現架構

在上圖的結構中:

主要由ipvsadm負責分發資料實現負載均衡的作用,由keepalived檢測各應用伺服器是否正常工作,實現雙機高可用效能。

實現功能

通過該方案能夠實現WEB應用伺服器訪問的負載均衡功能,通過Virtual Server 的HA來保證負載均衡伺服器的高可用性。

 

使用LVS+KeepAlived的優缺點

1、  優點:整個架構完全開源免費,而且有很多相對比較標準活躍的論壇作為技術支撐

 

2、  缺點:功能簡單,缺少收費產品的服務,出現問題之後必須依靠自己來處理。

 

安裝ipvsadm

下載ipvsadm軟體

#lsmod|grep ip_vs

如果沒有則進行下面的安裝,ipvsadm軟體一般Linux系統光碟中都會自帶,或者從官方上下載(http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6

#uname –r

2.6.18-164.el5

檢視系統版本然後下載相應版本的ipvsadm

安裝ipvsadm

先為linux核心建立一個連線檔案,在配置ipvsadm時需要用到核心中的一些函式庫。

# ln -s /usr/src/kernels/2.6.18-164.el5 /  /usr/src/linux

#tar –zxvf ipvsadm-1.24.tar.gz

#cd ipvsadm-1.24

#configure

#make(這一步顯示成功之後再進行make install)

#make install

然後在命令列中敲入ipvsadm確認是否已經安裝成功

[root@wpg u01]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

如上則表明正確安裝了ipvsadm

 

 

安裝keepalived

下載keepalived

官網下載地址:http://www.keepalived.org/download.html

 

安裝kee

#tar zxvf keepalived-1.1.15.tar.gz

#cd keepalived-1.1.15

#./configure

Keepalived configuration

------------------------

Keepalived version : 1.1.15

Compiler : gcc

Compiler flags : -g -O2

Extra Lib : -lpopt -lssl -lcrypto

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

Use VRRP Framework : Yes

Use LinkWatch : Yes

Use Debug flags : No

執行完configure之後會出現上面的顯示結果,紅色標出部分為LVS所需服務狀態必須為YES

 

#make(這一步成功之後進行安裝)

#make install

安裝完成之後檢視一下是否安裝成功。

#find / -name keepalived  # 檢視keepalived位置以便於後面複製檔案

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

#chkconfig --add keepalived #設定為開啟啟動

#chkconfig keepalived on

到此keepalived也已經安裝完畢,後面我需要對其進行配置來實現,負載均衡+雙機的功能。

 

 

配置LVS

         這一步需要在做負載均衡的兩臺vserver上都要執行

編寫LVS配置指令碼

vi /usr/local/sbin/lvs-dr.sh

 

 #!/bin/bash

 # description: start LVS of DirectorServer

GW=192.168.90.254

 # website director vip.

 WEB_VIP=192.168.90.200

 WEB_RIP1=192.168.90.220

 WEB_RIP2=192.168.90.221

 . /etc/rc.d/init.d/functions

 

 logger $0 called with $1

 

 case "$1" in

 

 start)

         # Clear all iptables rules.

         /sbin/iptables -F

         # Reset iptables counters.

         /sbin/iptables -Z

         # Clear all ipvsadm rules/services.

         /sbin/ipvsadm -C

 

 #set lvs vip for dr

         /sbin/ipvsadm --set 30 5 60

         /sbin/ifconfig eth0:0 $WEB_VIP broadcast $WEB_VIP netmask 255.255.255.255 up

         /sbin/route add -host $WEB_VIP dev eth0:0

         /sbin/ipvsadm -A -t $WEB_VIP:80 -s wrr -p 3

         /sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP1:80 -g -w 1

         /sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP2:80 -g -w 1

         touch /var/lock/subsys/ipvsadm >/dev/null 2>&1

        

         # set Arp

         /sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW >/dev/null 2>&1

         /sbin/ipvsadm -ln

       ;;

 stop)

         /sbin/ipvsadm -C

         /sbin/ipvsadm -Z

         ifconfig eth0:0 down

         route del $WEB_VIP  >/dev/null 2>&1

         rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1

         /sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW

         echo "ipvsadm stoped"

        ;;

 

 status)

 

         if [ ! -e /var/lock/subsys/ipvsadm ];then

                 echo "ipvsadm is stoped"

                 exit 1

         else

                 ipvsadm -ln

                 echo "..........ipvsadm is OK."

         fi

       ;;

 

 *)

         echo "Usage: $0 {start|stop|status}"

         exit 1

 esac

 

 exit 0

#------------------------The end of the Scripts-------------------------------------------

 

 

指令碼編寫完成之後分別在分別在兩個節點上跑一次如果跑成功之後應該顯示如下結果:

[root@wpg u01]# ./lvsdr.sh status

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.90.100:80 wrr persistent 3

  -> 192.168.90.221:80            Route   1      0          0        

  -> 192.168.90.220:80            Local   1      0          0        

..........ipvsadm is OK.

192.168.90.100為我們設定的虛擬IP下面的兩個為Real ServerIP

這時候檢視系統IP會發現多了一個浮動IP地址。

eth0      Link encap:Ethernet  HWaddr 00:0C:29:18:CB:8D 

          inet addr:192.168.90.220  Bcast:192.168.90.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe18:cb8d/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:2973 errors:0 dropped:0 overruns:0 frame:0

          TX packets:10151 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:297588 (290.6 KiB)  TX bytes:533370 (520.8 KiB)

          Interrupt:67 Base address:0x2024

 

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:18:CB:8D 

          inet addr:192.168.90.100  Bcast:192.168.90.100  Mask:255.255.255.255

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:67 Base address:0x2024

到此我們就完成了負載均衡的配置。

 

 

配置KeepaLived

Vserver1端配置

編輯keepalived的配置檔案,在/etc/keepalived/目錄下

#vi /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

 

global_defs {

   router_id LVS_DEVEL

}

vrrp_sync_group lvs_1 {

           group {

                 VI_1

                 VI_GATEWAY

                   }

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.90.100

    }

}

 

vrrp_instance VI_GATEWAY {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

     }

     virtual_ipaddress {

         192.168.90.200

     }

}

 

virtual_server 192.168.100 80 {

    delay_loop 6

    lb_algo wlc

    lb_kind NAT

    nat_mask 255.255.255.0

    persistence_timeout 1200

    protocol TCP

 

    real_server 192.168.90.223 80 {

        weight 1

        inhibit_on_failure

        TCP_CHECK {

            connect_port 80

            connect_timeout 4

        }

    }

    real_server 192.168.90.224 80 {

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 4

 

        }

    }

}

 

#-----------------------The End-------------------

Vserver2配置

#vi /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

 

global_defs {

   router_id LVS_DEVEL

}

vrrp_sync_group lvs_1 {

           group {

                 VI_1

                 VI_GATEWAY

                   }

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.90.100

    }

}

 

vrrp_instance VI_GATEWAY {

    state BACKUP

    interface eth0

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

     }

     virtual_ipaddress {

         192.168.90.200

     }

}

 

virtual_server 192.168.100 80 {

    delay_loop 6

    lb_algo wlc

    lb_kind NAT

    nat_mask 255.255.255.0

    persistence_timeout 1200

    protocol TCP

 

    real_server 192.168.90. 223 80 {

        weight 1

        inhibit_on_failure

        TCP_CHECK {

            connect_port 80

            connect_timeout 4

        }

    }

    real_server 192.168.90.224 80 {

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 4

 

        }

    }

}

開啟IP轉發

分別在兩臺vserver伺服器的/etc/sysctl.conf檔案中新增如下配置:

 

net.ipv4.ip_forward=1

 

配置RealServer

配置IP轉發功能

每個web伺服器節點都需要進行配置

vim /etc/sysctl.conf

net.ipv4.ip_forward=1

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

配置閘道器

vim /etc/sysconfig/network-scripts/ifcfg-eth0新增

    GATEWAY172.168.90.200

service network restart

 

設定開啟啟動

將編寫的lvsdr.sh配置指令碼拷貝到/usr/local/sbin/目錄下,然後將下面兩個命令新增到/etc/rc.local檔案中這樣,就能在開機之後自動啟動LVS服務了。

/usr/local/sbin/lvsdr.sh start (把這條語句寫到/etc/rc.local中,開機啟動)

/etc/init.d/keepalived start  啟動keepalived 服務,keepalived就能利用keepalived.conf 配置檔案,實現負載均衡和高可用.

 

功能測試

負載均衡測試

 

 

雙機切換測試

 

壓力測試

 

 

 

LVS基本管理

啟動、關閉

1、  ipvsadm 的啟動和關閉

使用編寫的lvsdr.sh指令碼即可

#lvsdr.sh start  啟動

#lvsdr.sh stop 關閉

 

2、   keepalived的啟動和關閉

#/etc/init.d/keepalived start   啟動

#/etc/init.d/keepalived stop   關閉

 

檢視服務狀態

1、  ipvsadm的服務狀態

#ipvsadm -ln

2、  keepalived的服務狀態

#/etc/init.d/keepalived status

 

新增節點

#/sbin/ipvsadm -a -t $WEB_VIP:port -r $WEB_RIP2:port -g -w 1

通過該命令來新增節點 $WEB_VIP:port代表 虛擬伺服器的IP和埠,$WEB_RIP2:port

代表真實應用伺服器的IP和埠。

 

監控日誌

通過監控日誌來檢測服務資訊:

#tail –f /var/log/messages

 

 

LVSIP負載均衡

在下面我們主要介紹三種IP負載均衡技術的原理

VS/NAT

通過 NAT 實現虛    擬伺服器( VS/NAT )。

NAT 的工作原理是報文頭(目標地址、源地址和埠等) 被正確改寫後,客戶相信它們連線一個 IP 地址,而不同 IP 地址的伺服器組也認為它們是與客戶直接相連的。由此,可以用 NAT 方法將不同 IP 地址的並行網路服務變成在一個 IP 地址上的一個虛擬服務。

   

客戶通過 Virtual IP Address (虛擬服務的 IP 地址)訪問網路服務時,請求報文到達排程器,排程器根據連線排程演算法從一組真實伺服器中選出一臺伺服器,將報文的目標地址 Virtual IP Addres s改寫成選定伺服器的地址,報文的目標埠改寫成選定伺服器的相應埠,最後將修改後的報文傳送給選出的伺服器。同時,排程器在連線 Hash 表中記錄這個連線,當這個連線的下一個報文到達時,從連線 Hash 表中可以得到原選定伺服器的地址和埠,進行同樣的改寫操作,並將報文傳給原選定的伺服器。當來自真實伺服器的響應 報文經過排程器時,排程器將報文的源地址和源埠改為 Virtual IP Address 和相應的埠,再把報文發給使用者。我們在連線上引入一個 狀態機,不同的報文會使得連線處於不同的狀態,不同的狀態有不同的超時值。在 TCP 連線中,根據標準的 TCP 有限狀態機進行狀態遷移;在 UDP 中,我們只設定一個 UDP 狀態。不同狀態的超時值是可以設定的,在預設情況下, SYN 狀態的超時為 1 分鐘, ESTABLISHED 狀態的超時為15 分鐘, FIN 狀態的超時為 1 分鐘; UDP 狀態的超時為 5 分鐘。當連線終止或超時,排程器將這 個連線從連線 H ash 表中刪除。

   這樣,客戶所看到的只是在 Virtual IP Address 上提供的服務,而伺服器叢集的結構對使用者是透明的。

 

如下是我的測試環境:

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.130.200:80 wrr persistent 3

  -> 192.168.130.184:80           Route   1      0          0  

  -> 192.168.130.183:80           Route   1      0          0 

現在有一個web請求從客戶端:202.100.1.12380埠發出,這時排程器會把該請求均衡的分配到每個真實的伺服器,假設選擇了192.168.130.183這臺應用伺服器。這樣排程器(Vserver)收到的請求報文中源地址和目標地址為:

SOURCE             202.100.1.12380           DES                    192.168.130.200:80

這時排程器會選擇一臺這時伺服器來處理這個請求,該報文就會被改寫為:

SOURCE               202.100.1.12380           DES                    192.168.130.183:80

然後應用伺服器處理完請求之後,返回到排程器的報文為:

  SOURCE                192.168.130.183:80          DES                    202.100.1.12380

排程器會將響應的報文中的源地址改為虛擬VIP然後發給客戶端:

  SOURCE                192.168.130.200:80          DES                    202.100.1.12380

這樣就完成了一個請求和相應的過程。對client端來看這些都是不可見的,client會認為是VIP的伺服器處理並相應的請求。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26723566/viewspace-1081942/,如需轉載,請註明出處,否則將追究法律責任。

相關文章