LVS中文站點 http://zh.linuxvirtualserver.org/
ipvs和keepalived的區別:
1. ipvsadm(LVS)有負載均衡機制,目前支持8中均衡算法。是負載均衡的核心軟件.即將客戶端的需求採用特定的負載均衡算法分發到後端的Web應用服務器上。 2. keepalived是HA就是高可用,作用熱備和健康檢測,也具備負載均衡功能。現在他的健康檢查功能用的比較多,即保證主LVS宕機後,從LVS可以在很短時間頂上,從而保證了系統或網站的穩定性。 3. lvs+keepalived這種框架下,完全可以使用keepalived來均衡負載(ipvsadm這個組件也需要裝上,只是爲了便於管理集羣)。
一、 LVS簡介
LVS: Linux Virtual Server的縮寫,意思是Linux虛擬服務器,是一個虛擬的服務器集羣系統。
LVS是一個開源的軟件,由畢業於國防科技大學的章文嵩博士於1998年5月創立,可以實現LINUX平臺下的簡單負載均衡
宗旨:
使用集羣技術和Linux操作系統實現一個高性能、高可用的服務器.
很好的可伸縮性(Scalability)
很好的可靠性(Reliability)
很好的可管理性(Manageability)
二、技術原理:
LVS由前端的負載均衡器(Load Balancer,LB)和後端的真實服務器(Real Server,RS)羣組成。RS間可通過局域網或廣域網連接。LVS的這種結構對用戶是透明的,用戶只能看見一臺作爲LB的虛擬服務器(Virtual Server),而看不到提供服務的RS羣。
當用戶的請求發往虛擬服務器,LB根據設定的包轉發策略和負載均衡調度算法將用戶請求轉發給RS。RS再將用戶請求結果返回給用戶。同請求包一樣,應答包的返回方式也與包轉發策略有關。
LVS集羣採用“IP負載均衡技術”和“基於內容請求分發技術”。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
LVS集羣採用三層結構,其主要組成部分爲:
1)負載調度器(Load Balancer),位於整個集羣系統的最前端,有一臺或者多臺負載調度器(Director Server)組成,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。 2)服務器池(Server Pool),是一組真正執行客戶請求的服務器(Real Server),執行的服務有WEB、MAIL、FTP和DNS等。 3)共享存儲(Shared Storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
三、LVS集羣的特點
1、IP負載均衡技術
負載均衡技術有很多實現方案,有基於DNS域名輪流解析的方法、有基於客戶端調度訪問的方法、有基於應用層系統負載的調度方法,還有基於IP地址的調度方法,在這些負載調度算法中,執行效率最高的是IP負載均衡技術。
LVS的IP負載均衡技術是通過IPVS模塊來實現的,IPVS是LVS集羣系統的核心軟件,它的主要作用是:
安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱爲LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。
當用戶的請求到達負載調度器後,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是IPVS實現的重點技術,IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR,詳述如下
CIP Client computer's IP address:公網IP,客戶端使用的IP。 VIP Virtual IP address:Director用來向客戶端提供服務的IP地址 RIP Real IP address:集羣節點(後臺真正提供服務的服務器)所使用的IP地址 DIP Director's IP address:Director用來和D/RIP 進行聯繫的地址
a) VS/NAT: 即(Virtual Server via Network Address Translation)
通過NAT網絡地址轉換技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最後將報文請求發送到選定的Real Server。在服務器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然後把數據發送給用戶,完成整個負載調度過程。
可以看出,在NAT方式下,用戶請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,調度器的處理能力將稱爲瓶頸。
原理簡述: 目標地址轉換,所有客戶端的請求都被Director根據訪問請求和算法被定向到後臺的Real Server 上.
數據包地址轉換過程: CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> RIP --> Director --> VIP --> CIP
特點: Director和Real Server必須在同一個網段中; 一般情況下,RIP是私有地址,只用於集羣內部節點間通信; Director 會響應所有的請求在客戶端和Real Server之間,所承擔的負載較大; 所有的Real IP 網關必須指向DIP以響應客戶端請求; Director可以重映射網絡端口,即前端使用標準端口,後端可以使用非標準端口; 後臺的Real Server可以使用任何操作系統; Director可能會成爲系統瓶頸。
b)VS/TUN :即(Virtual Server via IP Tunneling)
通過IP隧道技術實現虛擬服務器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器採用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網絡。因此,在TUN方式中,調度器將只處理用戶的報文請求,集羣系統的吞吐量大大提高。
數據包傳輸過程: CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> VIP --> CIP
特點: 與DR的網絡結構一樣,但Director和Real Server可以在不同的網絡當中,可以實現異地容災的功能。DIP-->VIP 基於隧道來傳輸,在數據包外層額外封裝了S:DIP D:RIP 的地址。 Director和Real Server 必須在同一個物理網絡中; RIP一定不能是私有地址; Director只負責處理進來的數據包; Real Server直接將數據包返回給客戶端,所以Real Server默認網關不能是DIP,必須是公網上某個路由器的地址; Director不能做端口重映射; 只有支持隧道協議的操作系統才能作爲Real Server。
c)VS/DR: 即(Virtual Server via Direct Routing)
通過直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。
這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上。
數據包傳輸過程: CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> RIP --> CIP
特點: Real Server上必須配置VIP切需要隱藏起來,只有在響應客戶端請求時才使用VIP作爲源地址,除此之外並不使用此VIP. 集羣節點和Director必須在同一個網絡中; RIP不要求爲私有地址; Director僅處理所有進來的請求; Real Server 不能以DIP作爲網關,而是以公網上的某臺路由器作爲網關; Director 不能再使用端口重映射; 大多數操作系統可以被用來作爲Real Server,windows除外; LVS-DR模式可以處理比LVS-NAT更多的請求。 實際生產環境中最常用的一種方式,優點: RIP 爲公網地址,管理員可以遠程連接Real Server來查看工作狀態; 一旦Director 宕機,可以通過修改DNS記錄將A記錄指向RIP 繼續向外提供服務;
2、負載調度算法
上面我們談到,負載調度器是根據各個服務器的負載情況,動態地選擇一臺Real Server響應用戶請求,那麼動態選擇是如何實現呢,其實也就是我們這裏要說的負載調度算法,根據不同的網絡服務需求和服務器配置,IPVS實現瞭如下八種負載調度算法,這裏我們詳細講述最常用的四種調度算法,剩餘的四種調度算法請參考其它資料。
a)RR 輪詢調度(Round Robin)
“輪詢”調度也叫1:1調度,調度器通過“輪詢”調度算法將外部用戶請求按順序1:1的分配到集羣中的每個Real Server上,這種算法平等地對待每一臺Real Server,而不管服務器上實際的負載狀況和連接狀態。
b)WRR 加權輪詢調度(Weighted Round Robin)
“加權輪詢”調度算法是根據Real Server的不同處理能力來調度訪問請求。可以對每臺Real Server設置不同的調度權值,對於性能相對較好的Real Server可以設置較高的權值,而對於處理能力較弱的Real Server,可以設置較低的權值,這樣保證了處理能力強的服務器處理更多的訪問流量。充分合理的利用了服務器資源。同時,調度器還可以自動查詢Real Server的負載情況,並動態地調整其權值。
c)LC 最少鏈接調度(Least Connections)
“最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集羣系統的真實服務器具有相近的系統性能,採用“最小連接”調度算法可以較好地均衡負載。
d)WLC 加權最少鏈接調度(Weighted Least Connections)
“加權最少鏈接調度”是“最少連接調度”的超集,每個服務節點可以用相應的權值表示其處理能力,而系統管理員可以動態的設置相應的權值,缺省權值爲1,加權最小連接調度在分配新連接請求時儘可能使服務節點的已建立連接數和其權值成正比。
e)WRR 加權輪詢 (Weighted round-robin):給每臺Real Server分配一個權重/位列,權重越大,分到的請求數越多。
f)DH 目標散列 (Destination hashing):來自於同一個IP地址的請求都被重定向到同一臺Real Server上(保證目標地址不變)
g)SH 源地址散列(Source hashing): Director必須確保響應的數據包必須通過請求數據包所經過的路由器或者防火牆(保證源地址不變)
h)SED 最短期望延遲 (Short餓死他 Expected Delay): 不在考慮非活動連接數
四、安裝部署
1、基礎環境
# yum install openssl openssl-devel openssh-clients gcc libnl* popt*
Linux內核大於2.6 版本的,都默認支持LVS功能
可以通過如下命令檢查kernel是否已經支持LVS的ipvs模塊
# modprobe -l |grep ipvs /lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_rr.ko /lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_sh.ko
如果有類似上面的輸出,表明系統內核已經默認支持了IPVS模塊。接着就可以安裝IPVS管理軟件了
2、在Director Serve上源碼安裝IPVS管理軟件
下載ipvs管理軟件ipvsadm http://www.linuxvirtualserver.org/software/ipvs.html
# tar zxvf ipvsadm-1.24.tar.gz # cd ipvsadm-1.24 # make && make install # ipvsadm --help 修改配置文件 /etc/rc.d/init.d/ipvsadm # 啓動LVS服務 # ipvsadm
ipvsadm 常用語法及格式:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f virtual-service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f virtual-service-address -r real-server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f virtual-service-address] ipvsadm --set tcp tcpfin udp ipvsadm –h -A --add-service 在內核的虛擬服務器列表中添加一條新的虛擬IP記錄。也就是增加一臺新的虛擬服務器 -E --edit-service 編輯內核虛擬服務器列表中的一條虛擬服務器記錄 -D --delete-service 刪除內核虛擬服務器列表中的一條虛擬服務器記錄 -C --clear 清除內核虛擬服務器列表中的所有記錄 -R --restore 恢復虛擬服務器規則 -S --save 保存虛擬服務器規則,輸出爲-R 選項可讀的格式 -a --add-server 在內核虛擬服務器列表的一條記錄裏添加一天新的Real Services記錄。也就是在一個虛擬服務器中添加一臺新的RealServer -e --edit-server 編輯一條虛擬服務器記錄中的某條Real Server記錄 -d --delete-server 刪除一條虛擬服務器記錄中的某條Real Server記錄 -L --list 顯示內核中虛擬服務器列表 -L --timeout 顯示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout -L --daemon 顯示同步守護進程狀態,例如:ipvsadm -L –daemon -L --stats 顯示統計信息,例如:ipvsadm -L –stats -L --rate 顯示速率信息,例如:ipvsadm -L --rate -L --sort 對虛擬服務器和真實服務器排序輸出,例如:ipvsadm -L --sort -Z --zero 虛擬服務器列表計數器清零 清空當前的連接數量 --set tcp tcpfin udp 設置連接超時值 -t 說明虛擬服務器提供的是tcp 服務,此選項後面跟如下格式: [virtual-service-address:port] or [real-server-ip:port] -u 說明虛擬服務器提供的是udp 服務,此選項後面跟如下格式: [virtual-service-address:port] or [real-server-ip:port] -f fwmark 說明是經過iptables標記過的服務類型 -s 此選項後面跟LVS使用的調度算法 有這樣幾個選項: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,默認算法是wlc -p timeout 在某個Real Server上持續的服務時間。也就是說來自同一個用戶的多次請求,將被同一個Real Server處理。此參數一般用於有動態請求的操作中,timeout 的默認值爲300 秒。例如:-p 600,表示持續服務時間爲600秒。 -r 指定Real Server的IP地址,此選項後面跟如下格式: [real-server-ip:port] -g --gatewaying 指定LVS的工作模式爲直接路由模式DR(此模式是LVS 默認工作模式) -i -ipip 指定LVS 的工作模式爲隧道模式TUN -m --masquerading 指定LVS 的工作模式爲NAT模式 -w --weight weight 指定Real Server的權值 -c --connection 顯示LVS目前的連接信息 如:ipvsadm -Lnc
3、安裝keepalived
yum install daemon tar zxvf cd keepalived-1.2.13.tar.gz ./configure make && make install cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ # 啓動腳本 mkdir -pv /etc/keepalived cp /usr/local/sbin/keepalived /usr/sbin/ # 修改主配置文件 /etc/keepalived/keepalived.conf service keepalived start Keepalived啓動後會有三個進程: 父進程:內存管理,子進程管理 子進程:VRRP子進程 子進程:healthchecker子進程 # 開機自啓動 chkconfig --add keepalived chkconfig --level 35 keepalived on
主配置文件詳細說明 keepalived.conf
# 說明 # VIP 101.25.10.12 10.10.10.12 # Real Server1 101.25.10.13 10.10.10.13 # Real Server2 101.25.10.14 10.10.10.14 # ! Configuration File for keepalived # 全局定義部分 global_defs { notification_email { root@localhost # 設置報警郵件地址,可以設置多個,每行一個。注意,如果要開啓郵件報警,需要開啓本機的sendmail服務。 [email protected] } notification_email_from root@localhost # 設置郵件的發送地址 smtp_server 127.0.0.1 # 設置smtp server地址 smtp_connect_timeout 30 # 設置連接smtp服務器超時時間 router_id LVS_DEVEL # 運行Keepalived服務器的一個標識。發郵件時顯示在郵件標題中的信息 } vrrp_instance VI_1 { # 定義外網 state MASTER # 指定Keepalived的角色,MASTER表示此主機是主用服務器,BACKUP表示是備用服務器 interface eth1 # 指定HA監測網絡的接口 virtual_router_id 1 # 虛擬路由標識,這個標識是一個數字,並且同一個vrrp實例使用唯一的標識,即同一個vrrp_instance下,MASTER和BACKUP必須是一致的。 priority 101 # 定義優先級,數字越大,優先級越高,在一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 # 設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication # 設定驗證類型和密碼 { auth_type PASS # 設置驗證類型,主要有PASS和AH兩種 auth_pass xde.146_5%DJYP # 設置驗證密碼,在一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信 } virtual_ipaddress # 設置虛擬IP地址,可以設置多個虛擬IP地址,每行一個 { 101.25.10.12 # 虛擬外網ip } } # 虛擬服務器定義部分 virtual_server 101.25.10.12 80 # 設置虛擬服務器,需要指定虛擬ip地址和服務端口,ip與端口之間用空格隔開 { delay_loop 2 # 設置健康檢查時間,單位是秒 lb_algo wrr # 設置負載調度算法,這裏設置爲wrr,即最少鏈接調度 lb_kind DR # 設置負載均衡轉發規則,可以有NAT、TUN和DR三個模式可選 persistence_timeout 0 # 會話保持時間,單位是秒,這個選項對於動態網頁是非常有用的,爲集羣系統中session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話保持時間。需要注意的是,這個會話保持時間,是最大無響應超時時間,也就是說用戶在操作動態頁面時,如果在50秒內沒有執行任何操作,那麼接下來的操作會被分發到另外節點,但是如果一直在操作動態頁面,則不受50秒的時間限制 protocol TCP # 指定轉發協議類型,有tcp和udp兩種 nat_mask 255.255.255.240 gateway 101.25.10.25 real_server 101.25.10.13 80 # 配置服務節點1,需要指定real server的真實IP地址和端口,ip與端口之間用空格隔開 { weight 1 # 設置權重,權值大小用數字表示,數字越大,權值越高,設置權值的大小可以爲不同性能的服務器分配不同的負載,可以對性能高的服務器設置較高的權值,而對性能較低的服務器設置相對較低的權值,這樣就合理的利用和分配了系統資源 TCP_CHECK # realserve的狀態檢測設置部分,單位是秒 { connect_timeout 3 # 3秒無響應超時 nb_get_retry 3 # 重試次數 delay_before_retry 3 # 重試間隔 } } real_server 101.25.10.14 80 # 配置服務節點2 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } # 以下內容是定義內網的ip/vip及其real server,和上面內容相似,只是ip做了對應修改 vrrp_instance VI_2 { # 定義內網 state BACKUP interface eth0 virtual_router_id 1 priority 100 advert_int 1 authentication { auth_type PASS auth_pass xde.146_5%DJYP } virtual_ipaddress { 10.10.10.12 } } virtual_server 10.10.10.12 80 { delay_loop 2 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 gateway 10.10.10.1 persistence_timeout 0 protocol TCP real_server 10.10.10.13 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.10.10.14 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
在配置Keepalived.conf時,需要特別注意配置文件的語法格式,因爲Keepalived在啓動時並不檢測配置文件的正確性,即使沒有配置文件,Keepalived也照樣能啓動起來,因而配置文件一定要正確。
在默認情況下,Keepalived在啓動時會查找/etc/Keepalived/Keepalived.conf配置文件,如果你的配置文件放在了其它路徑下,可以通過“Keepalived -f”參數指定你所在的配置文件路徑即可。
Keepalived.conf配置完畢後,將此文件拷貝到備用Director Server對應的路徑下,然後做兩個簡單的修改即可:
將“state MASTER”更改爲“state BACKUP” 將priority 100更改爲一個較小的值,這裏改爲“priority 80”
配置 Real server
最後,還要配置集羣的Real server節點,以達到與Director Server相互廣播通信並忽略arp的目的。
# 下面是在客戶端realserver是執行的腳步 cat lvs_real.sh,主要是添加虛擬ip,和抑制 arp 廣播,需要在每個Real Server節點上執行
#!/bin/bash #FileName: lvs_real.sh #Description : start realserver VIP0=101.25.10.12 # 虛擬外網ip VIP1=10.10.10.12 # 虛擬內外ip /etc/rc.d/init.d/functions case "$1" in start) echo "start LVS of REALServer" /sbin/ifconfig lo:0 $VIP0 broadcast $VIP0 netmask 255.255.255.255 up # vip 被綁定在環回接口 lo:0 上,其廣播地址是其本身,子網掩碼是 255.255.255.255 /sbin/ifconfig lo:1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up # vip 被綁定在環回接口 lo:1 上,其廣播地址是其本身,子網掩碼是 255.255.255.255 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore # 抑制 arp 廣播 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 ;; stop) /sbin/ifconfig lo:0 down /sbin/ifconfig lo:1 down echo "close LVS Directorserver" 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 "Usage: $0 {start|stop}" exit 1 esac
LVS的配置
啓動LVS服務 # ipvsadm -C # 清除LVS設置 lvs的master上添加負載均衡器(虛擬服務) # ipvsadm -A -t 10.10.10.100:80 -s rr 爲虛擬服務增加realserver主機 # ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.201:80 -g # 10.10.10.201 是真實機的ip # ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.202:80 -g # 10.10.10.201 是真實機的ip,-g表示DR模式 # route add -host $LVS_VIP dev lo:0 # 添加虛擬ip路由 這些命令只能使用一次,第二次會有提示已經輸入該命令 在master負載均衡器上查看LVS當前負載情況 # ipvsadm -L -n