天天看點

高性能業務架構解決方案(LVS+Keepalived)

高性能業務架構解決方案(LVS+Keepalived)

一、 概況2

    1.1 應用場景2

    1.2 LVS/Nginx/HAProxy特點3

二、 相關理論4

    2.1 Keepalived工作原理4

    2.2 LVS工作原理4

三、 架構拓撲5

四、 資源規劃5

五、 實施部署5

    5.1初始化配置6

    5.2 LVS配置6

    5.3 Keepalived部署7

        5.3.1 Keepalived的安裝8

        5.3.2 配置keepalived8

    5.4 後端WEB伺服器10

    5.5 共享存儲11

    5.6 測試11

        5.6.1 負載均衡測試12

        5.6.2 高可用測試13

六、 注意事項15

    6.1 LVS安裝注意事項15

    6.2 将相關開機自啟服務16

    6.3 腳本16

一、概況

1.1 應用場景

Nginx/LVS/HAProxy的基于Linux的開源免費的負載均衡軟體。對于大型的,需要進行高并發的網站或者對網絡不太嚴格的場景,可以使用Nginx;對于大型的Web伺服器的時候可以使用Haproxy;對性能有嚴格要求的時候可以使用LVS,就單純從負載均衡的角度來說,LVS也許會成為主流,更适合現在大型的網際網路公司。本文采用LVS+keepalived方案來解決業務架構高可用。

1.2 LVS/Nginx/HAProxy特點

名稱 特點
LVS

1) 抗負載能力強、是工作在網絡4層之上僅作分發之用,沒有流量的産生,這個特點也決定了它在負載均衡軟體裡的性能最強的;

2) 配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,是以并不需要太多接觸,大大減少了人為出錯的幾率;

3) 工作穩定,自身有完整的雙機熱備方案,如LVS+Keepalived和LVS+Heartbeat,不過我們在項目實施中用得最多的還是LVS/DR+Keepalived;

4) 無流量,保證了均衡器IO的性能不會收到大流量的影響;

5) 應用範圍比較廣,可以對所有應用做負載均衡;

6) 軟體本身不支援正則處理,不能做動靜分離,這個就比較遺憾了;其實作在許多網站在這方面都有較強的需求,這個是Nginx/HAProxy+Keepalived的優勢所在。

7) 如果是網站應用比較龐大的話,實施LVS/DR+Keepalived起來就比較複雜了,特别後面有Windows Server應用的機器的話,如果實施及配置還有維護過程就比較複雜了。

Nginx

1) 工作在網絡的7層之上,可以針對http應用做一些分流的政策,比如針對域名、目錄結構,它的正則規則比HAProxy更為強大和靈活,這也是許多朋友喜歡它的原因之一;

2) Nginx對網絡的依賴非常小,理論上能ping通就就能進行負載功能,這個也是它的優勢所在;

3) Nginx安裝和配置比較簡單,測試起來比較友善;

4) 也可以承擔高的負載壓力且穩定,一般能支撐超過幾萬次的并發量;

5) Nginx可以通過端口檢測到伺服器内部的故障,比如根據伺服器處理網頁傳回的狀态碼、逾時等等,并且會把傳回錯誤的請求重新送出到另一個節點,不過其中缺點就是不支援url來檢測;

6) Nginx僅能支援http和Email,這樣就在适用範圍上面小很多,這個它的弱勢;

7) Nginx不僅僅是一款優秀的負載均衡器/反向代理軟體,它同時也是功能強大的Web應用伺服器。LNMP現在也是非常流行的web架構,大有和以前最流行的LAMP架構分庭抗争之勢,在高流量的環境中也有很好的效果。

8) Nginx現在作為Web反向加速緩存越來越成熟了,很多朋友都已在生産環境下投入生産了,而且反映效果不錯,速度比傳統的Squid伺服器更快,有興趣的朋友可以考慮用其作為反向代理加速器。

HAProxy

1) HAProxy是支援虛拟主機的,以前有朋友說這個不支援虛拟主機,我這裡特此更正一下。

2) 能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作

3) 支援url檢測後端的伺服器出問題的檢測會有很好的幫助。

4) 它跟LVS一樣,本身僅僅就隻是一款負載均衡軟體;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度,在并發處理上也是優于Nginx的。

5) HAProxy可以對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,不過在後端的MySQL slaves數量超過10台時性能不如LVS,是以我向大家推薦LVS+Keepalived。

6) HAProxy的算法現在也越來越多了,算法特别靈活

二、相關理論

2.1 Keepalived工作原理

keepalived:顧名思義是保持存活,常用來搭建裝置的高可用,防止業務核心裝置出現單點故障。keepalived基于VRRP協定來實作高可用,主要用作realserver的健康檢查以及負載均衡主機和backup主機之間的故障漂移。如果将TCP/IP劃分為5層,則Keepalived就是一個類似于3~5層交換機制的軟體,具有3~5層交換功能,其主要作用是檢測web伺服器的狀态,如果某台web伺服器故障,Keepalived将檢測到并将其從系統中剔除,當該web伺服器工作正常後Keepalived自動将其加入到伺服器群中,這些工作全部自動完成,而不需要人工幹預,隻需要人工修複故障的web伺服器即可。

三層機理是發送ICMP資料包即PING給某台伺服器,如果不通,則認為其故障,并從伺服器群中剔除;四層機理是檢測TCP端口号狀态來判斷某台伺服器是否故障,如果檢測端口存在異常,則從伺服器群中剔除;五層機理是根據使用者的設定檢查某個伺服器應用程式是否正常運作,如果不正常,則從伺服器群中剔除。

2.2 LVS工作原理

LVS工作在網絡層。通過控制IP來實作負載均衡。IPVS是其具體的實作子產品。IPVS的主要作用:安裝在Director Server上面,在Director Server虛拟一個對外通路的IP(VIP)。使用者通路VIP,到達Director Server,Director Server根據一定的規則選擇一個Real Server,處理完成後然後傳回給用戶端資料。這些步驟産生了一些具體的問題,比如如何選擇具體的Real Server,Real Server如果傳回給用戶端資料等等。IPVS為此有三種機制:

n VS/NAT(Virtual Server via Network Address Translation),即網絡位址翻轉技術實作虛拟伺服器。當請求來到時,Diretor server上處理的程式将資料封包中的目标位址(即虛拟IP位址)改成具體的某台Real Server,端口也改成Real Server的端口,然後把封包發給Real Server。Real Server處理完資料後,需要傳回給Diretor Server,然後Diretor server将資料包中的源位址和源端口改成VIP的位址和端口,最後把資料發送出去。由此可以看出,使用者的請求和傳回都要經過Diretor Server,如果資料過多,Diretor Server肯定會不堪重負。

n VS/TUN(Virtual Server via IP Tunneling),即IP隧道技術實作虛拟伺服器。它跟VS/NAT基本一樣,但是Real server是直接傳回資料給用戶端,不需要經過Diretor server,這大大降低了Diretor server的壓力。

n VS/DR(Virtual Server via Direct Routing),即用直接路由技術實作虛拟伺服器。跟前面兩種方式,它的封包轉發方法有所不同,VS/DR通過改寫請求封包的MAC位址,将請求發送到Real Server,而Real Server将響應直接傳回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載排程機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一實體網段上。

三、架構拓撲

高性能業務架構解決方案(LVS+Keepalived)

四、資源規劃

主機名稱 内網IP 作業系統
LVS-Master 10.10.10.2 Centos 6.5 64位
LVS-Backup 10.10.10.3
WEB01 10.10.10.11
WEB02 10.10.10.12
WEB03 10.10.10.13
NFS-server 10.10.10.20
VIP 10.10.10.100 \

五、實施部署

5.1 初始化配置

l getenforce 0關閉SeLinux

l 修改主機名

l 防火牆開放22/80端口

l 測試網絡連通性

l 更新YUM源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

yum makecache           #生成緩存

5.2 LVS配置

在master與backup上面同時配置

安裝可采用yum直接安裝,或下載下傳tar包編譯安裝。

yum install ipvsadm

/etc/init.d/ipvsadm save

/etc/init.d/ipvsadm start

檢視ipvsadm狀态

/etc/init.d/ipvsadm -ln

# 開啟icmp包重定向

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

echo "1" > /proc/sys/net/ipv4/conf/default/send_redirects

echo "1" > /proc/sys/net/ipv4/conf/eth0/send_redirects

#添加路由

route add -host 10.10.10.100 dev eth1

#清除LVS規則

ipvsadm -C

# 添加一條虛拟伺服器記錄

# -p指定一定的時間内将相同的用戶端配置設定到同一台後端伺服器解決session問題

ipvsadm -A -t 10.10.10.100:80 -s wlc -p

# 添加真實伺服器記錄

ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.11:80 -g -w 1

ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g -w 1

ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g -w 1

#設定tcp tcpfin udp超市連接配接值

ipvsadm --set 30 120 300

Ipvsadm

配置完成後,檢視ipvsadm狀态與主機路由

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

5.3 Keepalived部署

5.3.1 Keepalived的安裝

在master與backup上面均需要配置

安裝開發組環境工具

yum groupinstall "Development tools" -y

安裝相應軟體包

yum install openssl-devel popt-devel -y

ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux   #此處要根據實際作業系統最高版本的kernel 為準

如果/usr/src/kernels/下面沒檔案使用yum 安裝 kernel-devel

#下載下傳keepalive

wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz

tar zxvf keepalived-1.2.24.tar.gz

cd keepalived-1.2.24

./configure --with-kernel-dir=/usr/src/kernels/2.6.32-642.1.1.el6.x86_64

(注意這個步驟要看到以下字樣才是正常的)

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

make && make install

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 --level 2345 keepalived on

/etc/init.d/keepalived start

至此keepalive就已經安裝完畢。

注意:主要backup伺服器之上修改兩點即可

1、state MASTER  backup伺服器需要更改為BACKUP

2、priority 100小于master的優先級

5.3.2 配置keepalived

編輯keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {

[email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER #backup主機配置為BACKUP

    interface eth0    #執行個體綁定的網卡

    virtual_router_id 51    # VRID 标記( 0...255 )

    priority 100#backup主機配置優先級小于100,如配置90

    advert_int 1#檢查間隔,預設 1s

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.10.10.100#VIP位址,如果有多個 VIP ,繼續換行填寫

virtual_server 10.10.10.100 80 {     #設定 VIP及監聽後端服務端口

    delay_loop 6

    lb_algo wrr#LVS排程算法 rr|wrr|lc|wlc|sh|dh|lblc

    lb_kind DR#LVS實作負載均衡的機制 NAT|DR|TUN

    nat_mask 255.255.255.0

    persistence_timeout 50# 會話保持時間

    protocol TCP

    real_server 10.10.10.11 80 {

weight 3

          TCP_CHECK {#tcp健康檢查

             connect_timeout 10#連接配接逾時時間

             nb_get_retry 3#重連次數

             delay_before_retry 3#重連間隔時間

             connect_port 80#健康檢查端口

          }

      }

     real_server 10.10.10.12 80 {

     weight 3

          TCP_CHECK {

             connect_timeout 10

             nb_get_retry 3

             delay_before_retry 3

             connect_port 80

     real_server 10.10.10.13 80 {

5.4 後端WEB伺服器

安裝httpd,并寫測試頁

yum install httpd

chkconfig httpd on

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

WEB01與WEB02同時配置

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

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

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

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

arp_ignore:定義對目标位址為本地IP的ARP詢問不同的應答模式0 

0 - (預設值): 回應任何網絡接口上對任何本地IP位址的arp查詢請求 

1 - 隻回答目标IP位址是來訪網絡接口本地位址的ARP查詢請求 

2 -隻回答目标IP位址是來訪網絡接口本地位址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段内 

3 - 不回應該網絡界面的arp請求,而隻對設定的唯一和連接配接位址做出回應 

4-7 - 保留未使用 

8 -不回應所有(本地位址)的arp查詢

arp_announce:對網絡接口上,本地IP位址的發出的,ARP回應,作出相應級别的限制: 确定不同程度的限制,宣布對來自本地源IP位址發出Arp請求的接口 

0 - (預設) 在任意網絡接口(eth0,eth1,lo)上的任何本地位址 

1 -盡量避免不在該網絡接口子網段的本地位址做出arp回應. 當發起ARP請求的源IP位址是被設定應該經由路由達到此網絡接口的時候很有用.此時會檢查來訪IP是否為所有接口上的子網段内ip之一.如果改來訪IP不屬于各個網絡接口上的子網段内,那麼将采用級别2的方式來進行處理. 

2 - 對查詢目标使用最适當的本地位址.在此模式下将忽略這個IP資料包的源位址并嘗試選擇與能與該位址通信的本地位址.首要是選擇所有的網絡接口的子網中外出通路子網中包含該目标IP位址的本地位址. 如果沒有合适的位址被發現,将選擇目前的發送網絡接口或其他的有可能接受到該ARP回應的網絡接口來進行發送.

關于對arp_announce 了解的一點補充

sysctl -p

添加VIP位址與路由

ifconfig lo:0 10.10.10.100 broadcast 10.10.10.100 netmask 255.255.255.255 up

route add -host 10.10.10.100 dev lo:0

5.5 共享存儲

yum -y install nfs-utils rpcbind

service nfs start

chkconfig nfs on

vim /etc/exprots

高性能業務架構解決方案(LVS+Keepalived)

echo “This is NFS-share test page!”>/NFSshare

後端WEB挂載共享存儲

mount 10.10.10.20:/NFSshare /var/www/html/

高性能業務架構解決方案(LVS+Keepalived)

測試通路VIP

高性能業務架構解決方案(LVS+Keepalived)

5.6 測試

為測試友善,在後端WEB伺服器上,寫入對用檔案

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

5.6.1 負載均衡測試

停止WEB02 httpd

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

再停止WEB03 httpd

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

5.6.2 高可用測試

高性能業務架構解決方案(LVS+Keepalived)

停止LVS-Master 的keepalived服務

高性能業務架構解決方案(LVS+Keepalived)

此時VIP已經漂移到LVS-Backup上面

高性能業務架構解決方案(LVS+Keepalived)

後端web已經正常對外提供服務。

啟動Master之上的Keepalived,VIP成功漂移會MASTER之上

高性能業務架構解決方案(LVS+Keepalived)
高性能業務架構解決方案(LVS+Keepalived)

恢複郵件

高性能業務架構解決方案(LVS+Keepalived)

六、注意事項

6.1 LVS安裝注意事項

6.2 将相關開機自啟服務

開機自啟服務

高性能業務架構解決方案(LVS+Keepalived)

開機自啟腳本

高性能業務架構解決方案(LVS+Keepalived)

開機NFS自動挂載

高性能業務架構解決方案(LVS+Keepalived)

6.3 腳本

為友善配置,目前已經寫了兩個腳本,友善運作安裝。

在Master與Backup之上配置

LVS-MB-ipvsadm.sh

#!/bin/bash

VIP=10.10.10.100

RIPS1=10.10.10.11

RIPS2=10.10.10.12

RIPS3=10.10.10.13

SERVICE=80

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

case "$1" in

start)

echo "Start LVS of DR Mode"

route add -host $VIP dev eth0

ipvsadm -A -t $VIP:$SERVICE -s wlc -p

ipvsadm -a -t $VIP:$SERVICE -r $RIPS1:$SERVICE -g -w 1

ipvsadm -a -t $VIP:$SERVICE -r $RIPS2:$SERVICE -g -w 1

ipvsadm -a -t $VIP:$SERVICE -r $RIPS3:$SERVICE -g -w 1

ipvsadm

;;

stop)

echo "Stop LVS DR"

ifconfig eth1 down

*)

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

exit 1

esac

在後端WEB01、WEB02之上配置

LVS-RS-WEB.sh

VIP=172.16.16.100

. /etc/init.d/functions

echo "Start LVS of RS"

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

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

/sbin/ifconfig lo:0 down

echo "Close LVS of RS"

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 "Usage:$0{start|stop}"