建構百萬通路量電子商務網站之LVS負載均衡(前端四層負載均衡器)[連載之電子商務系統架構]
版本:V1
作者:Jimmy Li
關鍵詞:電子商務,系統架構,
------[連載之電子商務系統架構]通路量超過100萬的電子商務網站技術架構
本連載首篇介紹到電子商務網站高性能、高可用解決方案。從架構圖上的方案,應用的是LVS+keepalived負載均衡。實作高性能、高可用解決方案(伺服器組成叢集,達到負載均衡,高性能、高可用、高可伸縮性的伺服器叢集)網際網路->LVS負載均衡(前端四層負載均衡器)。
通路量超過100萬的電子商務網站技術架構.PNG圖,電子商務網站要承受高通路量,硬體裝置的支撐是整個系統的基礎。系統軟體的支撐也是必不可少的重要組成部分。
本文詳細介紹傳統WEB前段負載均衡層,并比較常見有多種負載均衡解決方案。
一、本文要點:
1.LVS+keepalived linux伺服器通過源碼編譯安裝。
2.軟體負載均衡,四層負載均衡器。
3.CentOS5.6環境下布署(32位) linux伺服器版。
4.電子商務網站高性能、高可用解決方案,LVS負載均衡(前端四層負載均衡器)。
5.建構過程的要點解說,重點步驟說明。
6.本方案多次用于實際生産應用中,并可以靈活變通應用。
二、軟體負載均衡常見幾種方案:
1.LVS+keepalived負載均衡,LVS+KEEPALIVED是LINUX下的四層負載均衡軟體
2.Haproxy做負載均衡
3.heartbeat + heartbeat-ldirectord + lvs
三、硬體的負載均衡解決方案有:
1.F5 負載均衡(F5 負載均衡 LTM V9 HA )
2.思科 負載均衡産品 ( CISCO(思科) ACE-4710-0.5F-K9 )
3.思傑 負載均衡産品(CITRIX NetScaler 标準版(9000) 負載均衡)
Cisco、Juniper、F5、Radware、Huawei等品牌網絡裝置。
四、名詞解釋:
LVS(Linux Virtual Server) LVS是Linux Virtual Server的縮寫,意思是Linux虛拟伺服器。LVS是一個開源的軟體,由畢業于國防科技大學的章文嵩博士于1998年5月創立,可以實作LINUX平台下的簡單負載均衡。
HA(High Availability),則是高可用的意思。
五、電子商務網站負載均衡架構:
電子商務網站負載均衡架構,選擇本架構的原因是。因為LVS+KEEPALIVED是LINUX下的四層負載均衡軟體。其有如下特點:
LVS叢集采用IP負載均衡技術和基于内容請求分發技術。排程器具有很好的吞吐率(在DR模式下),将請求均衡地轉移到不同的伺服器上執行,且排程器自動屏蔽掉伺服器的故障,進而将一組伺服器構成一個高性能的、高可用的虛拟伺服器。整個伺服器叢集的結構對客戶是透明的,而且無需修改用戶端和伺服器端的程式。為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。一般來說,LVS叢集采用三層結構,其主要組成部分為:
A、負載排程器(load balancer),它是整個叢集對外面的前端機,負責将客戶的請求發送到一組伺服器上執行,而客戶認為服務是來自一個IP位址(我們可稱之為虛拟IP位址)上的。
B、伺服器池(server pool),是一組真正執行客戶請求的伺服器,即realserver,執行的服務有WEB、MAIL、FTP和DNS等。
C、共享存儲(shared storage),它為伺服器池提供一個共享的存儲區,這樣很容易使得伺服器池擁有相同的内容,提供相同的服務。
LVS的IP負載均衡技術實作:
目前IP負載均衡技術是在負載排程器的實作技術中效率最高的。LVS叢集中實作的三種IP負載均衡技術,分别是:
Virtual Server via Network Address Translation (VS/NAT): 也有說端口映射的,其目标是将一組伺服器構成一個高性能的、高可用的虛拟伺服器。因為這種技術容易形成單點故障,進而造成網路無法通路,并且存在帶寬瓶頸。是以LVS又提供了下面兩種實作。
Virtual Server via IP Tunneling (VS/TUN ): 通過IP隧道實作虛拟服務。
Virtual Server via Direct Routing (VS/DR) :直接路由實作虛拟伺服器的方法(負載能力最強),本文搭建的就是DR模式。
叢集:
所謂叢集是指由多個獨立的計算機節點構成的在網絡中表現為單一的為客戶工作站提供高可靠性服務的系統。在大型項目中,往往有大量的請求并發,這樣就給伺服器帶來了很大的負載,而建立叢集系統的目的就是為了解決負載均衡和高可用性的問題。
負載均衡:
負載均衡是指大量的并發通路或資料流量分擔到多台節點裝置上分别處理,減少使用者等待響應的時間。既然服務是在多台節點裝置上的運作,那麼要屏蔽負載均衡伺服器的失效,就要在主備機上都運作High Availability 監控程式,來監控對方的運作狀況。通過這種方式,可以實作系統的高可用性,即當備份機不能在一定的時間内收到主伺服器的活動資訊時,它就接管主伺服器的服務IP并繼續提供服務。當備份機又從主伺服器收到活動資訊,它就釋放服務IP位址,由主伺服器提供服務。
通過以上的介紹,相信大家對叢集技術及其應用領域已經有了宏觀上的了解。下面,我們通過一個實際的案例來講解如何在實戰中建立一個具有高可用性的叢集系統。讀者可以依據本文介紹的方法進行叢集實驗,隻需要準備兩台普通的PC機模拟伺服器即可。這裡我們在兩台PC機上都安裝了SuSE Linux作業系統,并以IBM産品(WAS NDIBM HTTP Server,EDGE Component等)作為建構叢集的軟體支援,實作一個可拓展、高性能,具有高可用性的叢集系統。
六、架構圖:
七、系統環境:CentOS 5.6 32位(系統最小模式安裝)
64位系統安裝問題提示:
試過在64位時編譯會出錯,提示找不到一些核心庫檔案,檔案名稱含了64字樣的緣故,編譯有問題,逐一修改修改原安裝包很麻煩。還不知道會有其他未知BUG。
關鍵點:keepalived 是運作在LVS基礎上的,LVS 安裝ipvsadmin #yum install ipvsadmin (省去編譯版本配對問題)
很多朋友使用編譯安裝不成功,是由于ipvsadmin的版本跟你使用的linux核心不一緻。
首先請檢視自己 Linux 作業系統核心的版本 指令: uname -a 指令: cat /proc/version 指令:lsb_release -a
八、編譯安裝ipvsadm
下面看我怎麼編譯安裝的,linux系統應用中編譯安裝是我力薦的安裝方式。
首先下載下傳軟體ipvsadm
下載下傳後,安裝ipvsadmin
編譯時候報 make[1]: *** [libipvs.o] Error 1 錯誤
但是下了ipvsadm後編譯出了問題:
解決辦法可能不隻一種;我是用的下面的辦法搞定的:
ln -s /usr/src/kernels/2.6.x-xx.EL-i686/ /usr/src/linux
cd ipvsadm-1.24
make && make install
ipvsadmin -v 應該能看到如下資訊:
[root@localhost ipvsadm-1.24]# ipvsadm -v
ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.0)
說明編譯安裝成功!
九、keepalived采用VRRP機制
另外注意 keepalived 在Linux下的(VRRP)虛拟路由備援協定 ,keepalived采用VRRP機制,那麼就會涉及負載均衡伺服器連接配接的路由器(交換機)
VRRP協定将兩台或多台路由器裝置虛拟成一個裝置,對外提供虛拟路由器IP(一個或多個)。
實際使用中,如果你連接配接的使用的路由器是傻瓜型的話,可以忽略這個問題。
如果你用是智能路由器,設定了規則的話,那就要注意了,一些規則會将VRRP發出的狀态檢測包,當做病毒屏蔽掉,最後導緻的結果是keepalived 負載均衡器之間的失敗切換failover,是通過VRRPv2(Virtual Router Redundancy Protocol) stack實作的。
還可能導緻不能檢測後端真實伺服器的存活狀态(檢測web伺服器的狀态)。
十、相關知識點
1.keepalived 通過對伺服器池對象的健康檢查,實作對失效機器/服務的故障隔離 (官方專用名詞“Checkers”負責真實伺服器的健康檢查healthchecking)
2.負載均衡器之間的失敗切換failover,是通過VRRPv2(Virtual Router Redundancy Protocol) stack實作的。
不就是(LVS-DR,LVS-NAT,LVS-TUN)3種模式!
十一、網絡環境 :
lvs-master:192.168.9.201 (主)
lvs-backup:192.168.9.202 (備)
vip:192.168.9.200 (虛拟ip)
web1:192.168.9.203 (後端真實WEB伺服器1)
web2:192.168.9.204 (後端真實WEB伺服器2)
netmask:255.255.255.0 (掩碼)
gateway:192.168.9.1 (網關)
網絡拓撲 如上圖:詳細見“LVS叢集的體系結構,建構強壯的體系結構裡負載均衡層、真實伺服器層、後端共享存儲層都是相輔相成”文章。
十二、LVS+keepalived linux伺服器通過源碼編譯安裝shell腳本
echo "============================ 更新系統時間 ======================"
yum install -y ntp
ntpdate time.nist.gov
echo "00 01 * * * /usr/sbin/ntpdate time.nist.gov" /etc/crontab
echo “========================= 安裝ipvsadm、keepalived ==================”
#Funciont: Backup website and mysql database
#Author: Jimmy Li
#Website: http://jimmyli.blog.51cto.com/
#IMPORTANT!!!Please Setting the following Values!
[root@master ~]# cd /usr/local/src
[root@master ~]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@master ~]# wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
[root@master ~]# ln -sv /usr/src/kernels/2.6.18-194.el5-i686/ /usr/src/linux
[root@master ~]# tar -zxvf ipvsadm-1.24.tar.gz
[root@master ~]# cd ipvsadm-1.24
[root@master ~]# make;make install
[root@master ~]# cd ..
[root@master ~]# tar -zxvf keepalived-1.1.17.tar.gz
[root@master ~]# cd keepalived-1.1.17
[root@master ~]# ./configure
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.
解決辦法:
[root@master ~]# yum -y install openssl-devel
[root@master ~]# ./configure
[root@master ~]# make;make install
編譯的時候出現這個提示,說明keepalived和核心結合了,如果不是這樣的,需要加上這個參數
./configure --with-kernel-dir=/kernel/path
Keepalived configuration
------------------------
Keepalived version : 1.1.17
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 : No
Use Debug flags : No
echo “======================= 配置keepalived ===========================”
[root@master ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@master ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@master ~]# mkdir /etc/keepalived
[root@master ~]# cp /usr/local/sbin/keepalived /usr/sbin/
[root@master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from [email protected] #http://jimmyli.blog.51cto.com/
smtp_server jimmyli.blog.51cto.com
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
# VIP1
vrrp_instance VI_1 {
state MASTER #備份伺服器上将MASTER改為BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 100 # 備份服務上将100改為90
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.9.200
#(如果有多個VIP,繼續換行填寫.)
virtual_server 192.168.9.200 80 {
delay_loop 6 #(每隔6秒查詢realserver狀态)
lb_algo wlc #(lvs 算法)
lb_kind DR #(Direct Route)
persistence_timeout 60 #(同一IP的連接配接60秒内被配置設定到同一台realserver)
protocol TCP #(用TCP協定檢查realserver狀态)
real_server 192.168.9.203 80 {
weight 100 #(權重)
TCP_CHECK {
connect_timeout 10 #(10秒無響應逾時)
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
real_server 192.168.9.204 80 {
weight 100
connect_timeout 10
}
[root@master ~]# service keepalived start|stop
[root@master ~]# chkconfig –level 2345 keepalived on
echo “====================== 配置realserver =========================”
[root@web_1 ~]# vi /root/lvs_real.sh
#!/bin/bash
#http://jimmyli.blog.51cto.com/
#Config realserver
SNS_VIP=192.168.9.200
/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/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"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/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 1
esac
exit 0
[root@web_1 ~]# chmod +x /roo/lvs_real.sh
[root@web_1 ~]# /root/lvs_real.sh start
[root@web_1 ~]# ifconfig
[root@web_1 ~]# echo “/root/lvs_real.sh start” >> /etc/rc.local
echo “===================== 測試LVS+keepalived ========================”
#LVS_master、LVS_backup上開啟keepalived,LVS_master先綁定VIP
LVS_master:
LVS_backup:
#解析域名,測試通路
#測試關閉LVS_master,短暫的掉包後,LVS_backup馬上接替工作
LVS_backup接替LVS_master綁定VIP
LVS_backup負責轉發
LVS_master重新開機完成後,就會自動接回控制權,繼續負責轉發
#測試關閉其中一台realserver
通過上面測試可以知道,當realserver故障或者無法提供服務時,負載均衡器通過健康檢查自動把失效的機器從轉發隊列删除掉,實作故障隔離,保證使用者的通路不受影響
#重新開機被關閉的realserver
當realserver故障恢複後,負載均衡器通過健康檢查自動把恢複後的機器添加到轉發隊列中
總結:
實際生産環境中,keepalived是非常穩定的,并且能夠承受巨量并發數。
文章中沒有涉及到後端真實伺服器的架構配置,我認為一個完整的高性能WEB架構應該,後端也是重中之重的,完整的一部分,必備可少。
本文出自 “我站在巨人肩膀上Jimmy Li” 部落格,請務必保留此出處
本文轉自jimmy_lixw 51CTO部落格,原文連結:http://blog.51cto.com/jimmyli/736648,如需轉載請自行聯系原作者