基于LVS对LAMP做负载均衡集群
一、簡介
? ?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,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的基于LVS对LAMP做负载均衡集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言html规则分析,易语言算法原理浅
- 下一篇: 位置参数及操作符号