linux虛擬服務器(LVS)項目在linux操做系統上提供了最多見的負載均衡軟件。html
集羣定義:前端
集羣(cluster)技術是一種較新的技術,經過集羣技術,能夠在付出較低成本的狀況下得到在性能、可靠性、靈活性方面的相對較高的收益,其任務調度則是集羣系統中linux
的核心技術。本文就集羣系統的定義、發展趨勢、任務調度等問題進行了簡要論述。集羣是一組相互獨立的、經過高速網絡互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與集羣相互做用時,集羣像是一個獨立的服務器。集羣配置是用於提升可用性和可縮放性。nginx
集羣系統的主要優勢:(高可擴展性、高可用性、高性能、高性價比)算法
目前運行在LINUX最主流的三種集羣:vim
負載集羣之一:LB(Load Balancing)後端
負載均衡集羣運行時,通常經過一個或者多個前端負載均衡器(Director Server),將用戶發來的請求資源信息,經過一種調度算法發送至到後端的一組應用服務器(Real Server)上,從而達到整個系統的高性能和高可用性。這樣的計算機集羣有時也被稱爲服務器羣(Server Farm)瀏覽器
通常高可用性集羣和負載均衡集羣會使用相似的技術,或同時具備高可用性與負載均衡的特色。緩存
負載集羣之二:HA(High-Availability)安全
通常是指當集羣中有某個節點失效的狀況下,其上的任務會自動轉移到其餘正常的節點上。而且還能夠將集羣中的某節點進行離線維護再上線,該過程並不影響
整個集羣的運行。
高可用集羣:爲了保證服務一直在線的高可用能力的集羣
衡量標準:可用性=在線時間/(在線時間+故障處理時間)
負載集羣之三:HP
高性能計算集羣採用將計算任務分配到集羣的不一樣計算節點從而提升計算能力,於是主要應用在科學計算領域。比較流行的HPC採用Linux操做系統和其它一些免費軟
件來完成並行運算。這一集羣配置一般被稱爲Beowulf集羣。這類集羣一般運行特定的程序以發揮HPC cluster的並行能力。這類程序通常應用特定的運行庫, 好比專爲科學計算設計的MPI庫。
HPC集羣特別適合於在計算中各計算節點之間發生大量數據通信的計算做業,好比一個節點的中間結果或影響到其它節點計算結果的狀況。
高性能處理集羣:
利用的是分佈式存儲:分佈式文件系統,分佈式文件系統把一個大任務切割爲小任務、分別進行處理
LVS系統結構:
負載均衡器(Load Balancer)、服務器羣組(Server Aarry)、共享存儲(Shared Storage)
負載均衡層:
整個集羣服務最前端設備,它有一個或多個調度器(Director Server)組成,LVS軟件運行在調度服務器上。
調度服務器的功能:
將用戶的請求,根據調度算法進行IP分流,將數據包發送到後端應用服務器上(Real Server),若是調度服務器安裝了
監控模塊Ldirectord,那麼調度服務器會將出現故障的應用服務器標記爲不可用,知道此應用服務器恢復正常。
服務器羣組層:
這是由一個或者多個應用程序服務器(Real Server)組成,而且每一個應用服務器提供相同的服務,調度服務器會將用戶的請求定向到具體的應用服務器上,而後由後端的應用服務器響應客戶端。
共享存儲層:
功能只要是保證服務器羣組中的應用服務器提供數據的一致性。
共享存儲的實現方式:
磁盤陣列、集羣文件系統(OCFS2)
LVS是linux系統上的一種機制,相似於iptables,其相關屬性也是經過(ipvsadm)與iptables命令相似的方式定義的,
LVS是工做於linux系統內核空間,經過內核來提供工做,其工做空間在iptables的INPUT鏈上,當客戶端請求到達INPUT鏈上之後,經過LVS規則的驗證,若是是內��請求,發送至用戶空間,若是發現是集羣,將此請求發送至POSTROUTING鏈,並交給後端應用程序服務器來響應用戶的請求。
注意:上面所提到LVS實際上是工做在iptables的INPUT和postrouting鏈上的,因此在此係統上iptables和LVS不能同時存在。
LVS的組成:
ipvsadm:用於管理集羣服務的命令行工具,工做於Linux系統中的用戶空間
ipvs:爲lvs提供服務的內核模塊,工做於內核空間 (相對因而框架,經過ipvsadm添加規則,來實現ipvs功能)
注:在linux內核2.4.23以前的內核中模塊默認是不存在的,須要本身手動打補丁,而後把此模塊編譯進內核纔可使用此功能
LVS類型:
LVS-NAT模式、LVS-DR模式、LVS-TUN模式
NAT:(Network address translation)
原理:把用戶的請求發來的IP包的IP報頭目的地址,經過LVS服務器轉換至後端提供服務的Real Server的地址並將用戶的請求報文發送至應用服務器。而應用服務器打開報文並響應用戶請求發送並通過LVS服務器,LVS服務器將源地址修改成LVS服務器接口上的VIP地址。
NAT模式特色:
1
2
3
4
5
6
7
8
9
|
用戶發來的請求和響應,都必須通過LVS服務器。
集羣節點跟Director必須在同一個IP網絡中;
RIP一般是私有地址,僅用於各集羣節點間的通訊;
Director位於Client和Real Server之間,並負責處理進出的全部通訊;
Realserver必須將網關指向DIP地址;
支持端口映射;
Realserver可使用任意OS;
LVS服務器必須有兩塊網卡
較大規模應該場景中,Director易成爲系統瓶頸;
|
DR:(Direct routing)
DR模式工做在數據鏈路層,其原理,LVS服務器和應用服務器使用同一個IP地址對外服務,但只有LVS服務器對ARP請求進行響應,全部應用服務器對自己這個IP地址的ARP請求保持靜默。網關會把全部的ARP請求定向至LVS服務器,而LVS服務器收到用戶請求數據報文,根據調度算法進行IP分流,而後相應的MAC地址的修改,發送至後端對應的應用服務器。
注:因爲LVS服務器對二層數據包進行修改,因此LVS服務器和應用服務器必須在同一個廣播域。
DR模式特色:
1
2
3
4
5
|
集羣節點跟director必須在同一個物理網絡中;
RIP可使用公網地址,實現便捷的遠程管理和監控;
Director僅負責處理入站請求,響應報文則由Real Server直接發往客戶端;
Real Server不能將網關指向DIP;
不支持端口映射;
|
注:在DR模式中,LVS服務器只負責接收用戶請求,根據調度算法及IP分流,直接路由轉發,其響應報文交給Real Server自行處理。
DR模式是三種模式當中性能最好的,惟一的缺陷是LVS服務器和後端的應用服務器必須在同一個廣播域中,所以不能實現集羣的跨網端應用。
TUN (IP Tunnel模式)
TUN模式,LVS將TCP/IP請求進行從新封裝並轉發給目標應用服務器,有目標應用程序服務器對用戶請求作出相應。LVS Router和Real Server經過Tp Tunnel經過隧道技術
進行轉發,所以二者能夠存在不一樣的網絡當中。
注:因爲應用服務器須要對LVS發送的報文進行還原,也就是說應用服務器也要支持Ip Tunnel協議。(Network options)
TUN模式特色:
1
2
3
4
5
6
|
集羣節點能夠跨越Internet;
RIP必須是公網地址;
Director僅負責處理入站請求,響應報文則由Real Server直接發往客戶端;
Real Server網關不能指向director;
只有支持隧道功能的OS才能用於Real Server;
不支持端口映射;
|
LVS負載均衡八種調度算法:
rr-->wrr-->lc-->wlc-->lblc-->lblcr-->dh-->sh
輪叫(Round Robin):
該算法將用戶請求有次序地分發到後端的應用服務器,均等看待全部Real Server,而並不計算具體服務器上的連接和負載。
加權輪叫(Weighted Round Robin):
該調度算法根據各個應用服務器的不一樣負載能力,給服務器設置不一樣的權值,處理能力強的應用服務器的權值設置大點,來響應更多的用戶請求。
最少鏈接(Least Connections):
該算法將用戶發送的請求分配到鏈接作少的應用服務器上。
加權最少鏈接(Weighted Least Connections):
該算法根據應用服務器的不一樣負載能力,設置不一樣大小不一樣的權值,權值較大而且鏈接請求數少的應用服務器則優先分配用戶請求信息。
基於局部性最少鏈接:(Locality-Based Least Connections):
該算法針對目標IP地址的負載均衡算法,主要用於緩存集羣系統。此算法會根據用戶請求的目標IP地址找出與目標地址最近的應用服務器,若是服務器沒有超載,則請求被分發到該應用服務器,若是服務器不可用或者負載較大,則使用最少鏈接算法,選擇目標應用服務器
帶複製的基於局部性最少鏈接(Locality-Based Least Connections wiht Replication)
該算法也是針對目標IP地址的負載均衡算法,主要用於緩存集羣系統。域LBLC區別在於,前者維護一個IP地址到一組服務器的映射。然後者則是維護一個IP地址到一臺應用服務器的映射。
目標地址散列(Destination Hashing)
該算法將用戶請求的目標地址做爲散列鍵,並嘗試從靜態分配的散列表中找出對應的應用服務器。若是目標應用服務器沒有超載,那麼將用戶的請求信息分發至該應用服務裏,不然返回空。
源地址散列(Source Hashing)
該算法將請求的源地址做爲散列鍵,並嘗試從靜態分配的散列表中找出對應的應用服務器。若是目標應用服務器可用而且沒有超載,那麼將用戶請求的信息分發至此應用服務器,不然返回空。
LVS IP Address Name Conventions:(LVS Ip-address 命名規範)
1
2
3
4
5
|
Director's IP (DIP) address :中間層,根據不一樣模式,來接收並響應用戶的請求。
Virtual IP (VIP) address:向外提供服務的地址。
Real IP (RIP) address :Real Server IP:後端提供應用服務的主機地址。
Director's IP (DIP) address :和內部的IP通訊所使用的地址:設置在Director Server上
Client computer's IP (CIP) address:客戶端地址
|
ipvsadm命令詳細介紹:
pvsadm: 管理集羣服務的命令行工具,而ipvs系統內核中的一個模塊
ipvsadm命令的基本使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
-A:在內核的虛擬服務器列表中添加一條VIP記錄
-E:修改內核虛擬服務器列表中的一條VIP記錄
-D:刪除內核虛擬服務器列表中的一條VIP記錄
-C:清空內核虛擬服務器列表中的全部VIP記錄
-S:保存虛擬服務器規則
-R:恢復虛擬服務器策略規則
-a:在內核虛擬服務器列表中添加一個應用服務器的地址。
-e:修改一個虛擬服務器列表中的一條應用服務器地址記錄
-d:刪除一個虛擬服務器列表中的一條應用服務器地址記錄
-L/-l: 查看內核虛擬服務器列表
-Z:將內核中的虛擬服務器計數清爲
0
-t service-address:指定虛擬服務器使用TCP服務
-u service-address:指定虛擬服務器使用UDP服務
-s scheduler:指定調度算法:
-p timeout:在應用服務器上的持續服務時間,單位爲秒
-r service-address:指定應用服務器的地址
-g:指定LVS工做模式爲直接路由(DR-defalut)
-I:指定LVS工做模式爲隧道模式(Ip Tunnel)
-m:指定LVS工做模式爲地址轉換模式(NAT)
-w:設定應用服務器的權值
|
經常使用的負載均衡開源軟件有: nginx、lvs、keepalived
商業的硬件負載設備: F五、Netscale
一、 LB、LVS介紹
LB集羣是load balance 集羣的簡寫,翻譯成中文就是負載均衡集羣;
LVS是一個實現負載均衡集羣的開源軟件項目;
LVS架構從邏輯上可分爲調度層(Director)、server集羣層(Real server)和共享存儲層;
LVS可分爲三種工做模式:
NAT(調度器將請求的目標ip即vip地址改成Real server的ip, 返回的數據包也通過調度器,調度器再把源地址修改成vip)
TUN(調度器將請求來的數據包封裝加密經過ip隧道轉發到後端的real server上,而real server會直接把數據返回給客戶端,而再也不通過調度器)
DR(調度器將請求來的數據包的目標mac地址改成real server的mac地址,返回的時候也不通過調度器,直接返回給客戶端)
spacer.gif
LVS的調度算法:輪叫調度(Round Robin)(簡稱rr) ,加權輪叫(Weighted Round Robin)(簡稱wrr),最少連接(least connection)(LC),加權最少連接(Weighted Least Connections)(WLC) 等等;
二、LVS/NAT 配置
準備工做:
須要準備三臺機器乾淨的CentOS6.6系統,Director機器須要安裝兩塊網卡;
三臺服務器一臺做爲director, 兩臺做爲real server
Director 有一個外網ip:192.168.22.11 和一個內網ip:192.168.11.11
兩臺Real Server 只有內網ip爲:192.168.11.100 和 192.168.11.101,而且須要設置內網網關爲director的內網ip:192.168.11.11
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.11.100
GATEWAY=192.168.11.11更改完網關後須要重啓網卡,先down後up,在一條命令實現;若是ifdown以後,ssh會中斷;
# ifdown eth1 && ifup eth1
Director上安裝ipvsadm:#yum install -y ipvsadm
兩臺real server安裝nginx,須要先安裝epel擴展源。
yum install -y epel-release
yum install -y nginx
安裝完成後啓動nginx:/etc/init.d/nginx start
更改三臺服務器的hostname爲 dr、rs一、rs2
Direcotr 上 vi /usr/local/sbin/lvs_nat.sh //增長以下內容:
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -j MASQUERADE
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.22.11:80 -s wlc
$IPVSADM -a -t 192.168.22.11:80 -r 192.168.11.100:80 -m -w 2
$IPVSADM -a -t 192.168.22.11:80 -r 192.168.11.101:80 -m -w 1直接運行這個腳本就能夠完成lvs/nat的配置了:
/bin/bash /usr/local/sbin/lvs_nat.sh
dr查看nat的iptables
[root@dr ~]# iptables -t nat -nvL
Chain POSTROUTING (policy ACCEPT 1 packets, 124 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * * 192.168.11.0/24 0.0.0.0/0
ipvsadm -ln 查看ipvsadm的規則
瀏覽器打開192.168.11.100、192.168.11.101顯示nginx的歡迎頁面
在rs一、rs2上面修改html文件,用來區分;
[root@rs1 ~]# cat /usr/share/nginx/html/index.html
rs1rs1rs1
[root@rs2 ~]# cat /usr/share/nginx/html/index.html
rs2rs2rs2經過瀏覽器測試兩臺機器上的內容
瀏覽器打開 192.168.22.11,會顯示rs1或rs2的html內容;來回切換說明試驗OK;
更改輪詢規則爲wlc,權重爲2,進行測試
用另外一臺linux機器curl測試,出現2次1,1次2,來回切換說明OK;
[root@localhost ~]# curl 192.168.22.11
rs1rs1rs1
[root@localhost ~]# curl 192.168.22.11
rs1rs1rs1
[root@localhost ~]# curl 192.168.22.11
rs2rs2rs2在dr機器上ipvsadm -ln能夠查看,權重比,保持的連接比大概同樣;
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.22.11:80 wlc
-> 192.168.11.100:80 Masq 2 0 26
-> 192.168.11.101:80 Masq 1 0 13
三、LVS/DR 配置
DR模式中,director只負責分發,只有進入的流量,吞吐量會很是大;real server直接給用戶提供數據,安全性會下降;
DR中的機器都須要配置公網ip,虛擬的ip每臺機器都須要配置,用戶請求的時候請求虛擬ip,返回的時候爲輪詢rs提供;
三臺機器,每臺機器只須要配置1個ip,vip是用腳本執行後會出現的,不用手動設置;
director(eth1:192.168.11.11 vip eth1:0 192.168.11.110)
real server1(eth1:192.168.11.100 vip lo:0: 192.168.11.110)
real server1(eth1:192.168.11.101 vip lo:0: 192.168.11.110)
Director 上 vim /usr/local/sbin/lvs_dr.sh //增長下面的內容
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.11.110
rs1=192.168.11.100
rs2=192.168.11.101
ifconfig eth1:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth1:0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
兩臺rs上:vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.11.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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
而後director上執行: bash /usr/local/sbin/lvs_dr.sh
兩臺rs上執行: bash /usr/local/sbin/lvs_dr_rs.sh
執行完成後ifconfig能夠顯示虛擬ip地址;dr顯示eth1:0,rs一、rs2顯示lo:0;
eth1:0 Link encap:Ethernet HWaddr 00:0C:29:70:4E:58
inet addr:192.168.11.110 Bcast:192.168.11.110 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:18 Base address:0x2080
lo:0 Link encap:Local Loopback
inet addr:192.168.11.110 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1ipvsadm -ln 列出規則
[root@dr ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.11.110:80 rr
-> 192.168.11.100:80 Route 1 0 3
-> 192.168.11.101:80 Route 1 0 3單獨啓動一臺linux機器進行測試,瀏覽器測試有緩存不明顯;
curl 192.168.11.110 進行測試,各出現1次說明rr輪詢規則OK;
[root@localhost ~]# curl 192.168.11.110
rs1rs1rs1
[root@localhost ~]# curl 192.168.11.110
rs2rs2rs2
[root@localhost ~]# curl 192.168.11.110
rs1rs1rs1
[root@localhost ~]# curl 192.168.11.110
rs2rs2rs2更改輪詢算法爲wrr,權重爲2;而後執行文件,報錯提示文件已存在;緣由是/usr/local/sbin/lvs_dr.sh腳本文件裏面已經up了eth1:0,因此須要在腳本里面增長:ifconfig eth1:0 down,以後就不會報錯;
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 2
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1[root@dr ~]# bash /usr/local/sbin/lvs_dr.sh
SIOCADDRT: 文件已存在其中一臺rs若是掛了以後,仍是會輪詢訪問,因此會出現一會能打開一會打不開;
模擬,rs2中止nginx:/etc/init.d/nginx stop
使用curl測試,請求仍是會發送到rs2上面,可是已經提示不能鏈接到主機;
[root@localhost ~]# curl 192.168.11.110
rs1rs1rs1
[root@localhost ~]# curl 192.168.11.110
rs1rs1rs1
[root@localhost ~]# curl 192.168.11.110
curl: (7) couldn't connect to hostlvs自己不會剔除已經死掉的real server,因此須要結合keeplived;
LVS/DR + Keepalived搭建負載均衡集羣 http://www.linuxidc.com/Linux/2015-06/118647.htm
LVS+Keepalived實現四層負載及高可用 http://www.linuxidc.com/Linux/2015-02/112695.htm
LVS+Keepalived高可用負載均衡集羣架構實驗 http://www.linuxidc.com/Linux/2015-01/112560.htm
Heartbeat+LVS構建高可用負載均衡集羣 http://www.linuxidc.com/Linux/2014-09/106964.htm
搭建LVS負載均衡測試環境 http://www.linuxidc.com/Linux/2014-09/106636.htm
一個針對LVS的壓力測試報告 http://www.linuxidc.com/Linux/2015-03/114422.htm