當單臺服務器沒法支撐龐大業務的時候,這個時候就要考慮擴展服務器的性能。html
擴展有兩種方式:前端
1) scale on:向上擴展,立體式,如買更強大的服務器linux
a) 簡單的說,單純擴展服務器仍是不夠的,根據木桶效應,整套東西的性能只能根據最低的環節來衡量;web
b) 服務器隨着的性能的提高,價格愈來愈貴算法
2) scale out:向外擴展,分佈式,使用更多的服務器,也就是集羣的方式了後端
事實上智能DNS也能夠實現負載:緩存
1) A記錄:1個域名對應多個ip服務器
2) dns是以這種輪詢的方式來響應請求(常規狀況),這是這種是不均勻的負載均衡,每一個人的請求是不一樣的,並且緩存服務器的存在,大部分時間是會請求同臺服務器網絡
3) DNS事實上是爲了智能解析不一樣地區的用戶到最近的服務器併發
集羣的主要做用就是爲了提升併發處理能力,其所需的組件通常是前端的分發器,後端的服務器,也有可能單獨包含health check檢查設備。
LVS: linux virtual server
1) NAT:地址轉換
2) DR:直接路由
3) TUN:隧道
幾個名詞的解釋:
director:前端分發器
realserver:後端服務器,集羣節點
VIP:IPVS的前端IP,接收客戶端服務請求的ip
DIP: director和服務器通訊的地址
RIP:服務器和director通訊的地址
CIP:客戶端發起請求的地址
LVS介紹
http://www.linuxvirtualserver.org/zh/lvs1.html
ipvs也是做爲一個內核的功能的模塊,ipvsadm是一個管理工具,並不是服務,這個能夠類比iptables,其工做位置爲用戶空間/內核空間
iptables/netfilter
ipvsadm/ipvs
IPVS工做在INPUT鏈上,其工做和netfilter不一樣,所以,若是功能有衝突的話,切記不能同時使用。
IPVS在鉤子函數(鏈上的數據流動狀況):
PREROUTING(這裏能夠對數據作標記,在後面LVS持久鏈接會講解)
INPUT:在這裏識別了請求是集羣服務,會對數據包作特殊處理(按照狀況而定)
OUPUT:
POSTROUTING
不通過forward鏈,這個本人未證明。不過從上面可知,IPVS工做在INPUT鏈上面。
查看內核是否編譯IPVS功能,linux內核2.6版本以後都包含了這個功能,內核自己就擁有的功能,所以和發行版沒有關係
[root@director ~]# grep -i "vs" /boot/config-2.6.32-358.el6.i686
# IPVS scheduler#單獨列出這個10種調度算法,其實還有其餘,請自行查詢
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
算法簡介:
rr :輪詢調度
wrr:加權輪詢
sh:源地址做爲關鍵字hash查找一個RS
dh: 目的地址做爲關鍵字hash查找一個RS
lc:最小鏈接調度,ipvs會存儲全部的活動鏈接
active*256+inactive
wlc:加權的最小鏈接調度
(active*256+inactive)/weight
LBLC:基於地址的最小鏈接請求調度:未來自同一個目的地址的請求分配給同一臺RS,此時這臺服務器是還沒有滿負荷的。不然就將這個請求分配給鏈接數最小的RS,並以它做爲下一次分配的首先考慮。
sed: 最短時間望延遲,對wlc的改進,防止第一次選擇了性能較差的主機處理
(active+1)*256/weight
nq:nq: never queue,對sed的改進,最開始每一個節點都發鏈接,以後再按照wlc來發
cache命中率和負載是相互背離,只能找到一箇中和點
非活動鏈接數很是多的時候,得考慮inactive,所以wlc比較理想
默認方法:wlc
安裝管理工具ipvsadm
[root@director ~]# yum -y install ipvsadm
ipvsadm命令詳解:
1) 管理集羣服務
添加 –A -t|u|f service-address –r server-address [-s scheduler]
-t :tcp
-u : udp
-f :防火牆標記,用於單獨提供多個服務綁定使用
service-address:對外服務的套接字,ip:port
默認調度算法是wlc
-w :權值,部分算法須要使用
修改 –E :使用同上
刪除 –D –t|u|f service-address
# ipvsadm -A -t 172.16.100.1:80 -s rr
2) 管理集羣服務的RS
添加 –a -t|u|f service-address –r server-address [-g|i|m] [-w weight]
-t :tcp
-u : udp
-f :防火牆標記,用於單獨提供多個服務綁定使用
service-address:對外服務的套接字,ip:port
-g :DR模型,默認
-m : NAT masuerading
-I : tun ipip
-w :權值,部分算法須要使用
修改 –e :使用同上
刪除 –d -t|u|-f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
3) 查看集羣服務
-L|l
-n:數字格式顯示主機地址和端口
--stats:統計數據
--rate:速率
--timeout:顯示會話的超時時間
-c:顯示當前IPVStcp鏈接狀況
4) 集羣的規則管理
-C:清空IPVS規則
-S: 保存規則
# ipvsadm –S > /path/to/somefile
-R:從新載入規則
#ipvsadm –R </path/to/somefile
service ipvsadm save 默認保存規則到 /etc/sysconfig/ipvsadm
如下的測試統一配置
RS1和RS2安裝服務telnet-server httpd,默認配置
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
添加用戶test 密碼test
selinux關閉(影響實驗,暫時關閉)
service iptables stop
因爲高可用集羣須要保證時間一致,所以能夠將director配置爲中繼ntp服務器,realserver把經過director來更新時間.
NAT模型工做原理:
1) 集羣節點必須和director在同一個IP網絡中,通常都是內網地址
2) 集羣節點的RIP必須把網關指向DIP
3) director負責數據報文的轉發,所以容易成爲系統瓶頸,只適合小規模應用
4) 支持端口映射
示例1:
配置:
director上配置
ipvsadm –A -t 192.168.80.250:80 –s rr
ipvsadm –a –t 192.168.80.250:80 –r 172.16.100.2 –m
ipvsadm –a –t 192.168.80.250:80 –r 172.16.100.3 -m
查看命令驗證:
[root@localhost ~]# ipvsadm -L -c -n #查看鏈接
[root@localhost ~]# ipvsadm -L -n --stats #鏈接,數據包個數,字節總數
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.80.250:80 42 154 138 12521 12241
-> 172.16.100.2:80 21 76 68 6182 6145
-> 172.16.100.3:80 21 78 70 6339 6096
[root@localhost ~]# ipvsadm -L -n --rate #查看上面三類數據的平均值(瞬時)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.80.250:80 1 3 2 349 217
-> 172.16.100.2:80 0 1 1 169 113
-> 172.16.100.3:80 0 1 1 180 103
[root@localhost ~]# ipvsadm -L -n --timeout #查看 tcp tcpfin udp的超時退出時間
Timeout (tcp tcpfin udp): 900 120 300
http://192.168.80.250/ #切換是按照這個1:1的比例
演示規則的操做
[root@localhost ~]# service ipvsadm save #保存規則
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.http #保存規則到單獨位置
[root@localhost ~]# cat /etc/sysconfig/ipvsadm #查看規則表的信息
-A -t 192.168.80.250:80 -s rr
-a -t 192.168.80.250:80 -r 172.16.100.2:80 -m -w 1
-a -t 192.168.80.250:80 -r 172.16.100.3:80 -m -w 2
[root@localhost ~]# ipvsadm -C #清空規則表
[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.http #從新載入規則表
DR模型的工做原理:
1. director必須有與realserver有一張網卡在同個物理網段中,必須是同個局域網
2. diector經過僅僅修改二層的源目MAC地址,將數據包(保留源目ip地址)發往真實的realserver,realserver直接把數據包發回給客戶端,director只是接收請求,能夠不作響應報文的轉發,若是realserver把網關設置在director,則另當別論。
3. 不支持端口映射
DR有兩種模型,1.VIP和DIP,RIP在同一個ip網絡
2.VIP和DIP,RIP不在同一個IP網絡,通常做爲外網地址提供服務
補充知識點:
ip地址是屬於內核的,不屬於單個網卡地址。做爲一臺有多網卡主機(多ip),把全部的ip通告給直連的主機。這個問題能夠解釋一臺雙網卡的主機A(不開啓轉發功能)(不一樣網段的ip),另外一臺與之相連的主機B能夠ping通另外一個ip.
ip響應的數據包的幀數據包的源mac地址是出接口對應網卡的mac地址
ip網絡響應數據包的時候是將請求數據包進入的接口的ip做爲源ip
所以以下圖,client請求VIP主機時候,按理是director來接收請求,可是reaserver也一樣會響應(根據ARP請求的原理),realserver的VIP並不做爲這個通訊地址,僅僅爲了可以識別服務而提供的。
如上:所須要解決的問題有:
1.realserver不對ARP廣播請求VIP 地址響應或者是作出通告
arptables
內核的參數來修改arp的宣告和響應級別
2.須要修改diector和realserver轉發數據包時候源ip保持爲VIP,而不是DIP或者RIP
添加路由 route add –host VIP dev eth1:0
kernel parameter
arp_ingnore:
響應級別:
0:只要本地配置有相應地址則進行響應
1:僅僅在請求的目標地址配置在請求到達的接口上的時候,才響應
arp_announce:
通告級別
0:將本地任何接口上的任何地址向外通告
1.試圖僅向目標網絡通告與其網絡匹配的地址
2.僅向與本地接口地址上配置的網絡進行通告
[root@RS1 ~]# cd /proc/sys/net/ipv4/conf/
all/ default/ eth1/ lo/
all/是全局
eth1/是指定的網卡
都得配置
並且VIP地址配置在realserver上的時候要記得設置爲不廣播
ifconfig eth1:0 VIP broadcast VIP netmask 255.255.255.255 up
示例2:
1.先配置director
[root@director ~]# ifconfig eth1:0 172.16.100.1 255.255.0.0 up
[root@director ~]# route add -host 172.16.100.1 dev eth1:0
[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
2.清空配置列表
iptables -F #清空
ipvsadm -C #清空
iptables -Z #計數器清空
3.再配置RS,RS要先配置arp_ingore 和arp_announce,再配置VIP地址,最後添加路由
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce
[root@RS1 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
[root@RS2 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
[root@RS1 ~]# route add -host 172.16.100.1 dev eth1:0
[root@RS2 ~]# route add -host 172.16.100.1 dev eth1:0
3.director配置負載集羣
[root@director ~]# ipvsadm -A -t 172.16.100.1:80 -s wrr
[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.2 -w 1 -g
[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.3 -w 2 -g
4.測試訪問成功
驗證:
[root@director html]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 wrr
-> 127.0.0.1:80 Local 5 0 4
-> 172.16.100.2:80 Route 1 0 0
-> 172.16.100.3:80 Route 2 1 0
複雜模型,VIP,提供服務的地址爲外網地址
分析數據包走向:
1.客戶端發送的數據包經過專線到達diector,源目地址爲CIP:VIP
2.director的INPUT鏈收到數據包,發現是集羣服務的一個請求,根據算法,源目地址不變,修改二層幀,發送給一臺RS
3.這臺RS屬於內網地址,將數據包發往內網出口路由器,回送數據包
示例3:
因爲手頭就一臺筆記本電腦,所以經過虛擬機來模擬此實驗。
準備:
1臺物理機,3臺虛擬機
Vmnet1,host-only這塊網卡工做,物理機兩個ip都配置在這塊網卡上
配置director
[root@director ~]# ifconfig eth1:0 192.168.10.80 netmask 255.255.255.0 up
[root@director ~]# route add -host 192.168.10.80 dev eth1:0 #從eth1口轉發數據包的時候保持源地址不變
[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #開啓路由轉發功能
配置RS,先配置RS的arp響應和請求級別,all是全局
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
再配置VIP地址
[root@RS1 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up
[root@RS1 ~]# route add –host 192.168.10.80 dev eth1:0
[root@RS2 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up
[root@RS2 ~]# route add –host 192.168.10.80 dev eth1:0
director上配置集羣,集羣調度算法爲wrr,工做模式爲DR
[root@director ~]# ipvsadm –A -t 192.168.10.80:80 –s wrr
[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.2 –g –w 1
[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.3 –g –w 2
測試:客戶端訪問
使用wrr輪詢 權重爲1:2,訪問比例大概就是1:2
[root@director ~]# ipvsadm -L -n –stats #查看狀態
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.10.80:80 44 208 0 20510 0
-> 172.16.100.2:80 15 72 0 7442 0
-> 172.16.100.3:80 29 136 0 13068 0
因爲是使用物理機來作客戶端訪問和做爲這個http服務的數據包的出站網關,根據上述數據包的走向。
所以能夠經過對Vmnet1進行抓包分析
本機物理機Vmnet1接口的mac地址 00:50:56:c0:00:01
director的mac地址 00:0c:29:98:5c:4a
RS1的mac地址 00:0c:29:e4:ea:ee
RS2的mac地址 00:0c:29:1c:25:e4
#client發往director
#director發往某臺RS
#RS經過另外一個接口發往客戶端
不管使用算法,LVS持久都能實如今必定時間內,未來自同一個客戶端請求派發至此前選定的RS。
持久鏈接模板(內存緩衝區):
每個客戶端 及分配給它的RS的映射關係;
配置方法很簡單:在配置集羣服務的時候添加-p參數來指定鏈接時長
ipvsadm -A|E ... -p timeout:
timeout: 持久鏈接時長,默認300秒;單位是秒;
主要應用:SSL鏈接會話
持久鏈接類型:
PPC:未來自於同一個客戶端對同一個集羣服務的請求,定位到以前選定的RS;單服務類型
PCC:未來自於同一個客戶端對一個集羣內全部服務的請求,定位到以前選定的RS;全部端口服務
PNMPP:防火牆標記鏈接 就是以前提升的-f選項
因爲LVS應用在INPUT鏈上面,所以這個標記要在PREROUTING鏈上標記
示例4:經過示例2的例子來作繼續實驗
PPC:
1.將http服務設定爲持久鏈接,時間爲600s
ipvsadm -A -t 172.16.100.1 -p 600 -s wrr
ipvsadm -a -t 172.16.100.1 -r 172.16.100.2:80 -g -w 1
ipvsadm -a -t 172.16.100.1 -r 172.16.100.3:80 -g -w 2
PCC:
2.未來自同一個客戶端對全部端口的請求,始終定向至此前選定的RS中去
ipvsadm -A -t 172.16.100.1 -p 600 -s wrr
ipvsadm -a -t 172.16.100.1 -r 172.16.100.2 -g -w 1
ipvsadm -a -t 172.16.100.1 -r 172.16.100.3 -g -w 1
PNMPP:
3.未來自同一個客戶端訪問集羣的http服務和telnet服務都轉發都以前選定的RS中去
iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 23 -j MARK --set-mark 10
ipvsadm -A -f 10 -p 600 -s wrr
ipvsadm -a -f 10 -r 172.16.100.2 -g -w 1
ipvsadm -a -f 10 -r 172.16.100.3 -g -w 2