LVS中文站點 http://zh.linuxvirtualserver.org/ html
ipvs和keepalived的區別:前端
1. ipvsadm(LVS)有負載均衡機制,目前支持8中均衡算法。是負載均衡的核心軟件.即將客戶端的需求採用特定的負載均衡算法分發到後端的Web應用服務器上。 2. keepalived是HA就是高可用,做用熱備和健康檢測,也具有負載均衡功能。如今他的健康檢查功能用的比較多,即保證主LVS宕機後,從LVS能夠在很短期頂上,從而保證了系統或網站的穩定性。 3. lvs+keepalived這種框架下,徹底可使用keepalived來均衡負載(ipvsadm這個組件也須要裝上,只是爲了便於管理集羣)。
1、 LVS簡介linux
LVS: Linux Virtual Server的縮寫,意思是Linux虛擬服務器,是一個虛擬的服務器集羣系統。算法
LVS是一個開源的軟件,由畢業於國防科技大學的章文嵩博士於1998年5月創立,能夠實現LINUX平臺下的簡單負載均衡windows
宗旨:後端
使用集羣技術和Linux操做系統實現一個高性能、高可用的服務器.bash
很好的可伸縮性(Scalability)服務器
很好的可靠性(Reliability)網絡
很好的可管理性(Manageability)session
2、技術原理:
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),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
3、LVS集羣的特色
一、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 繼續向外提供服務;
二、負載調度算法
上面咱們談到,負載調度器是根據各個服務器的負載狀況,動態地選擇一臺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): 不在考慮非活動鏈接數
4、安裝部署
一、基礎環境
# 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管理軟件了
二、在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
三、安裝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服務。 test@126.com } 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