借助LVS+Keepalived實現負載均衡
一、負載均衡:必不可少的基礎手段
1.1 找更多的牛來拉車吧
當前大多數的互聯網系統都使用了服務器集群技術,集群即將相同服務部署在多臺服務器上構成一個集群整體對外提供服務,這些集群可以是Web應用服務器集群,也可以是數據庫服務器集群,還可以是分布式緩存服務器集群等等。
古人有云:當一頭牛拉不動車的時候,不要去尋找一頭更強壯的牛,而是用兩頭牛來拉車。
在實際應用中,在Web服務器集群之前總會有一臺負載均衡服務器,負載均衡設備的任務就是作為Web服務器流量的入口,挑選最合適的一臺Web 服務器,將客戶端的請求轉發給它處理,實現客戶端到真實服務端的透明轉發。最近幾年很火的「云計算」以及分布式架構,本質上也是將后端服務器作為計算資 源、存儲資源,由某臺管理服務器封裝成一個服務對外提供,客戶端不需要關心真正提供服務的是哪臺機器,在它看來,就好像它面對的是一臺擁有近乎無限能力的 服務器,而本質上,真正提供服務的,是后端的集群。
1.2 負載均衡的類型
負載均衡可以采用硬件設備(例如常常聽見的F5),也可以采用軟件負載。
商用硬件負載設備成本通常較高(一臺幾十萬上百萬很正常),所以在條件允許的情況下我們會采用軟件負載;
軟件負載解決的兩個核心問題是:選誰、轉發,其中最著名的是LVS(Linux Virtual Server)。
傳送門->關于負載均衡的實現方式類型等介紹請瀏覽我的另一篇博文:《大型網站技術架構》讀書筆記之六:永無止境之網站的伸縮性架構
二、初識LVS:Linux Virtual Server
2.1 LVS是神馬東西
LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
2.2 LVS有神馬作用
LVS主要用于服務器集群的負載均衡。它工作在網絡層,可以實現高性能,高可用的服務器集群技術。它廉價, 可把許多低性能的服務器組合在一起形成一個超級服務器。它易用,配置非常簡單,且有多種負載均衡的方法。它穩定可靠,即使在集群的服務器中某臺服務器無法 正常工作,也不影響整體效果。另外可擴展性也非常好。
LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服 務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例 如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。
2.3 LVS的體系結構
使用LVS架設的服務器集群系統有三個部分組成:
(1)最前端的負載均衡層,用Load Balancer表示;
(2)中間的服務器集群層,用Server Array表示;
(3)最底端的數據共享存儲層,用Shared Storage表示;
在用戶看來,所有的內部應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。
傳送門->關于體系結構的詳細介紹,請瀏覽南飛螞蟻的blog:http://ixdba.blog.51cto.com/2895551/552947
2.4 LVS負載均衡機制
(1)LVS是四層負載均衡,也就是說建立在OSI模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP,LVS支持TCP/UDP的負載均衡。因為LVS是四層負載均衡,因此它相對于其它高層負載均衡的解決辦法,比如DNS域名輪流解析、應 用層負載的調度、客戶端的調度等,它的效率是非常高的。
(2)LVS的轉發主要通過修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR模式)來實現。
①NAT模式:網絡地址轉換
NAT(Network Address Translation)是一種外網和內網地址映射的技術。 NAT模式下,網絡數據報的進出都要經過LVS的處理。LVS需要作為RS(真實服務器)的網關。當包到達LVS時,LVS做目標地址轉換(DNAT), 將目標IP改為RS的IP。RS接收到包以后,仿佛是客戶端直接發給它的一樣。RS處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP。這時RS的包通過網關(LVS)中轉,LVS會做源地址轉換(SNAT),將包的源地址改為VIP,這樣,這個包對客戶端 看起來就仿佛是LVS直接返回給它的。客戶端無法感知到后端RS的存在。
②DR模式:直接路由
DR模式下需要LVS和RS集群綁定同一個VIP(RS通過將VIP綁定在loopback實現),但與NAT的不同點在于:請求由LVS接 受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不經過LVS。詳細來看,一個請求過來時,LVS只需要將網絡幀的MAC地址修改為某一臺RS的MAC,該包就會被轉發 到相應的RS處理,注意此時的源IP和目標IP都沒變,LVS只是做了一下移花接木。RS收到LVS轉發來的包時,鏈路層發現MAC是自己的,到上面的網 絡層,發現IP也是自己的,于是這個包被合法地接受,RS感知不到前面有LVS的存在。而當RS返回響應時,只要直接向源IP(即用戶的IP)返回即可, 不再經過LVS。
(3)DR負載均衡模式數據分發過程中不修改IP地址,只修改mac地址,由于實際處理請求的真實物理IP 地址和數據請求目的IP地址一致,所以不需要通過負載均衡服務器進行地址轉換,可將響應數據包直接返回給用戶瀏覽器,避免負載均衡服務器網卡帶寬成為瓶 頸。因此,DR模式具有較好的性能,也是目前大型網站使用最廣泛的一種負載均衡手段。
三、構建實戰:LVS+Keepalived實現負載均衡
3.1 實驗結構總覽
(1)本次基于VMware Workstation搭建一個四臺Linux(CentOS 6.4)系統所構成的一個服務器集群,其中兩臺負載均衡服務器(一臺為主機,另一臺為備機),另外兩臺作為真實的Web服務器(向外部提供http服務, 這里僅僅使用了CentOS默認自帶的http服務,沒有安裝其他的類似Tomcat、Jexus服務)。
(2)本次實驗基于DR負載均衡模式,設置了一個VIP(Virtual IP)為192.168.80.200,用戶只需要訪問這個IP地址即可獲得網頁服務。其中,負載均衡主機為192.168.80.100,備機為 192.168.80.101。Web服務器A為192.168.80.102,Web服務器B為192.168.80.103。
3.2 基礎準備工作
以下工作針對所有服務器,也就是說要在四臺服務器中都要進行配置:
(1)綁定靜態IP地址
命令模式下可以執行setup命令進入設置界面配置靜態IP地址;x-window界面下可以右擊網絡圖標配置;配置完成后執行service network restart重新啟動網絡服務;
驗證:執行命令ifconfig
(2)設定主機名
①修改當前會話中的主機名,執行命令hostname xxxx (這里xxxx為你想要改為的名字)
②修改配置文件中的主機名,執行命令vi /etc/sysconfig/network (√一般需要進行此步湊才能永久更改主機名)
驗證:重啟系統reboot
(3)IP地址與主機名的綁定
執行命令vi /etc/hosts,增加一行內容,如下(下面的從節點以你自己的為主,本實驗搭建了兩個從節點):
192.168.80.100 lvs-master
192.168.80.101 lvs-slave
#下面是本次試驗的兩個真實服務器節點
192.168.80.102 lvs-webserver1
192.168.80.103 lvs-webserver2
保存后退出
驗證:ping lvs-master
(4)關閉防火墻
①執行關閉防火墻命令:service iptables stop
驗證:service iptables stauts
②執行關閉防火墻自動運行命令:chkconfig iptables off
驗證:chkconfig --list | grep iptables
3.3 配置兩臺Web服務器
以下操作需要在角色為Web服務器的兩臺中進行,不需要在負載均衡服務器中進行操作:
(1)開啟http服務
命令:service httpd start
補充:chkconfig httpd on -->將httpd設為自啟動服務
(2)在宿主機訪問Web網頁,并通過FTP工具上傳自定義網頁:這里上傳一個靜態網頁,并通過更改其中的html來區別兩臺Web服務器,以下圖所示為例,其中一臺顯示from 192.168.80.102,而另一臺顯示from 192.168.80.103;
(3)編輯realserver腳本文件
①進入指定文件夾:cd /etc/init.d/
②編輯腳本文件:vim realserver
SNS_VIP=192.168.80.200 /etc/rc.d/init.d/functions case "$1" in start) 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) 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 1 esac exit 0
這里我們設置虛擬IP為:192.168.80.200
③保存腳本文件后更改該文件權限:chmod 755 realserver
④開啟realserver服務:service realserver start
3.4 配置主負載服務器
(1)安裝Keepalived相關包
yum install -y keepalived
在CentOS下,通過yum install命令可以很方便地安裝軟件包,但是前提是你的虛擬機要聯網;
(2)編輯keepalived.conf配置文件
①進入keepalived.conf所在目錄:cd /etc/keepalived
②首先清除掉keepalived原有配置:> keepalived.conf
③重新編輯keepalived配置文件:vi keepalived.conf
global_defs { notification_email { edisonchou@hotmail.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.80.1 smtp_connection_timeout 30 router_id LVS_DEVEL # 設置lvs的id,在一個網絡內應該是唯一的 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色,MASTER為主,BACKUP為備 interface eth1 #指定Keepalived的角色,MASTER為主,BACKUP為備 virtual_router_id 51 #虛擬路由編號,主備要一致 priority 100 #定義優先級,數字越大,優先級越高,主DR必須大于備用DR advert_int 1 #檢查間隔,默認為1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.200 #定義虛擬IP(VIP)為192.168.2.33,可多設,每行一個 } } # 定義對外提供服務的LVS的VIP以及port virtual_server 192.168.80.200 80 { delay_loop 6 # 設置健康檢查時間,單位是秒 lb_algo wrr # 設置負載調度的算法為wlc lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式 nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.80.102 80 { # 指定real server1的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.80.103 80 { # 指定real server2的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
(3)開啟keepalived服務
service keepalived start
3.5 配置從負載服務器
從負載服務器與主負載服務器大致相同,只是在keepalived的配置文件中需要改以下兩處:
(1)將state由MASTER改為BACKUP
(2)將priority由100改為99
vrrp_instance VI_1 { state BACKUP # 這里改為BACKUP interface eth1 virtual_router_id 51 priority 99 # 這里改為99,master優先級是100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.200 } }
3.6 驗證性測試
(1)指定請求的均衡轉發:因為兩個Web服務器的權重都一樣,所以會依次轉發給兩個Web服務器;
(2)Web服務器發生故障時:
①A發生故障后,只從B獲取服務;
這里模擬192.168.80.102發生故障,暫停其http服務:service httpd stop
再來看看這時從外部訪問VIP時,便會只從192.168.80.103獲取網頁:
②A故障修復后,又從A獲取服務;
這里模擬192.168.80.102修復完成,重啟其http服務:service httpd start
再來看看這時從外部訪問VIP,又可以從192.168.80.102獲取網頁:
(3)主負載均衡服務器發生故障時,備機立即充當主機角色提供請求轉發服務:
這里模擬192.168.80.100發生故障,暫停其keepalived服務:service keepalived stop
再來看看這時從外部訪問VIP,還是可以正常獲取網頁:
學習小結
LVS是目前廣為采用的軟件負載均衡解決方案,在一些大型企業級系統及互聯網系統中應用。本次,簡單地了解了一下LVS,并在Linux下搭建 了一個小小的測試環境,借助Keepalived實現了一個最小化的負載均衡測試環境。LVS是一個可以工作在網絡第四層的負載均衡軟件,因此它相對于 Nginx一類工作在第七層的負載均衡軟件有著無可比擬的性能優勢,而且它還是我國的章文嵩博士(現在阿里的副總裁,淘寶的技術專家)作為創始人發起的, 現已經成為Linux內核的組成部分。
當然,目前流行的LVS解決方案中,在Web服務器端也有采用了Nginx+Tomcat這樣的搭配類型,靜態文件和動態文件分開進行處理,也 不失為一種有效的嘗試。在以后的日子里,我還會嘗試下在Linux下借助Jexus跑ASP.NET MVC項目,試試.NET項目在Linux下的運行效果,希望到時也可以做一些分享。好了,今天就到此停筆。
原文:http://www.cnblogs.com/edisonchou/p/4281978.html 作者: 周旭龍
本文為轉載,如需再次轉載,請查看源站 “cnblogs.com” 的要求。如果我們的工作有侵犯到您的權益,請及時聯系我們。