藉助 LVS + Keepalived 實現負載均衡

 

雖然如今雲手段很高明瞭。可是這個lvs + keepalive 仍是須要了解下的。html

今天就整理了下lvs和keepalive的東西。作下總結留做之後懷念前端

 

    在實際應用中,在Web服務器集羣以前總會有一臺負載均衡服務器,負載均衡設備的任務就是做爲Web服務器流量的入口,挑選最合適的一臺Web服務器,將客戶端的請求轉發給它處理,實現客戶端到真實服務端的透明轉發。
最近幾年很火的「雲計算」以及分佈式架構,本質上也是將後端服務器做爲計算資源、存儲資源,由某臺管理服務器封裝成一個服務對外提供,客戶端不須要關心真正提供服務的是哪臺機器,在它看來,就好像它面對的是一臺擁有
近乎無限能力的服務器,而本質上,真正提供服務的,是後端的集羣。

負載均衡的類型

  負載均衡能夠採用硬件設備(例如經常聽見的F5),也能夠採用軟件負載。
  商用硬件負載設備成本一般較高(一臺幾十萬上百萬很正常),因此在條件容許的狀況下咱們會採用軟件負載;
  軟件負載解決的兩個核心問題是:選誰、轉發,其中最著名的是LVS(Linux Virtual Server)。

傳送門->關於負載均衡的實現方式類型等介紹請瀏覽個人另外一篇博文:《大型網站技術架構》讀書筆記之六:永無止境之網站的伸縮性架構linux

LVS:Linux Virtual Server

1 LVS是神馬東西

  LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。如今LVS已是 Linux標準內核的一部分,在Linux2.4內核之前,使用LVS時必需要從新編譯內核以支持LVS功能模塊,可是從Linux2.4內核之後,已經徹底內置了LVS的各個功能模塊,無需給內核打任何補丁,能夠直接使用LVS提供的各類功能。nginx

 2 LVS有神馬做用

  LVS主要用於服務器集羣的負載均衡。它工做在網絡層,能夠實現高性能,高可用的服務器集羣技術。它廉價,可把許多低性能的服務器組合在一塊兒造成一個超級服務器。它易用,配置很是簡單,且有多種負載均衡的方法。它穩定可靠,即便在集羣的服務器中某臺服務器沒法正常工做,也不影響總體效果。另外可擴展性也很是好。web

  LVS自從1998年開始,發展到如今已是一個比較成熟的技術項目了。能夠利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集羣系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。算法

3 LVS的體系結構

  使用LVS架設的服務器集羣系統有三個部分組成:apache

  (1)最前端的負載均衡層,用Load Balancer表示;vim

  (2)中間的服務器集羣層,用Server Array表示;windows

  (3)最底端的數據共享存儲層,用Shared Storage表示;後端

  在用戶看來,全部的內部應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。

傳送門->關於體系結構的詳細介紹,請瀏覽南飛螞蟻的blog:http://ixdba.blog.51cto.com/2895551/552947

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實現負載均衡

1 實驗結構總覽

  (1)本次基於VMware Workstation搭建一個四臺Linux(CentOS 6.4)系統所構成的一個服務器集羣,其中兩臺負載均衡服務器(一臺爲主機,另外一臺爲備機),另外兩臺做爲真實的Web服務器(向外部提供http服務,這裏僅僅使用了CentOS默認自帶的http服務,沒有安裝其餘的相似Tomcat、Jexus服務)。

  (2)本次實驗基於DR負載均衡模式,設置了一個VIP(Virtual IP)爲10.0.0.88,用戶只須要訪問這個IP地址便可得到網頁服務。其中,負載均衡主機爲10.0.0.5,備機爲10.0.0.6。Web服務器A爲10.0.0.7,Web服務器B爲10.0.0.8。

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,增長一行內容,以下(下面的從節點以你本身的爲主,本實驗搭建了兩個從節點):

  10.0.0.5 lvs-master

  10.0.0.6 lvs-slave

  #下面是本次試驗的兩個真實服務器節點

  10.0.0.7 lvs-webserver1

  10.0.0.8 lvs-webserver2

  保存後退出

  驗證:ping lvs-master

  (4)關閉防火牆

  ①執行關閉防火牆命令:service iptables stop

      驗證:service iptables stauts

  ②執行關閉防火牆自動運行命令:chkconfig iptables off

  驗證:chkconfig --list | grep iptables

 3 配置兩臺Web服務器

  如下操做須要在角色爲Web服務器的兩臺中進行,不須要在負載均衡服務器中進行操做:

  (1)開啓http服務

  命令:service httpd start

  補充:chkconfig httpd on -->將httpd設爲自啓動服務

  (2)在宿主機訪問Web網頁,並經過FTP工具上傳自定義網頁:我直接編寫html文件,如下圖所示爲例,其中一臺顯示from 10.0.0.7,而另外一臺顯示from 10.0.0.8;

  (3)編輯realserver腳本文件

  ①進入指定文件夾:cd /etc/init.d/

  ②編輯腳本文件:vim realserver

# cat /etc/init.d/realserver 
SNS_VIP=10.0.0.88
. /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爲:10.0.0.88

  ③保存腳本文件後更改該文件權限:chmod 755 realserver

  ④開啓realserver服務:service realserver start

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

# cat /etc/keepalived/keepalived.conf
global_defs {  
   notification_email {  
         liulei03@nq.com  
   }  
   notification_email_from liulei03@nq.com
   smtp_server 192.168.80.1  
   smtp_connection_timeout 30
   router_id LVS_DEVEL
}  
vrrp_instance VI_1 {  
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        10.0.0.88
    }  
}  
# 定義對外提供服務的LVS的VIP以及port
virtual_server 10.0.0.88 80 {  
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0                
    persistence_timeout 0          
    protocol TCP                  
    real_server 10.0.0.8 80 {
        weight 3
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
    }  
    real_server 10.0.0.7 80 {
        weight 3
        TCP_CHECK {  
        connect_timeout 10  
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
     }  
}

(3)開啓keepalived服務

service keepalived start

5 配置從負載服務器

  從負載服務器與主負載服務器大體相同,只是在keepalived的配置文件中須要改如下兩處:

  (1)將state由MASTER改成BACKUP

  (2)將priority由100改成99

# cat /etc/keepalived/keepalived.conf
global_defs {  
   notification_email {  
         liulei03@nq.com  
   }  
   notification_email_from liulei03@nq.com
   smtp_server 192.168.80.1  
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 設置lvs的id,在一個網絡內應該是惟一的
}  
vrrp_instance VI_1 {  
    state BACKUP   #指定Keepalived的角色,MASTER爲主,BACKUP爲備          
    interface eth0  #指定Keepalived的角色,MASTER爲主,BACKUP爲備
    virtual_router_id 51  #虛擬路由編號,主備要一致
    priority 99  #定義優先級,數字越大,優先級越高,主DR必須大於備用DR    
    advert_int 1  #檢查間隔,默認爲1s
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        10.0.0.88  #定義虛擬IP(VIP)爲10.0.0.88,可多設,每行一個
    }  
}  
# 定義對外提供服務的LVS的VIP以及port
virtual_server 10.0.0.88 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 10.0.0.8 80 {  # 指定real server1的IP地址
        weight 3   # 配置節點權值,數字越大權重越高              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
    }  
    real_server 10.0.0.7 80 {  # 指定real server2的IP地址
        weight 3  # 配置節點權值,數字越大權重越高  
        TCP_CHECK {  
        connect_timeout 10  
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
     }  
}

 (4)重啓keepalived 和 realserver

# for i in lb01 lb02 web01 web02;do ssh $i '/etc/init.d/realserver start' ;done  
# for i in lb01 lb02;do ssh $i '/etc/init.d/keepalived  restart' ;done

備註:這個能夠本身在管理及上實現

6 驗證性測試

(1)指定請求的均衡轉發:由於兩個Web服務器的權重都同樣,因此會依次轉發給兩個Web服務器;

備註:由於這個html的測試頁面,若是有windows 直接打開頁面的話,可能會有緩存(瀏覽器緩存)致使顯示只有一個apache或者nginx測試頁面。

學習小結

  LVS是目前廣爲採用的軟件負載均衡解決方案,在一些大型企業級系統及互聯網系統中應用。本次,簡單地瞭解了一下LVS,並在Linux下搭建了一個小小的測試環境,藉助Keepalived實現了一個最小化的負載均衡測試環境。LVS是一個能夠工做在網絡第四層的負載均衡軟件,所以它相對於Nginx一類工做在第七層的負載均衡軟件有着無可比擬的性能優點,並且它仍是我國的章文嵩博士(如今阿里的副總裁,淘寶的技術專家)做爲創始人發起的,現已經成爲Linux內核的組成部分。

  固然,目前流行的LVS解決方案中,在Web服務器端也有采用了Nginx+Tomcat這樣的搭配類型,靜態文件和動態文件分開進行處理,也不失爲一種有效的嘗試。在之後的日子裏,我還會嘗試下在Linux下藉助Jexus跑ASP.NET MVC項目,試試.NET項目在Linux下的運行效果,但願到時也能夠作一些分享。好了,今天就到此停筆。

參考資料

(1)王晨純,《Web基礎架構:負載均衡和LVS》:http://www.importnew.com/11229.html

(2)win_xp,《LVS簡介及使用》:http://www.cnblogs.com/codebean/archive/2011/07/25/2116043.html

(3)jiwang1980,《LVS+Keepalived》:http://7567567.blog.51cto.com/706378/578289

(4)南飛螞蟻的BLOG,《Linux負載均衡軟件LVS之概念篇》:http://ixdba.blog.51cto.com/2895551/552947

(5)AKing王國,《四層和七層負載均衡的區別》:http://kb.cnblogs.com/page/188170/

相關文章
相關標籤/搜索