天天看點

LVS 機制與排程算法(詳細)

轉載:https://blog.csdn.net/moonpure/article/details/52839132

LVS之一:三種工作模式的優缺點比較(NAT/TUN/DR)

一、Virtual server via NAT(VS-NAT) 優點:

叢集中的實體伺服器可以使用任何支援TCP/IP作業系統,實體伺服器可以配置設定Internet的保留私有位址,隻有負載均衡器需要一個合法的IP位址。

缺點:

擴充性有限。當伺服器節點(普通PC伺服器)資料增長到20個或更多時,負載均衡器将成為整個系統的瓶頸,因為所有的請求包和應答包都需要經過負載均衡器再生。假使TCP包的平均長度是536位元組的話,平均包再生延遲時間大約為60us(在Pentium處理器上計算的,采用更快的處理器将使得這個延遲時間變短),負載均衡器的最大容許能力為8.93M/s,假定每台實體伺服器的平台容許能力為400K/s來計算,負責均衡器能為22台實體伺服器計算。

解決辦法:

即使是是負載均衡器成為整個系統的瓶頸,如果是這樣也有兩種方法來解決它。一種是混合處理,另一種是采用Virtual Server via IP tunneling或Virtual Server via direct routing。如果采用混合處理的方法,将需要許多同屬單一的RR DNS域。你采用Virtual Server via IP tunneling或Virtual Server via direct routing以獲得更好的可擴充性。也可以嵌套使用負載均衡器,在最前端的是VS-Tunneling或VS-Drouting的負載均衡器,然後後面采用VS-NAT的負載均衡器。

二、Virtual server via IP tunneling(VS-TUN)

我們發現,許多Internet服務(例如WEB伺服器)的請求包很短小,而應答包通常很大。

負載均衡器隻負責将請求包分發給實體伺服器,而實體伺服器将應答包直接發給使用者。是以,負載均衡器能處理很巨大的請求量,這種方式,一台負載均衡能為超過100台的實體伺服器服務,負載均衡器不再是系統的瓶頸。使用VS-TUN方式,如果你的負載均衡器擁有100M的全雙工網卡的話,就能使得整個Virtual Server能達到1G的吞吐量。

不足:

但是,這種方式需要所有的伺服器支援"IP Tunneling"(IP Encapsulation)協定,我僅在Linux系統上實作了這個,如果你能讓其它作業系統支援,還在探索之中。

三、Virtual Server via Direct Routing(VS-DR)

和VS-TUN一樣,負載均衡器也隻是分發請求,應答包通過單獨的路由方法傳回給用戶端。與VS-TUN相比,VS-DR這種實作方式不需要隧道結構,是以可以使用大多數作業系統做為實體伺服器,其中包括:Linux 2.0.36、2.2.9、2.2.10、2.2.12;Solaris 2.5.1、2.6、2.7;FreeBSD 3.1、3.2、3.3;NT4.0無需打更新檔;IRIX 6.5;HPUX11等。

不足:要求負載均衡器的網卡必須與實體網卡在一個實體段上

LVS 機制與排程算法(詳細)

LVS之二:負載均衡排程算法

前面的文章介紹了

LVS的三種模式

:NAT、TUN、DR,那這三種模式下,如果進行負載均衡排程計算呢?這就涉及到新的知識點:

負載均衡排程算法

目前LVS主要有三種請求轉發方式和10種排程算法。根據請求轉發方式的不同,所構架叢集的網絡拓撲、安裝方式、性能表現也各不相同。用LVS主要可以架構三種形式的叢集,分别是LVS/NAT、LVS/TUN和LVS/DR,可以根據需要選擇其中一種。在標明轉發方式的情況下,采用哪種排程算法将決定整個負載均衡的性能表現,不同的算法适用于不同的應用場合,有時可能需要針對特殊場合,自行設計排程算法。LVS的算法是逐漸豐富起來的,最初LVS隻提供4種排程算法,後來發展到以下10種。

一、靜态排程算法: 1.1 輪叫排程(Round Robin,RR)

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

1.2 權重輪叫(Weighted Round Robin,WRR)

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

1.3 目标位址散列(Destination Hashing,DH)

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

主要用于緩存伺服器的場景。 1.4 源位址散列(Source Hashing,SH)

“源位址散列"排程算法根據請求的源IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。在沒有使用session共享的又需要儲存session的環境下(如電子商務網站),建議使用此算法。

二、動态排程算法: 2.1 最少連結(Least Connections,LC)

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

active*256+inactive

然後挑選伺服器中上述值最小者配置設定新連接配接。

2.2 權重最少連結(Weighted Least Connections,WLC)

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

(active*256+inactive)/weight

然後挑選伺服器根據上述方法計算數字最小者配置設定新連接配接。

2.3 基于局部性的最少連結(Locality-Based Least Connections,LBLC)

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

類似于DH算法,不同的是,其結合了DH算法和LC算法的優勢。

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

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

2.5 最短的期望的延遲(Shortest Expected Delay Scheduling,SED)

“最短的期望的延遲”是基于WLC算法的,隻是其計算方法不同。具體算法如下:

(active+1)*256/weight

2.6 最少隊列(Never Queue Scheduling,NQ)

無需隊列。如果有台 realserver的連接配接數=0就直接配置設定過去,不需要在進行SED運算。如果沒有伺服器連接配接數為空閑,則使用SED算法。

了解這些算法原理能夠在特定的應用場合選擇最适合的排程算法,進而盡可能地保持Real Server的最佳利用性。

LVS之三:ipvsadm常用管理指令介紹

LVS全稱為Linux Virtual Server,工作在ISO模型中的第四層,由于其工作在第四層,是以與iptables類似,必須工作在核心空間上。是以lvs與iptables一樣,是直接工作在核心中的,叫ipvs,主流的linux發行版預設都已經內建了ipvs,是以使用者隻需安裝一個管理工具ipvsadm即可。

檢視核心是否已經內建ipvs:

[root@lvs ~]# grep -i "ip_vs" /boot/config-2.6.32-358.18.1.el6.x86_64

CONFIG_IP_VS=m

CONFIG_IP_VS_IPV6=y

# 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_AH_ESP=y

CONFIG_IP_VS_PROTO_ESP=y

CONFIG_IP_VS_PROTO_AH=y

CONFIG_IP_VS_PROTO_SCTP=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

一、安裝ipvsadm:

[root@lvs ~]# yum -y install ipvsadm

二、ipvsadm基本介紹: 2.1 叢集服務管理類指令: 2.1.1 添加叢集:

# ipvs -A -t|u|f service-address [-s scheduler]

選項說明:

-t: TCP協定的叢集

-u: UDP協定的叢集

service-address:     IP:PORT

-f: FWM: 防火牆标記

service-address: Mark Number

示例:

[root@lvs ~]# ipvsadm -A -t 172.16.1.253:80 -s wlc

2.1.2 修改叢集:

# ipvs -E -t|u|f service-address [-s scheduler]

[root@lvs ~]# ipvsadm -E -t 172.16.1.253:80

-s wrr 2.1.3 删除叢集:

# ipvsadm -D -t|u|f service-address

[root@lvs ~]# ipvsadm -D -t 172.16.1.253:80

2.2 管理叢集中的RealServer: 2.2.1 添加RS:

# ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-t|u|f service-address:事先定義好的某叢集服務

-r server-address: 某RS的位址,在NAT模型中,可使用IP:PORT實作端口映射;

[-g|i|m]: LVS類型

-g: DR

-i: TUN

-m: NAT

[-w weight]: 定義伺服器權重

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.101 –g -w 5

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.102 –g -w 10

2.2.2 修改RS:

# ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

[root@lvs ~]# ipvsadm

-e

-t 172.16.1.253:80 -r 172.16.1.101 –g -w

3 2.2.3 删除RS:

# ipvsadm -d -t|u|f service-address -r server-address

[root@lvs ~]# ipvsadm -d -t 172.16.1.253:80 -r 172.16.1.101

2.3 檢視類:

# ipvsadm -L|l [options]

常用選項[options]如下:

-n: 數字格式顯示主機位址和端口

--stats:統計資料

--rate: 速率

--timeout: 顯示tcp、tcpfin和udp的會話逾時時長

-c: 顯示目前的ipvs連接配接狀況

2.4 其他管理類: 2.4.1 删除所有叢集服務:

# ipvsadm -C

該指令與iptables的-F功能類似,執行後會清除所有規則。

2.4.2 儲存規則 儲存規則至預設配置檔案:

# service ipvsadm save

儲存規則至指定檔案:

# ipvsadm -S > /path/to/somefile

[root@lvs ~]# service ipvsadm save

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [确定]

2.4.3 載入儲存在檔案中的規則

# ipvsadm -R < /path/form/somefile

三、lvs的其他注意事項:

關于時間同步:各節點間的時間偏差不大于1s,建議使用統一的ntp伺服器進行更新時間;

DR模型中的VIP的MAC廣播問題:

在DR模型中,由于每個節點均要配置VIP,是以存在VIP的MAC廣播問題,在現在的linux核心中,都提供了相應kernel 參數對MAC廣播進行管理,具體如下:

arp_ignore: 定義接收到ARP請求時的響應級别;

0:隻要本地配置的有相應位址,就給予響應;

    1:僅在請求的目标位址配置在到達的接口上的時候,才給予響應;DR模型使用 arp_announce:定義将自己位址向外通告時的通告級别;

0:将本地任何接口上的任何位址向外通告;

1:試圖僅向目标網絡通告與其網絡比對的位址;

    2:僅向與本地接口上位址比對的網絡進行通告;DR模型使用

LVS之四:DR模型實作

試驗拓撲:
LVS 機制與排程算法(詳細)
LVS 機制與排程算法(詳細)
然後啟動各虛拟機,按上述拓撲規劃配置好IP位址。 1.2 配置路由器(linux):

使用iptables實作NAT配置較為簡單,主要如下:

1.2.1 開啟轉發功能:

[root@router ~]# echo 1 >/proc/sys/net/ipv4/ip_forward

如果需永久修改,則需要修改sysctl.conf檔案。并使用sysctl -p 使其立即生效。

1.2.2 配置iptables: 清除所有規則:

[root@router ~]# iptables –F

配置NAT功能:

[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 192.168.8.254

[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.253:80

##為了友善使用ssh用戶端連接配接,我還将lvs叢集中各伺服器的22端口映射到了不同端口,具體如下:

[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport

2022

-j DNAT --to-destination

172.16.1.252:22 2122 172.16.1.101:22 2222 172.16.1.102:22 配置轉發功能:

[root@router ~]# iptables -A FORWARD -p ip -j ACCEPT

儲存規則:

[root@router ~]# service iptables save

此時,Director和RealServer都已可以正常通路外網。

1.3 配置本地windows,添加路由使其能通路lvs叢集:

由于試驗中實體主機(windows)和試驗用路由器(linux)的預設網關指向的是真實的路由器,是以實體主機(windows)是無法通路lvs叢集網絡的,為了能讓實體機(windows)通路到叢集網絡友善後面測試,是以需要添加路由,指令如下:

C:\windows\system32>route add 172.16.1.0/24 192.168.8.254

操作完成!

二、配置Director 2.1 啟用轉發:

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

如果想永久生效,則需要修改/etc/sysctl.conf檔案。

2.2 配置VIP和路由: 配置路由:

[root@lvs ~]# route add -host 172.16.1.253 dev eth0:0

配置VIP:

[root@lvs ~]# ifconfig eth0:1 172.16.1.253 netmask 255.255.255.255 up

2.3 清除原有iptables和ipvs規則:

[root@lvs ~]# iptables -F

[root@lvs ~]# iptables -Z

[root@lvs ~]# ipvsadm -C

2.4 配置叢集服務: 2.5 添加RS至叢集服務:

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.101 -g

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.102 -g

2.6 将上述過程編寫為一個服務腳本,直接在Director上實作開機啟動:

#!/bin/bash

#

# LVS script for VS/DR

# chkconfig: - 90 10

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

VIP=172.16.1.253

DIP=172.16.1.252

RIP1=172.16.1.101

RIP2=172.16.1.102

PORT=80

RSWEIGHT1=5

RSWEIGHT2=5

case "$1" in

start)

/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $VIP dev eth0:1

# Since this is the Director we must be able to forward packets

echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear all iptables rules.

/sbin/iptables -F

# Reset iptables counters.

/sbin/iptables -Z

# Clear all ipvsadm rules/services.

/sbin/ipvsadm -C

# Add an IP virtual service for VIP 192.168.0.219 port 80

# In this recipe, we will use the round-robin scheduling method.

# In production, however, you should use a weighted, dynamic scheduling method.

/sbin/ipvsadm -A -t $VIP:80 -s wlc

# Now direct packets for this VIP to

# the real server IP (RIP) inside the cluster

/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1

/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2

/bin/touch /var/lock/subsys/ipvsadm &> /dev/null

;;

stop)

# Stop forwarding packets

echo 0 > /proc/sys/net/ipv4/ip_forward

# Reset ipvsadm

# Bring down the VIP interface

/sbin/ifconfig eth0:0 down

/sbin/route del $VIP

/bin/rm -f /var/lock/subsys/ipvsadm

echo "ipvs is stopped..."

status)

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

echo "ipvsadm is stopped ..."

else

echo "ipvs is running ..."

ipvsadm -L -n

fi

*)

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

esac

将上述内容儲存在/etc/init.d/lvs-director檔案中,然後添加到服務:

[root@lvs ~]# chmod +x /etc/init.d/lvs-director

[root@lvs ~]# chkconfig --add lvs-director

[root@lvs ~]# chkconfig lvs-director on

[root@lvs ~]# /etc/init.d/lvs-director start

[root@lvs ~]# /etc/init.d/lvs-director status

ipvs is running ...

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  172.16.1.253:80 wlc

-> 172.16.1.101:80              Route   5      0          0

-> 172.16.1.102:80              Route   5      0          0

三、配置RS: 3.1 配置ARP廣播:

[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

3.2 配置VIP和路由:

[root@rs1 ~]# ifconfig lo:0 172.16.1.253 netmask 255.255.255.255 up

[root@rs1 ~]# route add -host 172.16.1.253 dev lo:0

3.3 編寫為腳本:

# Script to start LVS DR real server.

# description: LVS DR real server

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

host=`/bin/hostname`

# Start LVS-DR real server on this machine.

/sbin/ifconfig lo down

/sbin/ifconfig lo up

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $VIP dev lo:0

# Stop LVS-DR real server loopback device(s).

/sbin/ifconfig lo:0 down

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

# Status of LVS-DR real server.

islothere=`/sbin/ifconfig lo:0 | grep $VIP`

isrothere=`netstat -rn | grep "lo:0" | grep $VIP`

if [ ! "$islothere" -o ! "isrothere" ];then

# Either the route or the lo:0 device

# not found.

echo "LVS-DR real server Stopped."

echo "LVS-DR real server Running."

# Invalid entry.

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

exit 1

儲存至/etc/init.d/lvs-rs,并賦予執行權限,然後添加為開機啟動:

[root@rs1~]# chmod +x /etc/init.d/lvs-rs

[root@rs1 ~]# chkconfig --add lvs-rs

[root@rs1 ~]# chkconfig lvs-rs on

[root@rs1 ~]# /etc/init.d/lvs-rs start

3.4 在RS2上采用相同的配置即可

至此就全部完成了lvs的DR模型配置。

4 測試LVS叢集 4.1 配置web伺服器: 4.1.1 為rs1節點添加web首頁:

[root@rs1 ~]# service httpd start

正在啟動 httpd:httpd: apr_sockaddr_info_get() failed for rs1

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

[确定]

[root@rs1 ~]# echo "This is RS1..." >/var/www/html/index.html

4.1.2 為rs2節點添加web首頁:

[root@rs2 ~]# echo "This is RS2..." >/var/www/html/index.html

4.2 通路測試:

通路時觀察ipvs狀态:

Every 1.0s: ipvsadm -L -n                                                                        Tue Oct  8 19:58:42 2013

-> 172.16.1.101:80              Route   5     2          8

-> 172.16.1.102:80              Route   5     1          8

LVS之五:使用腳本實作RealServer的健康檢查

上文部署的DR模型中,當一台RS當機時,ipvs是不會自動踢出該RS伺服器的,我這裡使用一個腳本實作對RS的監控檢查。

一、需求分析:

腳本要能判斷RS運作情況;

當RS的web服務不能通路時,将其從lvs叢集中踢出;而當RS重新上線時,再将其加入lvs叢集;

定時檢查(死循環或cron計劃任務);

對RS的下線和上線做日志記錄。

二、web健康檢查指令:

使用curl能簡單的實作對web應用可用性進行監控:

curl指令選項:

--cacert CA憑證 (SSL)

--capath CA目錄 (made using c_rehash) to verify peer against (SSL)

--compressed 要求傳回是壓縮的形勢 (using deflate or gzip)

--connect-timeout 設定最大請求時間

-H/--header 自定義頭資訊傳遞給伺服器

-i/--include 輸出時包括protocol頭資訊

-I/--head 隻顯示文檔資訊

--interface 使用指定網絡接口/位址

-s/--silent靜音模式。不輸出任何東西

-u/--user 設定伺服器的使用者和密碼

-p/--proxytunnel 使用HTTP代理

三、具體實作:

VIP=192.168.8.254

CPORT=80

##使用數組RS定義所有RS伺服器

RS=("172.16.1.101" "172.16.1.102")

#定義RS狀态,後面引用

declare -a RSSTATUS

#定義權重

RW=("5" "5")

RPORT=80

#叢集類型為DR

TYPE=g

CHKLOOP=3

#監控日志

LOG=/var/log/ipvsmonitor.log

#addrs函數在RS重新上線時将其添加到叢集

addrs() {

ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2

[ $? -eq 0 ] && return 0 || return 1

}

#delrs函數在RS下線時将其從叢集中删除

delrs() {

ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT

#checkrs檢查RS狀态,如果上次均為離線狀态,則判定其為離線

checkrs() {

local I=1

while [ $I -le $CHKLOOP ]; do

if curl --connect-timeout 1

http://$1

&> /dev/null; then

return 0

let I++

done

return 1

#初始化RS狀态函數

initstatus() {

local I

local COUNT=0;

for I in ${RS[*]}; do

if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then

RSSTATUS[$COUNT]=1

RSSTATUS[$COUNT]=0

let COUNT++

#執行初始化RS狀态檢查函數

initstatus

#死循環

while :; do

let COUNT=0

if checkrs $I; then

if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then

addrs $I ${RW[$COUNT]}

[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG

if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then

delrs $I

[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG

sleep 5

LVS之六:使用keepalived實作LVS的DR模式熱備

一、說明:

在《

》文章講述了LVS的三種轉發模式對比,我們先就用LVS的DR模式來實作Web應用的負載均衡。為了防止LVS伺服器自身的單點故障導緻整個Web應用無法提供服務,是以還得利用Keepalived實作lvs的高可用性,keepalived主要使用VRRP協定來儲存鍊路的高可用性。而VRRP(Virtual Router Redundancy Protocol)協定本身是用于實作路由器備援的協定。

LVS-DR模式的原理如下(借用别人的圖):

LVS 機制與排程算法(詳細)
說明: 1、  LVS伺服器和WEB伺服器必須在同一網段; 2、  多台Web伺服器間使用NFS伺服器等共享存儲存放使用者上傳附件,以保障資料的一緻性(如上傳圖檔)。下文讨論 IP位址規劃:

VIP              192.168.18.60

LVS-MASTER     192.168.18.51

LVS-BACKUP     192.168.18.52

NFS   Server       192.168.18.20

MySQL               192.168.18.18

WEB1        192.168.18.61

WEB2        192.168.18.62

三、安裝LVS+Keepalived: 1、使用yum線上安裝:

[root@lvs1 ~]# yum install ipvsadm  keepalived –y

2、檢查安裝結果:

[root@lvs1 ~]# rpm -qa |grep ipvsadm

ipvsadm-1.25-10.el6.x86_64

[root@lvs1 ~]# rpm -qa |grep keepalived

keepalived-1.2.7-3.el6.x86_64

3、服務配置:

[root@lvs1 ~]# chkconfig keepalived on   ##設定為開機啟動

[root@lvs1 ~]# service keepalived start   ##立即啟動keepalived服務

四、配置LVS伺服器: 1、  備份配置檔案: [root@lvs1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.bak 2、  修改配置檔案,具體如下:

原始的配置檔案包含了三種模式的配置,而這裡我們隻需要用到DR模式,是以最終保留配置如下:

[root@lvs1 ~]#  vim /etc/keepalived/keepalived.conf

global_defs {                       ##全局配置部分

#   notification_email {             ##下面幾行均為全局通知配置,可以實作出現問題後報警,但功能有限,是以注釋掉,并采用Nagios監視lvs運作情況

#       [email protected]

#   }

#   notification_email_from [email protected]

#   smtp_server smtp.exmail.qq.com

#   smtp_connect_timeout 30

router_id LVS_MASTER             ##設定lvs的id,在一個網絡内應該是唯一的

vrrp_instance VI_1 {            ##設定vrrp組,唯一且同一LVS伺服器組要相同

state

MASTER  

##備份LVS伺服器設定為

BACKUP

interface eth0             # #設定對外服務的接口

virtual_router_id 51        ##設定虛拟路由辨別

priority 100                                    #設定優先級,數值越大,優先級越高,backup設定為99,這樣就能實作當master當機後自動将backup變為master,而當原master恢複正常時,則現在的master再次變為backup。

advert_int 1            ##設定同步時間間隔

authentication {         ##設定驗證類型和密碼,master和buckup一定要設定一樣

auth_type PASS

auth_pass 1111

virtual_ipaddress {          ##設定VIP,可以多個,每個占一行

192.168.18.60

virtual_server 192.168.18.60 80 {

delay_loop 6            ##健康檢查時間間隔,機關s

lb_algo wrr             ##

設定為

權重輪叫

lb_kind DR                              ##負載均衡轉發規則

nat_mask 255.255.255.0   ##網絡掩碼,DR模式要保障真是伺服器和lvs在同一網段

persistence_timeout 50    ##會話保持時間,機關s

protocol TCP                           ##協定

real_server 192.168.18.61 80 {      ##真實伺服器配置,80表示端口

weight 3                              ##權重

TCP_CHECK {                       ##伺服器檢測方式設定

connect_timeout 5    ##連接配接逾時時間

nb_get_retry 3

delay_before_retry 3

connect_port 80

real_server 192.168.18.62 80 {

weight 3

TCP_CHECK {

connect_timeout 10

作為高可用的備份lvs伺服器配置隻需在上述配置中的master修改backup即可,其他保持相同。 3、  分别在兩台lvs伺服器上重新開機服務:

[root@lvs1 ~]# service keepalived start

注:

由于keepalived配置檔案有文法錯誤也能啟動,是以看到啟動了lvs服務,不代表配置檔案沒有錯誤,如果遇到lvs不能正常轉發,及時跟蹤日志進行處理。

日志跟蹤方法:

1、開兩個ssh視窗連接配接到lvs伺服器,第一個視窗運作如下指令:

[root@lvs1 ~]# tail -F /var/log/message

2、第二個視窗重新啟動keepalived服務,同時觀察視窗1中日志的變化,然後根據日志提示解決即可。

五、WEB伺服器IP綁定配置:

在兩台WEB伺服器安裝并配置(非本文重點,不做web安裝配置講解),建立測試網頁,先使用實際IP進行通路測試,能正常通路後,進行如下操作:

在前面的文章中介紹DR模式時提到:

負載均衡器也隻是分發請求,應答包通過單獨的路由方法傳回給用戶端。

但實際上用戶端通路時,IP都是指向的負載均衡器的ip(也就是LVS的VIP),如何能讓真是伺服器處理IP頭為VIP的請求,這就需要做下面的操作,将VIP綁定到真實伺服器的lo網口(回環),為了防止IP廣播産生IP沖突,還需關閉IP廣播,具體如下:

1、編輯開機啟動腳本:

  [root@web1 ~]# vim /etc/init.d/realserver

#chkconfig: 2345 79 20

#description:realserver

SNS_VIP=192.168.18.60

ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

/sbin/route add -host $SNS_VIP dev lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p >/dev/null 2>&1

echo "RealServer Start OK"

ifconfig lo:0 down

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

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

echo "RealServer Stoped"

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

exit 0

腳本說明:

0:隻要本地配置的有相應位址,就給予響應;預設;

1:僅在請求的目标位址配置在到達的接口上的時候,才給予響應;

0:将本地任何接口上的任何位址向外通告;預設;

2:僅向與本地接口上位址比對的網絡進行通告;

2、  設定腳本開機啟動并立即啟動:

[root@web1 ~]# chkconfig realserver on

[root@web1 ~]# service realserver start

RealServer Start OK

3、  檢測IP配置:

[root@web1 ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:50:56:B3:54:5A

inet addr:192.168.18.61  Bcast:192.168.18.255  Mask:255.255.255.0

inet6 addr: fe80::250:56ff:feb3:545a/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:98940 errors:4 dropped:4 overruns:0 frame:0

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

collisions:0 txqueuelen:1000

RX bytes:23077218 (22.0 MiB)  TX bytes:16043349 (15.3 MiB)

Interrupt:18 Base address:0x2000

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING  MTU:16436  Metric:1

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

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

collisions:0 txqueuelen:0

RX bytes:528420 (516.0 KiB)  TX bytes:528420 (516.0 KiB)

lo:0      Link encap:Local Loopback

inet addr:

192.168.18.60 

Mask:255.255.255.255

4、  測試LVS:

在lvs master伺服器上運作如下指令:

[root@lvs1 ~]# watch -n 1 ipvsadm -ln

在多台用戶端通過浏覽器通路VIP或域名(域名需解析到VIP),看能否擷取到正确的頁面,且同時觀察上述視窗的變化。

LVS 機制與排程算法(詳細)

從上圖(為了友善觀察,使用了壓力測試)可以看出,通路被正常的分擔到了兩台後端web伺服器 。

六、後繼問題探讨:

1、使用者新上傳的附件存放問題;目前我們采用的是NFS方式解決,但存在單點故障,需要配合其他方式解決。NFS的基本用法請參考《

NFS的配置和使用

2、後端資料庫高可用性;

3、會話共享和保持問題(Session共享);算法調整為SH可解決,但有RealServer當機時,其上的session也會丢失。後期将調整為實作共享session。

LVS之七:使用持久連接配接解決session問題

前面在讨論LVS算法中,SH算法可以實作将同一用戶端的請求總是發送給第一次指定的RS,除非該RS出現故障不能再提供服務。其實在LVS叢集中,持久連接配接功能也能在一定時間内,将來自同一個用戶端請求派發至此前標明的RS,而且是無關算法的。

持久連接配接的三種類型:

在基于SSL的加密https協定中,特别需要用到持久連接配接,因為用戶端需要與伺服器進行交換證書并協商加密算法等。

如果一個叢集中提供了兩種服務,持久連接配接會将同一用戶端的所有請求都同步到同一RS。持久連接配接分三種:

PPC(持久端口連接配接):

将來自于同一個用戶端對同一個叢集服務的請求,始終定向至此前標明的RS;

PCC(持久用戶端連接配接):

将來自于同一個用戶端對所有端口的請求,始終定向至此前標明的RS;PCC是把所有端口統統定義為叢集服務,一律向RS轉發;

PNMPP:

持久防火牆标記連接配接。使用iptables的标記功能,可以實作給多個服務(端口)打上相同的标記,然後在ipvsadm使用-f選項,并使用上述防火牆标記即可将多個服務放到一個LVS叢集中。實作過程如下:

# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 80 -i $INCARD -j MARK --set-mark

10

# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 443 -i $INCARD -j MARK --set-mark

# ipvsadm -A -f

-s wlc –p 600

持久連接配接模闆檢視:

LVS的持久連接配接又叢集的持久連接配接模闆(一個記憶體緩沖區)提供;該持久連接配接模闆儲存着每一個用戶端及配置設定給它的RS的映射關系。使用如下指令可以檢視該模闆:

[root@lvs ~]#

ipvsadm -L -c

IPVS connection entries

pro expire state       source             virtual            destination

TCP 01:56  FIN_WAIT    192.168.8.12:51822 172.16.1.253:http  172.16.1.102:http

TCP 01:57  FIN_WAIT    192.168.8.12:51825 172.16.1.253:http  172.16.1.101:http

TCP 01:56  FIN_WAIT    192.168.8.12:51821 172.16.1.253:http  172.16.1.101:http

TCP 01:42  FIN_WAIT    192.168.8.12:51814 172.16.1.253:http  172.16.1.102:http

TCP 01:57  FIN_WAIT    192.168.8.12:51826 172.16.1.253:http  172.16.1.102:http

TCP 01:57  FIN_WAIT    192.168.8.12:51824 172.16.1.253:http  172.16.1.102:http

TCP 01:56  FIN_WAIT    192.168.8.12:51820 172.16.1.253:http  172.16.1.102:http

TCP 14:58  ESTABLISHED 192.168.8.12:51828 172.16.1.253:http  172.16.1.102:http

TCP 01:55  FIN_WAIT    192.168.8.12:51815 172.16.1.253:http  172.16.1.101:http

TCP 01:56  FIN_WAIT    192.168.8.12:51823 172.16.1.253:http  172.16.1.101:http

TCP 01:57  FIN_WAIT    192.168.8.12:51827 172.16.1.253:http  172.16.1.101:http

配置并啟用lvs叢集的持久連接配接: 基本文法:

ipvsadm -A|E ... -p timeout

timeout: 持久連接配接時長,預設300秒;機關是秒;

在使用《

》中的lvs叢集,每次重新整理用戶端時,都會在RS1和RS2上切換。如下圖:

LVS 機制與排程算法(詳細)
我們啟用持久連接配接:

[root@lvs ~]# ipvsadm -L -n

-> 172.16.1.101:80              Route   5      0          1

-> 172.16.1.102:80              Route   5      0          2

[root@lvs ~]# ipvsadm -E -t 172.16.1.253:80 -p 600

TCP  172.16.1.253:80 wlc persistent 600

-> 172.16.1.102:80              Route   5      0          1

此時再次重新整理用戶端,會發現已經不會再改變RS。

[root@lvs ~]# ipvsadm -L --persistent-conn

Prot LocalAddress:Port            Weight    PersistConn ActiveConn InActConn

-> RemoteAddress:Port

TCP  172.16.1.253:http wlc persistent 600

-> 172.16.1.101:http            5         0           0          0

->

172.16.1.102:http            5         1           0          14

繼續閱讀