一、簡介
? ?LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
? ?使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。
? ?LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。
二、拓撲圖
? ?說明:1.客戶端只知道我們的LVS的VIP的地址
? ? ? ? ?2.由于服務器有限,此處我們的apache和php做在一臺機器上
三。調度算法
? ?Director在接收到來自于Client的請求時,會基于"schedule"從RealServer中選擇一個響應給Client。ipvs支持以下調度算法:
? ?1、輪詢(round robin, rr),加權輪詢(Weighted round robin, wrr)——新的連接請求被輪流分配至各RealServer;算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。輪叫調度算法假設所有服務器處理性能均相同,不管服務器的當前連接數和響應速度。該算法相對簡單,不適用于服務器組中處理性能不一的情況,而且當請求服務時間變化比較大時,輪叫調度算法容易導致服務器間的負載不平衡。
? ?2、最少連接(least connected, lc), 加權最少連接(weighted least connection, wlc)——新的連接請求將被分配至當前連接數最少的RealServer;最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中止或超時,其連接數減一。
? ?3、基于局部性的最少鏈接調度(Locality-Based Least Connections Scheduling,lblc)——針對請求報文的目標IP地址的負載均衡調度,目前主要用于Cache集群系統,因為在Cache集群中客戶請求報文的目標IP地址是變化的。這里假設任何后端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存Cache命中率,從而整個集群系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于其一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。
? ?4、帶復制的基于局部性最少鏈接調度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而 LBLC算法維護從一個目標IP地址到一臺服務器的映射。對于一個“熱門”站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從所有的Cache服務器中按“最小連接”原則選出一臺Cache服務器,映射該“熱門”站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重復上述過程選出新的Cache服務器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache服務器上,降低了Cache服務器的使用效率。LBLCR調度算法將“熱門”站點映射到一組Cache服務器(服務器集合),當該“熱門”站點的請求負載增加時,會增加集合里的Cache服務器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合里的Cache服務器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache服務器上,從而提供Cache集群系統的使用效率。LBLCR算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按“最小連接”原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按“最小連接”原則從整個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。
? ?5、目標地址散列調度(Destination Hashing,dh)算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
? ?6、源地址散列調度(Source Hashing,sh)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本相似。在實際應用中,源地址散列調度和目標地址散列調度可以結合使用在防火墻集群中,它們可以保證整個系統的唯一出入口。
四、實現步驟
? ?1.網絡規劃
用途 | ip地址 | 版本號 | 系統版本號 |
集群服務器 | 192.168.1.202 | ipvsadm1.26 | centos6.5 |
apache+php1 | 192.168.1.201 | apache2.4.9 php5.4.26 | centos6.5 |
apache+php2 | 192.168.1.100 | apache2.4.9 php5.4.26 | centos6.5 |
數據庫 | 192.168.1.200 | MariaDB10.0.10 | centos6.5 |
對外提供服務的ip地址 | 192.168.1.230 |
? ?2.本處的apache、php、MariaDB都為編譯安裝
? ? ?關于編譯安裝的操作,請移步本人的相關博客http://wangfeng7399.blog.51cto.com/3518031/1381688,本處就不再做累贅
? ? ? ?特別說明,如果是編譯安裝的話應該在httpd的配置文件中添加KeepAlive Off用來關閉httpd的會話保持
? ?3.集群配置方法
? ? ?①、前段LVS集群服務器的配置 ? ? ?
1 2 3 4 | 在eth0: 0 上設置對外提供的地址 [root@localhost ~]# ifconfig eth0: 0 ?192.168 . 1.230 / 24 ?netmask? 255.255 . 255.255 ?broadcast? 192.168 . 1.230 ?up 設置路由 [root@localhost ~]# route add -host? 192.168 . 1.230 ?dev eth0: 0 |
? ? ?②、后臺兩個Real Server服務器的配置
1 2 3 4 5 6 7 8 | 設置網卡只對有eth0網卡上的ip地址做通告 [root@httpweb ~]# echo? 1 ?> /proc/sys/net/ipv4/conf/all/arp_ignore [root@httpweb ~]# echo? 1 ?> /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@httpweb ~]# echo? 2 ?> /proc/sys/net/ipv4/conf/eth0/arp_announce [root@httpweb ~]# echo? 2 ?> /proc/sys/net/ipv4/conf/all/arp_announce 在lo上設置集群服務的ip地址 [root@httpweb ~]# ifconfig lo: 0 ?192.168 . 1.230 ?netmask? 255.255 . 255.255 ?broadcast? 192.168 . 1.230 ?up [root@httpweb ~]# route add -host? 192 .l68. 1.230 ?dev lo: 0 |
? ? ?③、兩臺服務的配置均為一樣
? ? ?④、設置集群服務
1 2 3 | [root@localhost ~]# ipvsadm -A -t? 192.168 . 1.230 : 80 ?-s rr [root@localhost ~]# ipvsadm -a -t? 192.168 . 1.230 : 80 ?-r? 192.168 . 1.100 ?-g [root@localhost ~]# ipvsadm -a -t? 192.168 . 1.230 : 80 ?-r? 192.168 . 1.201 ?-g |
? ? ?⑤、測試
1 2 3 4 5 6 7 | [root@localhost ~]# ipvsadm -L -n IP Virtual Server version? 1.2 . 1 ?(size= 4096 ) Prot LocalAddress:Port Scheduler Flags ?? -> RemoteAddress:Port?????????? Forward Weight ActiveConn InActConn TCP?? 192.168 . 1.230 : 80 ?rr ?? ->? 192.168 . 1.100 : 80 ?????????????Route??? 1 ??????0 ??????????0 ???? ->? 192.168 . 1.201 : 80 ?????????????Route??? 1 ??????0 ??????????0 |
? ? ?我們會看到我們為兩個服務器單獨書寫的網頁
提供Director服務腳本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | Director腳本: #!/bin/bash # # LVS script? for ?VS/DR # . /etc/rc.d/init.d/functions # VIP= 192.168 . 0.210 RIP1= 192.168 . 0.221 RIP2= 192.168 . 0.222 PORT= 80 # case ?"$1" ?in start)??????? ?? /sbin/ifconfig eth0: 1 ?$VIP broadcast $VIP netmask? 255.255 . 255.255 ?up ?? /sbin/route add -host $VIP dev eth0: 1 # Since? this ?is ?the Director we must be able to forward packets ?? echo? 1 ?> /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. ?? /sbin/iptables -F # Reset iptables counters. ?? /sbin/iptables -Z # Clear all ipvsadm rules/services. ?? /sbin/ipvsadm -C # Add an IP virtual service? for ?VIP? 192.168 . 0.219 ?port? 80 # In? this ?recipe, we will? use ?the round-robin scheduling method. # In production, however, you should? use ?a weighted,? dynamic ?scheduling method. ?? /sbin/ipvsadm -A -t $VIP: 80 ?-s wlc # Now direct packets? for ?this ?VIP to # the real server IP (RIP) inside the cluster ?? /sbin/ipvsadm -a -t $VIP: 80 ?-r $RIP1 -g -w? 1 ?? /sbin/ipvsadm -a -t $VIP: 80 ?-r $RIP2 -g -w? 2 ?? /bin/touch / var /lock/subsys/ipvsadm &> /dev/ null ;; stop) # Stop forwarding packets ?? echo? 0 ?> /proc/sys/net/ipv4/ip_forward # Reset ipvsadm ?? /sbin/ipvsadm -C # Bring down the VIP? interface ?? /sbin/ifconfig eth0: 1 ?down ?? /sbin/route del $VIP ????????????????????????????????????????????????????????????????????????? ??? /bin/rm -f / var /lock/subsys/ipvsadm ????????????????????????????????????????????????????????????????????????? ??? echo? "ipvs is stopped..." ;; status) ?? if ?[ ! -e / var /lock/subsys/ipvsadm ]; then ???? echo? "ipvsadm is stopped ..." ?? else ???? echo? "ipvs is running ..." ???? ipvsadm -L -n ?? fi ;; *) ?? echo? "Usage: $0 {start|stop|status}" ;; esac |
? ?提供Real Server啟動腳本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # .? /etc/rc.d/init.d/functions VIP= 192.168 . 0.219 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 ;; 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 ;; 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 |
? ?提供LVS-NET的腳本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/bin/bash # # chkconfig: -? 88 ?12 # description: LVS script? for ?VS/NAT # . /etc/rc.d/init.d/functions # VIP= 192.168 . 0.219 DIP= 192.168 . 10.10 RIP1= 192.168 . 10.11 RIP2= 192.168 . 10.12 # case ?"$1" ?in start)??????? ?? /sbin/ifconfig eth0: 1 ?$VIP netmask? 255.255 . 255.0 ?up # Since? this ?is ?the Director we must be able to forward packets ?? echo? 1 ?> /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. ?? /sbin/iptables -F # Reset iptables counters. ?? /sbin/iptables -Z # Clear all ipvsadm rules/services. ?? /sbin/ipvsadm -C # Add an IP virtual service? for ?VIP? 192.168 . 0.219 ?port? 80 # In? this ?recipe, we will? use ?the round-robin scheduling method. # In production, however, you should? use ?a weighted,? dynamic ?scheduling method. ?? /sbin/ipvsadm -A -t $VIP: 80 ?-s rr # Now direct packets? for ?this ?VIP to # the real server IP (RIP) inside the cluster ?? /sbin/ipvsadm -a -t $VIP: 80 ?-r $RIP1 -m ?? /sbin/ipvsadm -a -t $VIP: 80 ?-r $RIP2 -m ???????????????????????????????????????????????????? ??? /bin/touch / var /lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets ?? echo? 0 ?> /proc/sys/net/ipv4/ip_forward # Reset ipvsadm ?? /sbin/ipvsadm -C # Bring down the VIP? interface ?? ifconfig eth0: 1 ?down ???????????????????????????????????????????????????? ??? rm -rf / var /lock/subsys/ipvsadm.lock ;; status) ?? [ -e / var /lock/subsys/ipvsadm.lock ] && echo? "ipvs is running..." ?|| echo? "ipvsadm is stopped..." ;; *) ?? echo? "Usage: $0 {start|stop}" ;; esac |
本文轉自wangfeng7399 51CTO博客,原文鏈接:http://blog.51cto.com/wangfeng7399/1396717,如需轉載請自行聯系原作者