1、 概況2html
1.1 應用場景2linux
2、 相關理論4算法
2.2 LVS工做原理4vim
3、 架構拓撲5後端
4、 資源規劃5緩存
5、 實施部署5bash
5.1初始化配置6服務器
高性能業務架構解決方案(LVS+Keepalived)
1、概況
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、相關理論
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都有一塊網卡連在同一物理網段上。
3、架構拓撲
4、資源規劃
主機名稱 |
內網IP |
操做系統 |
LVS-Master |
10.10.10.2 |
Centos 6.5 64位 |
LVS-Backup |
10.10.10.3 |
Centos 6.5 64位 |
WEB01 |
10.10.10.11 |
Centos 6.5 64位 |
WEB02 |
10.10.10.12 |
Centos 6.5 64位 |
WEB03 |
10.10.10.13 |
Centos 6.5 64位 |
NFS-server |
10.10.10.20 |
Centos 6.5 64位 |
VIP |
10.10.10.100 |
\ |
5、實施部署
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
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 {
xuel@51idc.com
}
notification_email_from Alexandre.Cassen@firewall.loc
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 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
5.4 後端WEB服務器
安裝httpd,並寫測試頁
yum install httpd
chkconfig httpd on
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
echo 「This is NFS-share test page!」>/NFSshare
後端WEB掛載共享存儲
mount 10.10.10.20:/NFSshare /var/www/html/
測試訪問VIP
5.6 測試
爲測試方便,在後端WEB服務器上,寫入對用文件
5.6.1 負載均衡測試
中止WEB02 httpd
再中止WEB03 httpd
5.6.2 高可用測試
中止LVS-Master 的keepalived服務
此時VIP已經漂移到LVS-Backup上面
後端web已經正常對外提供服務。
啓動Master之上的Keepalived,VIP成功漂移會MASTER之上
恢復郵件
6、注意事項
6.1 LVS安裝注意事項
ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux #此處要根據實際操做系統最高版本的kernel 爲準
./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
6.2 將相關開機自啓服務
開機自啓服務
開機自啓腳本
開機NFS自動掛載
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"
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 $VIP dev eth0
ipvsadm -C
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 --set 30 120 300
ipvsadm
;;
stop)
echo "Stop LVS DR"
ifconfig eth1 down
ipvsadm -C
;;
*)
echo "Usage:$0 {start ? stop}"
exit 1
esac
在後端WEB01、WEB02之上配置
LVS-RS-WEB.sh
#!/bin/bash
VIP=172.16.16.100
. /etc/init.d/functions
case "$1" in
start)
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
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
sysctl -p
;;
stop)
/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
sysctl -p
;;
*)
echo "Usage:$0{start|stop}"
exit 1
esac