###############################
叢集的定義和分類
LVS簡介和基本使用
LVS工作模型和排程算法
DR模型的實作
LVS的持久連接配接
一、叢集的定義
叢集(cluster)技術是一種較新的技術,通過叢集技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務排程則是叢集系統中的核心技術。
二、叢集的分類
1、Scale ON(向上擴充)
實體擴充,提高硬體參數
缺點:硬體的參數增長比例所帶來的性能提升,不是線性的,價格往往高于硬體參數的倍數,并且CPU數量越多,仲裁機制消耗的資源就越大。
2、Scale Out 向外擴充 數量擴充
增加伺服器數量
優點:在不影響業務的情況下,可以實作動态的線上擴容,每台伺服器的費用可以成正比的轉化為性能。
High Availability()
保證服務永久線上可用的叢集,通過健康檢測機制,大幅度的增強服務的可用性,HA叢集中一個資源隻能被一個節點占用,節點數通常為奇數。
可用性衡量标準=線上時間/(線上時間+故障處理時間)
Load Balancing(負載均衡叢集)
那使用者的請求均攤到多台伺服器上的機制叫做負載均衡,主要是增加處理能力。
排程算法:論調(Round Robin)、權重(WRR)等……
硬體
F5 BIG IP
Citrix Netscaler
A10 AX系列
軟體
四層 不能處理應用層協定,工作性能好,支援的功能特性有限 LVS
七層 可以過濾和修改應用層協定,性能略差于四層裝置 Nginx、Haproxy
High Performance
科學叢集是并行計算的基礎。通常,科學叢集涉及為叢集開發的并行應用程式,以解決複雜的科學問題。科學叢集對外就好像一個超級計算機,這種超級計算機内部由十至上萬個獨立處理器組成,并且在公共消息傳遞層上進行通信以運作并行應用程式。
一、LVS簡介
LVS工作在核心空間的TCP/IP協定棧上,LVS監控在INPUT鍊上,當使用者請求的是叢集服務(套接字),ipvs鈎子函數會根據定義的規則修改請求并送至POSTROUTING鍊上,LVS和iptbles不能同時使用。
ipvsadm是工作在使用者空間的規則編寫的指令行工具
ipvs是工作在核心空間INPUT鍊上的鈎子函數
注意:排程器的實作基于套接字(IP+port),是以一個排程器可以排程多個不同類型的服務,但通常排程能力有限,通常都為一種服務實作叢集排程功能。
二、ipvsadm的用法
ipvsadm管理叢集服務
1
2
3
4
5
6
7
8
<code>添加 -A - t|u|f service-address [-s scheduler]預設排程算法是wlc</code>
<code> </code><code>-t TCP 協定的叢集</code>
<code> </code><code>-u UDP 協定的叢集</code>
<code> </code><code>service-address IP:PORT</code>
<code> </code><code>-f FireWallMark LVS持久連接配接</code>
<code> </code><code>service-address MarkNumber</code>
<code>修改 -E</code>
<code>删除 -D - t|u|f service-address</code>
ipvsadm管理叢集服務中的realserver
<code>添加 -a - t|u|f service-address -r server-address -[g|i|m] [-w weight]</code>
<code> </code><code>在NAT模型中server-address可以是 IP:PORT</code>
<code> </code><code>-g:DR 預設就是DR模型</code>
<code> </code><code>-m:NAT</code>
<code> </code><code>-i:TUN</code>
<code>修改 -e</code>
<code>删除 -d - t|u|f service-address -r server-address</code>
ipvsadm檢視
<code>ipvsadm檢視</code>
<code> </code><code>- L|l 顯示規則</code>
<code> </code><code>-n 不反解析IP位址和端口,數字格式顯示主機位址和端口号</code>
<code> </code><code>--status 統計資料</code>
<code> </code><code>--rate 速率</code>
<code> </code><code>--timeout 顯示tcp、tcpfin和udp的會話逾時時長</code>
<code> </code><code>--</code><code>sort</code> <code>顯示目前的ipvs連接配接狀況</code>
<code> </code><code>-c 檢視連接配接數</code>
删除所有叢集服務
<code>-C 清空ipvs所有規則</code>
儲存ipvs規則
<code>-S > </code><code>/path/file</code> <code>儲存規則</code>
<code>service ipvsadm save</code>
載入ipvs規則
<code>-R < </code><code>/path/somefile</code>
NAT
<a href="http://blog.51cto.com/attachment/201309/064256156.jpg" target="_blank"></a>
使用者請求到達INPUT鍊由ivps的比對規則并修改就用戶端的目标IP為叢集服務中的Realserver位址,DNAT的動态擴充,同樣支援端口映射,向外提供的服務和内部服務端口可以不一緻,Realserver的網關指向DIP。
缺點:由于Director為後端realserver網關,是以能夠排程的Realserver有限,10個就已經差強人意了。
DR
<a href="http://blog.51cto.com/attachment/201309/064403347.jpg" target="_blank"></a>
叢集節點跟Director必須在同一實體網絡中,因為它靠mac位址轉發資料包,ARP廣播包不允許跨路由
RIP可以不用是私有位址,實作便捷的遠端原理
Director隻負責入站請求,響應封包由Realserver直接發網用戶端,請求封包很小,是以DR模式的LVS能帶動100台Realserver
叢集節點一定不能使用Director當做其預設網關
不支援端口映射
大多數的作業系統都可以用在Realserver,要求必須能隐藏VIP
TUN
<a href="http://blog.51cto.com/attachment/201309/064437159.jpg" target="_blank"></a>
叢集節點可以跨越Intelnet
RIP必須是公網位址
Director僅負責入站請求,響應封包則由Realserver直接發網用戶端
Realserver網關不能指向Director
隻有支援隧道功能的OS才能用于Realserver
二、LVS的排程算法
1、靜态排程方法(director不考慮realserver已建立的活動連結和非活動連結狀況)
rr 輪詢
排程器通過“輪叫”排程算法将外部請求按順序輪流配置設定到叢集中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接配接數和系統負載。
wrr 權重輪詢
排程器通過“權重輪叫”排程算法根據真實伺服器的不同處理能力來排程通路請求。這樣可以保證處理能力強的伺服器能處理更多的通路流量。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。
sh 源位址哈希
源位址hash,對請求的用戶端IP進行hash計算,内部維持着一張hash表,它的主要功能使用者實作session affinity,會話綁定,它在一定程度上破壞了負載均衡效果,但是為了現實應用的需求這種功能是必要的,如果每個realserver通過session sharing的叢集機制共享session,就可以不适用source hash這種功能。
dh 目标位址哈希
“目标位址散列”排程算法根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。
2、動态排程方法
lc 最少連接配接數
排程器通過“最少連接配接”排程算法動态地将網絡請求排程到已建立的連結數最少的伺服器上。如果叢集系統的真實伺服器具有相近的系統性能,采用“最小連接配接”排程算法可以較好地均衡負載,active*256+inactive。
wlc 權重最少連接配接數
在叢集系統中的伺服器性能差異較大的情況下,排程器采用“權重最少連結”排程算法優化負載均衡性能,具有較高權值的伺服器将承受較大比例的活動連接配接負載。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值(active*256+inactive)/weight。
sed 最短期望延遲
wlc的改進版,權重大的伺服器事先被挑中,(active+1)*256/weight,權重大的伺服器有很多的時候,權重小的伺服器可能一個都沒有。
nqnever queue 永不排隊
無需隊列,如果有台 realserver的連接配接數=0就直接配置設定過去,不需要在進行sed運算。
lblc 基于本地的最少連接配接
它的主要目的跟dh一樣,隻是dh并不考慮從但前cacheserver的連接配接數,lblc考慮而已。盡管要保證命中的提高,并同樣的請求發網通一個cache server但也要考慮輪詢新的連接配接用一個相對空閑的cache server來響應。
lblcr 基于本地的帶複制功能的最少連接配接
“帶複制的基于局部性最少連結”排程算法也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。它與LBLC算法的不同之處是它要維護從一個目标 IP位址到一組伺服器的映射,而LBLC算法維護從一個目标IP位址到一台伺服器的映射。該算法根據請求的目标IP位址找出該目标IP位址對應的伺服器組,按“最小連接配接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按“最小連接配接”原則從這個叢集中選出一台伺服器,将該伺服器加入。
一、實作原理
<a href="http://blog.51cto.com/attachment/201309/070222206.png" target="_blank"></a>
用戶端送出請求封包至路由網關,路由網關eth1發出ARP解析請求,請求資料包目标IP(192.168.1.200)的MAC位址是多少,所有realserver均收到APR請求,此時為了讓解析的MAC為Director的MAC,需要對所有realserver做出設定如下:
9
10
11
12
13
<code>######所有realserver配置資訊</code>
<code>sysctl -w net.ipv4.conf.eth0.arp_announce=2</code>
<code>sysctl -w net.ipv4.conf.all.arp_announce=2</code>
<code>sysctl -w net.ipv4.conf.eth0.arp_ignore=1</code>
<code>sysctl -w net.ipv4.conf.all.arp_ignore=1</code>
<code>#######解釋說明</code>
<code>arp_ignore 接收到别人請求後的響應級别</code>
<code> </code><code>0 隻要本機配置有相應位址就給予相應</code>
<code> </code><code>1 僅在請求目标位址配置在請求到達的接口上的時候,才給予相應</code>
<code>arp_annonce 主動向外通告過自己IP位址和MAC位址對應關系的通告級别</code>
<code> </code><code>0 将本機任何接口上的任何位址向外通過</code>
<code> </code><code>1 試圖僅向目标網絡通告與其網絡比對的位址資訊</code>
<code> </code><code>2 僅向目标網絡通告與其網絡比對的位址資訊是</code>
用戶端成功解析VIP的MAC位址為Director的MAC,将封包轉發至排程器。
Director根據排程算法和規則選擇為Realserver_one,并發出APR解析請求得到RIP對應的MAC位址,并重新封裝資料封包的幀首部,将源MAC位址改為自己,目标MAC位址改為解析到的RIP的MAC位址,并發送封包至Realserver_one。
Realserver_one收到Director發來的封包處理并相應此請求封包,響應封包的源IP位址,必須是請求封包的目标IP(VIP)位址,需要對realserver做如下設定:
<code>ifconfiglo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255</code>
<code>route add -host 192.168.1.200 dev lo:0</code>
此後整個傳輸過程資料包源IP為VIP,目标IP位CIP,資料封包沿着路由器轉發至用戶端,完成整個請求和相應過程。
二、配置過程
Director配置
<code>route add -host 192.168.1.200 dev eth0:0 </code>
<code>ipvsadm -A -t 192.168.1.200:80 -s wlc</code>
<code>ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2</code>
<code>ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.20 -g -w 1</code>
realserver端配置
三、健康檢測機制
使用ldirectord來實作對realserver的健康狀态檢測
為了從主Director将LVS負載均衡資源故障轉移到備用Director,并從叢集中自動移除節點,我們需要使用ldirectord程式,這個程式在啟動時自動建立IPVS表,然後監視叢集節點的健康情況,在發現失效節點時将其自動從IPVS表中移除,本文沒有使用這種方法,而是簡單的通過腳本的方式來實作。
使用腳本來實作對realserver的健康狀态檢測
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code>#!/bin/bash</code>
<code>#</code>
<code>VIP=192.168.1.200</code>
<code>CPORT=80</code>
<code>BACKUP=127.0.0.1</code>
<code>STATUS=(</code><code>"1"</code><code>"1"</code><code>)</code>
<code>RS=(</code><code>"192.168.1.10"</code><code>"192.168.1.20"</code><code>)</code>
<code>RW=(</code><code>"2"</code><code>"1"</code><code>)</code>
<code>RPORT=80</code>
<code>TYPE=g</code>
<code>while</code><code>:; </code><code>do</code>
<code>letCOUNT=0</code>
<code>add() {</code>
<code> </code><code>ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2</code>
<code> </code><code>[ $? -eq0 ] && return0 || return1</code>
<code>}</code>
<code>del() {</code>
<code> </code><code>ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT</code>
<code>forI </code><code>in</code><code>${RS[*]}; </code><code>do</code>
<code> </code><code>ifcurl --connect-timeout 1 http:</code><code>//</code><code>$I &> </code><code>/dev/null</code><code>; </code><code>then</code>
<code> </code><code>if</code><code>[ ${STATUS[$COUNT]} -eq0 ]; </code><code>then</code>
<code> </code><code>add $I ${RW[$COUNT]}</code>
<code> </code><code>[ $? -eq0 ] && STATUS[$COUNT]=1</code>
<code> </code><code>fi</code>
<code> </code><code>else</code>
<code> </code><code>if</code><code>[ ${STATUS[$COUNT]} -eq1 ]; </code><code>then</code>
<code> </code><code>del $I</code>
<code> </code><code>[ $? -eq0 ] && STATUS[COUNT]=0</code>
<code> </code><code>fi</code>
<code> </code><code>letCOUNT++</code>
<code>done</code>
<code>sleep5</code>
注意:各節點之間的時間偏差不應該超過1秒,NTP時間伺服器來同步時間。
一、持久連接配接的實作機制
無論使用什麼算法,LVS持久連接配接都能實作在一點時間内,将來自于同一個用戶端請求派發至此前標明的realserver,DH排程算法本身依賴于TCP會話逾時時間等其他計時器,而持久連接配接依賴于持久連接配接模闆,每個新的連接配接請求,無論用戶端的連接配接狀态無論是否斷開,隻要用戶端曾經通路過,LVS就會在持久連接配接模闆中記錄資訊,持久連接配接模闆(記憶體緩沖區):記錄每一個用戶端及配置設定的realserver的映射關系。
PPC 持久端口連接配接 基于端口
來自于同一個用戶端對同一個服務的請求,始終定向至此前標明的realserver。
<code>ipvsadm -A -t 192.168.1.200:23 -s rr-p 3600</code>
<code>ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.10 -g -w 2</code>
<code>ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.20 -g -w 1</code>
PCC 持久用戶端連接配接 基于所有端口
來自于同一個用戶端對所有服務的請求,始終定向至此前標明的realserver
<code>ipvsadm -A -t 192.168.1.200:0 -s rr -p 600</code>
<code>ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.10 -g -w 2</code>
<code>ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.20 -g -w 1</code>
PNMPP 持久防火牆标記連接配接
來自于同一用戶端對指定服務的請求,始終定向至此算定的realserver基于指定的端口,它可以将兩個毫不相幹的端口定義為一個叢集服務,例如:合并http telnet為同一個叢集服務。
<code>######PNMPP是通過路由前給資料包打标記來實作的</code>
<code>iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 80 -j MARK --</code><code>set</code><code>-mark 3</code>
<code>iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 23 -j MARK --</code><code>set</code><code>-mark 3</code>
<code>ipvsadm -A -f 3 -s rr -p 600</code>
<code>ipvsadm -a -f 3 -r 192.168.1.10 -g -w 2</code>
<code>ipvsadm -a -f 3 -r 192.168.1.20 -g -w 2</code>
注意:以上三種持久連接配接均使用了"-p"選項,它保證了持久性,預設為300秒
警告:Director沒有定義使用者請求的叢集服務,将試圖自己響應用戶端請求。
本文轉自 ftmoonfans 51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1299896