訪問量超過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
安裝ipvsadm。Ipvsadm的官方下載地址為 http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz,解壓後先做一個鏈接文件,把目錄/usr/src/kernels/2.6.18-8.el5-i686/ 鏈接為/usr/src/linux,不這樣做的話,執行./configure腳本將報錯。運行命令 ln –s /usr/src/kernels/2.6.18-8.el5-i686 /usr/src/linux 做好鏈接,再運行不帶參數的腳本 ./configure,然後執行”make;make install”完成安裝
下載後,安裝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 "============================ 更新系統時間 ======================"
解決辦法:
[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 ===========================”
#Funciont: Backup website and mysql database
#Author: Jimmy Li
#Website: http://jimmyli.blog.51cto.com/
#IMPORTANT!!!Please Setting the following Values!
[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 {
[email protected]
}
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
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@master ~]# service keepalived start|stop
[root@master ~]# chkconfig –level 2345 keepalived on
echo “====================== 配置realserver =========================”
echo “===================== 測試LVS+keepalived ========================”
#LVS_master、LVS_backup上開啟keepalived,LVS_master先綁定VIP
#http://jimmyli.blog.51cto.com/
LVS_master:
LVS_backup:
#解析域名,測試訪問
#測試關閉LVS_master,短暫的掉包後,LVS_backup馬上接替工作
LVS_backup接替LVS_master綁定VIP
LVS_backup負責轉發
LVS_master重啟完成後,就會自動接回控制權,繼續負責轉發
#測試關閉其中一台realserver
通過上面測試可以知道,當realserver故障或者無法提供服務時,負載均衡器通過健康檢查自動把失效的機器從轉發隊列刪除掉,實現故障隔離,保證用戶的訪問不受影響
#重啟被關閉的realserver
當realserver故障恢復後,負載均衡器通過健康檢查自動把恢復後的機器添加到轉發隊列中
總結:
實際生產環境中,keepalived是非常穩定的,並且能夠承受巨量並發數。
文章中沒有涉及到後端真實服務器的架構配置,我認為一個完整的高性能WEB架構應該,後端也是重中之重的,完整的一部分,必備可少。
出處:http://jimmyli.blog.51cto.com/ Jimmy Li Blog 。