只解決c10k問題是不夠的,單臺主機的處理能力是有限的,一臺主機同時處理500個動態網頁請求已是極限了。這裏有兩種方法提高處理性能,一,定製高性能的計算機,衆所周知計算機硬件設計成本極其高,性能每提升10%成本就要增長一倍,這也是intel被稱爲擠牙膏公司的緣由,不是其研發能力不行而是計算機硬件性能提高的難度太大,這個方法貌似不可行。二,使用兩臺主機處理業務,這就會引來一個問題怎麼把請求分發到兩個主機,這裏咱們引入了負載均衡器。html
# 目錄mysql
負載均衡nginx
lvs工做方式和調度方法算法
ipvsadm的使用sql
lvs-nat後端
lvs-dr緩存
多端口綁定和持久鏈接bash
# 負載均衡服務器
使用負載均衡有兩個方法,一是採用商用負載均衡硬件的,這個方法是最好的方法,能上硬件必定不要使用軟件,又是硬件一樣的問題也是價格,只要是涉及到基礎設施的服務必定要使用。一方面是硬件的穩定性,比軟件好不少,雖然軟件可維護性和拓展性比較好,可是對於一些金融公司,他們玩的就是公信力和大衆信心,每一個故障都是競爭對手拆臺的理由,一旦故障硬件背鍋,理賠。經常使用的硬件F5的Big-IP,Citrix的Netscaler,A10的A10網絡
另外一種是採用軟件負載均衡,只要考慮成本使用負載均衡軟件就對了,它的性能比硬件也不會差異太大,而且靈活。經常使用的有lvs,nginx,haproxy,ats。。。
在作負載均衡的時候,咱們在7層模型的哪一層作負載均衡,ip層基於主機作負載均衡粒度太大可用性太差基本不使用,更低的層基本上沒有價值了,tcp層的話咱們就能夠把不一樣服務的請求採起不一樣的方式負載均衡,應用層的話咱們能夠根據具體協議拆包分析後負載均衡,既然涉及到拆開數據包,那處理的數據量就會大大增長,那麼對計算機性能要求也越高,性能就越差,而且負載均衡器的通用性也越差。
傳輸層:lvs,nginx:(stream),haproxy:(mode tcp)
應用層:
http:nginx, httpd, haproxy(mode http)
fastcgi:nginx, httpd
mysql:mysql-proxy
# lvs工做方式和調度方法
### lvs的工做方式
有四種lvs-nat,lvs-dr,lvs-tun,lvs-fullnat
lvs集羣類型中的術語:
vs:Virtual Server, Director, Dispatcher, Balancer
rs:Real Server, upstream server, backend server
CIP:Client IP, VIP: Virtual serve IP, RIP: Real server IP, DIP: Director IP
* lvs-nat
它的工做機制相似iptables的dnat功能,可是它工做於input鏈上。一次請求過程以下圖
當客戶端向director發送數據,數據在input鏈上目的地址vip換爲rip後,被轉發到postrouting鏈上過濾後發送到real server,real server處理完後把數據發送到director,director把這個數據的源地址rip更改成vip,固然lvs-nat不只僅是更改ip也能夠更改端口,因此支持端口映射,由以上能夠總結nat的特色,rip和dip必須在同一網絡中,rs的網關須要指向dip,由於因此的數據必須通過director更改ip。
這種工做方式director很容成爲網絡瓶頸,由於因此的數據都要通過director,director網卡的吞吐量就表明整個網站的流量吞吐量,當今世界的慢慢走向5G,director是徹底不能知足需求的,須要藉助其它網絡設備幫助director分擔流量,這就引入了lvs-dr模型。
* lvs-dr
如圖,lvs-dr也是在input鏈上更改數據,可是它更改的不是ip地址而是mac地址,它把目的mac地址vmac更改成rmac,這裏就要求vip,rip,dip必須在廣播域內,可是地址不必定要在一個網段,由於他們間的通訊須要使用mac直接通訊。realserver處理請求後直接把數據返回給客戶端。
等等,不對啊!realserver是怎麼給客戶端發送數據包的,realserver服務器上只有rip怎麼用vip給客戶端通訊,這裏須要咱們給realserver配置vip。可是有一個問題,在網絡中多個主機擁有同一個ip會產生衝突的,咱們的解決方案是隻讓一個主機發送arp廣播而且響應arp請求,選誰毋庸置疑只能選擇director。
控制arp廣播arp-ignore,0廣播,1不廣播;控制響應arp-announce,0響應全部接口信息,1儘可能只響應當前網卡的信息,2只響應當前網卡的信息
lvs-dr的使用方法有兩種,一種是每一個realserver都有與公網交互的公網ip,另外一種是隻有內網ip,以後演示。
* lvs-tun
它是在本來的報文外部繼續封裝一個ip頭,有可能形成超級幀
* lvs-fullnat
它是把源ip和目的ip都更改,至關於director請求realserver,realserver響應回來數據再把兩個ip地址更改,這樣這個數據包就能夠跨越路由通訊了,nat原本就會形成director網絡瓶頸,它的使用場景主要應用於請求數據量不大但後服務器數量不少的場景。
### 調度方法
調用方法能夠分爲兩類,一類是靜態調度算法,一類是動態調用算法
* 靜態算法
rr #以輪詢的方法,把請求轉發到後端的主機
wrr #加權輪詢,把請求按照必定的比例轉發後端主機
sh #源地址哈希,把源地址作hash運算後,把realserver也hash,每一個realserver只處理本身hash和上一realserver的hash之間的源地址的請求如圖
dh #目標地址哈希,這樣realserver能夠開啓緩存了
* 動態算法
lc #最少鏈接,根據realserver的正在處理請求的數量進行調度,Overhead=activeconns*256+inactiveconns
wlc #加權最少鏈接,Overhead=(activeconns*256+inactiveconns)/weight
nq #在lc的基礎上改進的,意思是不準有realserver主機空閒
sed #最短等等時間,Overhead=(activeconns+1)*256/weight
lblc #動態的DH算法;基於地址的最小鏈接數調度(locality-based least-connection):未來自同一個目的地址的請求分配給同一臺RS,此時這臺服務器是還沒有滿負荷的。不然就將這個請求分配給鏈接數最小的RS,並以它做爲下一次分配的首先考慮
lblcr #帶複製功能的lblc
# ipvsadm的使用
管理集羣服務:增、改、刪;
增、改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
刪:
ipvsadm -D -t|u|f service-address
[-s scheduler]:指定集羣的調度算法,默認爲wlc
service-address:
-t|u|f:
-t: TCP協議的端口,VIP:TCP_PORT
-u: TCP協議的端口,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
管理集羣上的RS:增、改、刪;
增、改:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
刪:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
rip[:port]
# lvs-nat
nat實驗拓撲圖
這個使用我採用的是虛擬機,主機ip作cip,director的vip採用的橋接網絡,dip和rip採用的是僅主機模式
realserver1執行的命令
yum install httpd -y #安裝httpd echo rs1 > /var/www/html/index.html #提供網頁文件
realserver2執行的命令
yum install httpd -y echo rs2 > /var/www/html/index.html
director執行的命令
yum install ipvsadm -y ipvsadm -A -t 172.16.29.4:80 -s wrr ipvsadm -a -t 172.16.29.4:80 -r 192.168.95.2 -m -w 1 ipvsadm -a -t 172.16.29.4:80 -r 192.168.95.3 -m -w 2
# lvs-dr
### 都採用公網ip的方案
全部網卡都採用橋接
director執行的命令
ifconfig eno16777736:0 172.16.29.4 netmask 255.255.255.255 broadcast 172.16.29.4 up #若在directer和realserver在同一個網段裏必定要使用這一行 ipvsadm -A -t 172.16.29.4:80 -s wrr ipvsadm -a -t 172.16.29.4:80 -r 172.16.29.10 -g -w 1 ipvsadm -a -t 172.16.29.4:80 -r 172.16.29.20 -g -w 2
realserver執行的命令
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 172.16.29.4 netmask 255.255.255.255 broadcast 172.16.29.4 up route add -host 172.16.29.4 dev lo:0
### 只要一個公網ip的解決方案
所有接口採用的僅主機模式,而且每一個主機只有一個網卡,每一個網卡都先配置一個ip,後期再添加須要的ip
director要執行的命令
ifconfig eno16777736:0 192.168.95.20 netmask 255.255.255.0 broadcast 192.168.95.20 ipvsadm -A -t 192.168.95.20:80 -s wrr ipvsadm -a -t 192.168.95.20:80 -r 10.0.0.10 -g -w 2 ipvsadm -a -t 192.168.95.20:80 -r 10.0.0.20 -g -w 2
realserver須要執行的命令
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 192.168.95.20 netmask 255.255.255.255 broadcast 192.168.95.20 up route add -host 192.168.95.20 dev lo:0 route add default gw 10.0.0.1
路由設備須要執行的命令
echo 1 > /pro/sys/net/ipv4/ip_forward #開啓轉發功能
# 多端口綁定和持久鏈接
### FWM:FireWall Mark
藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度;
打標記方法(在Director主機):
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
基於標記定義集羣服務:
# ipvsadm -A -f NUMBER [options]
### lvs persistence:持久鏈接
持久鏈接模板:實現不管使用任何算法,在一段時間內,實現未來自同一個地址的請求始終發往同一個RS;
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
port Affinity:
每端口持久:每集羣服務單獨定義,並定義其持久性;
每防火牆標記持久:基於防火牆標記定義持久的集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity;
每客戶端持久:基於0端口定義集羣服務,即將客戶端對全部應用的請求通通調度至後端主機,並且可以使用持久鏈接進行綁定;
# 總結
lvs是負載均衡器中最基本的,理解了它的原理和使用方法,基本上掌握了大多數的負載均衡器的原理。其中dr模型是必須掌握的,真正使用的話我感受會使用dr,net的功能頗有可能被7層代理的服務器替代了。多端口綁定功能也很經常使用好比80和443端口綁定統一調度;持久鏈接雖然破壞調度效果,可是在沒有session緩存服務器的話仍是很高效的。