**html
**前端
隨着業務的擴展和用戶數量的增長,現有服務器的壓力不斷增長,而且隨着對系統穩定性要求的不斷提升,須要負載均衡設備對現有服務器進行負載均衡,將大量的用戶請求分發到多臺服務器上面,同時實現服務器的冗餘備份,單臺設備故障不影響系統的正常服務。
除了實現上述功能以外,還要求負載設備具備高速的流量處理能力,即要求設備不能成爲現有系統的網絡瓶頸,同時設備還要求具備較高的安全性,不能下降現有系統的安全級別。linux
一、高性能,系統必須具備高速的流量處理能力,不能成爲系統的網絡瓶頸。
二、高可靠性,系統運行穩定,單一設備故障不能影響系統的正常運行。
三、良好的系統擴充能力,隨着訪問量的增長可以知足系統擴充需求。
四、系統具備良好的可管理性。
五、不對現有的系統進行大規模的調整。web
說起IPVS就不得不提LVS(Linux vitual server),LVS是由章文嵩博士開發的一款開源軟件,其體系架構以下圖:算法
一組服務器經過高速的局域網或者地理分佈的廣域網相互鏈接,在它們的前端有一個負載調度器(Load Balancer)。負載調度器能無縫地將網絡請求調度到真實服務器上,從而使得服務器集羣的結構對客戶是透明的,客戶訪問集羣系統提供的網絡服務就像訪問一臺高性能、高可用的服務器同樣。客戶程序不受服務器集羣的影響不需做任何修改。系統的伸縮性經過在服務機羣中透明地加入和刪除一個節點來達到,經過檢測節點或服務進程故障和正確地重置系統達到高可用性。因爲這種負載調度技術是在Linux內核中實現的,因此稱之爲Linux虛擬服務器(Linux Virtual Server)。後端
在調度器的實現技術中,IP負載均衡技術是效率最高的。本文也主要講ipvs, ipvs工做在kernel中,是真正的用於實現根據定義的集羣轉發規則把客戶端的請求轉發到特定的realserver,而ipvsadm是工做在用戶空間的一個讓用戶定義ipvs規則的工具。故咱們只要在server上裝了ipvsadm軟件包就能夠定義ipvs規則,而在linux kernel的2.6版本以後kernel是直接支持ipvs的。
IPVS負載的三種模式:安全
一、Virtual Server via Network Address Translation(VS/NAT)
經過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的響應報文經過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。
bash
二、Virtual Server via IP Tunneling(VS/TUN)
採用NAT技術時,因爲請求和響應報文都必須通過調度器地址重寫,當客戶請求愈來愈多時,調度器的處理能力將成爲瓶頸。爲了解決這個問題,調度器把請求報 文經過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,因此調度器只處理請求報文。這樣集羣系統的吞吐量就有很大提高。服務器
IP隧道(IP tunneling)是將一個IP報文封裝在另外一個IP報文的技術,這可使得目標爲一個IP地址的數據報文能被封裝和轉發到另外一個IP地址。
網絡
三、Virtual Server via Direct Routing(VS/DR)
VS/DR經過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術同樣,VS/DR技術可極大地提升集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對集羣中的真實服務器也沒有必須支持IP隧道協議的要求,可是要求調度器與真實服務器都有一塊網卡連在同一物理網段上。
IPVS運做方式的比較:
注:
以上三種方法所能支持最大服務器數目的估計是假設調度器使用100M網卡,調度器的硬件配置與後端服務器的硬件配置相同,並且是對通常Web服務。使用更高的硬件配置(如千兆網卡和更快的處理器)做爲調度器,調度器所能調度的服務器數量會相應增長。當應用不一樣時,服務器的數目也會相應地改變。因此,以上數據估計主要是爲三種方法的伸縮性進行量化比較。
簡單來講:
NAT:就是數據進出都經過調度器,性能不是很好。
TUN:請求通過調度器,由後端真實服務器直接響應,必須支持隧道協議,有ip隧道的開銷,也有額外公網ip需求。
DR: 客戶端請求經過調度器,調度器轉發給真實服務器,真實服務器會直接返回給客戶端而不經過LVS,性能最好,這個模式也是最經常使用的。
針對不一樣的網絡服務需求和服務器配置,IPVS調度器實現了以下八種負載調度算法:
一、輪叫(Round Robin)
調度器經過"輪叫"調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。
二、加權輪叫(Weighted Round Robin)
調度器經過"加權輪叫"調度算法根據真實服務器的不一樣處理能力來調度訪問請求。這樣能夠保證處理能力強的服務器處理更多的訪問流量。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
三、最少連接(Least Connections)
調度器經過"最少鏈接"調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用"最小鏈接"調度算法能夠較好地均衡負載。
四、加權最少連接(Weighted Least Connections)
在集羣系統中的服務器性能差別較大的狀況下,調度器採用"加權最少連接"調度算法優化負載均衡性能,具備較高權值的服務器將承受較大比例的活動鏈接負載。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
五、基於局部性的最少連接(Locality-Based Least Connections)
"基於局部性的最少連接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用"最少連接"的原則選出一個可用的服務 器,將請求發送到該服務器。
六、帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication)
"帶複製的基於局部性最少連接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小鏈接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小鏈接"原則從這個集羣中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。
七、目標地址散列(Destination Hashing)
"目標地址散列"調度算法根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
八、源地址散列(Source Hashing)
"源地址散列"調度算法根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
使用IPVS架設的服務器集羣系統有三個部分組成:最前端的負載均衡層(Loader Balancer),中間的服務器羣組層,用Server Array表示,最底層的數據共享存儲層,用Shared Storage表示。在用戶看來全部的應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。
LVS的體系架構如圖:
ipvs常常會和keepalived配合使用以保證高可用性,下圖中是配合keepalived使用,即實現了負載,又保證了高可用。以下圖所示:
所需軟件:ipvsadm、keepalived
這兩個軟件包在系統盤中自帶,使用rpm或yum命令安裝以後進行配置便可,不須要額外的硬件設備或軟件受權需求。
注:
上圖是以簡單的web應用爲例,若是負載均衡設備和真實服務器之間加入session共享更優。
以DR模型爲例,DR模型也是用的最多的一個類型。
Keepalived環境說明
說明:
將lvs負載部分寫入到keepalived主配置文件便可,由keepalived負責調度。
修改日誌文件存放位置
(兩個節點均執行)
修改/etc/sysconfig/keepalived文件:
更改KEEPALIVED_OPTIONS="-D –d –S 0"
修改/etc/rsyslog.conf文件,添加如下行便可:
local0.* /var/log/keepalived/keepalived.log
重啓rsyslog服務:
# service rsyslog restart
以後keepalived日誌文件便可在/var/log/keepalived/keepalived.log文件中查看
配置keepalived集羣
修改主配置文件(主節點)
該配置文件中能夠加入檢查後端應用的腳本。
# cd /etc/keepalived/ # cp keepalived.conf keepalived.conf.old # >keepalived.conf # vi keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_web } #定義腳本 #vrrp_script chk_port { # script "/etc/keepalived/check_port.sh" # interval 5 #} vrrp_instance web_1 { state BACKUP interface eth0 virtual_router_id 100 priority 200 advert_int 1 authentication { auth_type PASS auth_pass 1111 } #master恢復後不搶佔 nopreempt virtual_ipaddress { 192.168.0.100 } #執行腳本 #track_script { # chk_port #} } virtual_server 192.168.0.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.0.30 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.40 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.50 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
修改主配置文件(備節點)
# cd /etc/keepalived/ # cp keepalived.conf keepalived.conf.old # >keepalived.conf # vi keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_web } vrrp_instance web_1 { state BACKUP interface eth0 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } nopreempt virtual_ipaddress { 192.168.0.100 } } virtual_server 192.168.0.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.0.30 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.40 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.50 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
這樣keepalived+lvs端即配置完畢。
Keepalived服務啓動與關閉:
啓動:# service keepalived start
關閉:# service keepalived stop
狀態查看# service keepalived status
配置realserver端
因爲負載以後是由Realserver端直接響應客戶端,因此須要在realserver端寫入vip地址並忽略arp請求,這裏以腳本的形式寫入vip,將該腳本寫入services方便控制。
這裏腳本名稱命名爲realserver,路徑爲/etc/init.d/目錄。
/etc/init.d/realserver
#!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.100 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up 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 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "LVS-DR real server Running." ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down 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 "LVS-DR real server Stopped." ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac # chkconfig realserver on # service realserver start
這樣一個簡單的ipvs的DR模型的負載均衡羣集建立完成,以後便可經過vip:port的形式訪問服務器。
原文地址:http://rdc.hundsun.com/portal...
更多幹貨,掃碼跟住喲~