高併發-高可用-負載均衡LVS

隨着互聯網的快速發展,越來越多的互聯網服務面臨着極其龐大的併發量,面對龐大的併發,現在的人們是如何解決的呢?本文是我瞭解到的處理高併發時使用負載均衡的一些知識,我將其寫爲一篇文章分享給大家,希望能夠對大家學習負載均衡有點幫助。

幾個基本概念

  • 高併發:短時間內對服務器進行大量的請求。
  • 高可用:高併發常見下要求服務器具有高可用性
  • 負載均衡:在高併發的場景下,我們會有專門的負載均衡服務器來將大量的請求分發到對應的應用服務器上,實現分而治之。

負載均衡

  • 四層負載均衡:在高併發場景下,通常在真正的應用服務器前會有一臺或多臺四層負載均衡服務器,它只有物理層、鏈路層、網絡層和傳輸層,負載均衡服務器的傳輸層和客戶端的傳輸層間並不會建立TCP連接,它傳輸層的作用是拿到客戶端請求的端口號,看一眼是否訪問的是需要做負載均衡的服務的端口號,如果是會去做負載均衡相關操作,如果不是可能進行其他操作,丟棄或者交給上層處理。
  • 負載均衡是數據包級別的轉發,相對於路由器來說,它只是會在傳輸層判斷下端口號,因此它可以做到快速的處理大量的請求。
  • 做負載均衡時,多臺應用服務器應該是鏡像的(即完全一樣)。
  • 做負載均衡時,用戶知道的應用服務器的地址其實是負載均衡服務器的,並不是真正的應用服務器地址,當請求到達負載均衡服務器時,負載均衡服務器會將請求轉到真正的應用服務器。
    在這裏插入圖片描述
    在這裏插入圖片描述

不同的負載方式

D-NAT方式

  • 基於4層的負載均衡。
  • D-NAT的過程: 客戶端請求->到達負載均衡服務器,通過D-NAT的方式將目標地址轉換爲真正的應用服務器地址->將請求給到真正的應用服務器,服務器處理-> 將響應返回到負載均衡服務器,負載均衡服務器會將源地址替換爲自己的IP地址返回給客戶端-> 客戶端接收響應。
  • 這種方式需要將真正服務器的網關設置爲負載均衡服務器,使得數據包能夠返回負載均衡服務器。
  • 侷限: 客戶端的請求一般數據包比較小,而服務端的響應包數據量會比較大,請求和響應都經過負載均衡服務器,這將使得負載均衡服務器的帶寬成爲高併發的瓶頸。在這裏插入圖片描述

DR方式

  • DR,翻譯爲中文爲直接路由,通過Mac欺騙來完成;這種方式的負載均衡使得請求與響應成爲一種環形,解決了D-NAT的帶寬問題,相對於D-NAT,效率也有了一定的提升。
  • 這是一種基於2層的負載均衡。
  • 這種方式關鍵的兩點就是 第一,在負載均衡服務器上的鏈路層,將數據包的目標Mac地址封裝爲真正的應用服務器的地址,使得數據包能到達真正的應用服務器;第二,對真正的應用服務器做處理,使得其持有負載均衡服務器的IP地址。
  • 侷限: 對Mac地址做包裝,充分的利用了Mac地址在節點間的作用,但這也使得負載均衡服務器和真正的服務器必須在同一局域網內。
  • 雖然真正的應用服務器持有負載均衡服務器的IP地址,但真正的應用服務器不會將負載均衡服務器的IP地址暴露在互聯網上(需要在內核層面修改網絡參數,做配置),客戶端的所有請求只會到達負載均衡服務器。

在這裏插入圖片描述

TUN方式

  • TUN,翻譯爲中文爲隧道,簡單的理解這種方式即負載均衡服務器會在到來的請求數據包外再包一層IP地址(源IP爲自己的分發IP,目標IP爲真正的服務器IP),使得數據包可以跨網絡傳輸到真正的應用服務器上,這種方式相當於給數據包又套了一層外包裝使得其可以在不同網絡間傳輸,我們給這種方式起了個名叫做隧道技術,VPN也是使用這種技術實現。
  • 這種方式的負載均衡服務器可以和真正的服務器跨網絡。
    在這裏插入圖片描述

總結

  • 這三種實現負載均衡的方式不同點就是負載均衡服務器對數據包的處理,D-NAT修改IP地址;DR修改Mac地址;TUN做外包裝。
  • 負載均衡服務器並不會與客戶端建立連接,它只做數據包級別的轉發,但它確可以監測到客戶端和真正服務器的通信狀態(偷窺數據包)。

網絡小知識

上述方式中的後兩種關鍵點就是我們需要在真正的應用服務器上做到IP地址的隱藏(對外隱藏,對內可見),這種技術是怎麼實現的呢,我在這做個簡單介紹。

  • 我們的計算機中最少也會有兩個網絡接口,一個爲真實的物理網絡接口 eth0,另一個爲內核的環回網絡接口lo(loopback),真實的物理網絡接口做向外網絡通信,環回接口lo在計算機內部使用(我們在本機上測試部署在Tomcat上的程序時,IP地址通常會寫localhost:port,其實這個過程就是使用了內核的環回接口,當請求到達內核時,內核發現IP是本機,則會走環回接口lo)。

  • 我們也可以通過已有網絡接口新建許多的子接口 例如,使用命令 ifconfig eth0:8 192.168.120.11 可以創建出一個新的網絡接口etho:8。

  • 我們可以更改內核的參數改變一些網絡配置,修改當我們的計算機收到ARP請求時的響應級別和主動發送ARP請求時向外通告自己的地址信息級別,即當我們發送或收到ARP請求如何包裝自己的IP地址信息(當本地配置有多個網絡接口,也意味着有多個IP地址,此時我們向外公佈哪一個)。

      這兩個參數的配置信息在/proc/sys/net/ipv4/conf/對應的網卡/arp_ignore(響應級別)  和arp_announce(主動請求級別)中。
      arp_ignore:
      0:做IP包裝時,包裝本地配置中的任意的一個IP(包括環回網卡IP)
      1:哪個網絡接口收到,包裝哪個網口上的IP
      
      arp_announce:
      0:使用本地配置中任意的一個IP包裝
      1:試圖使用一個與源IP地址屬於同一個網絡的IP地址做包裝
      2:哪個網口發請求包就用哪個網口上的IP地址
    

通過上述內容的描述,我們可以這樣解決隱藏IP的問題:我們可以創建一個環回子接口,給其配置負載均衡的IP地址,然後設置arp_ignore的級別爲1,arp_announce的級別爲2。

注:設置級別時,不能直接使用vim 來做,那樣不會起作用,需要通過重定向來做,例如:echo 1 > /proc/sys/net/ipv4/eth0/arp_ignore

LVS

提到了負載均衡,那就必須得知道LVS,因爲它就是一個專門用來做負載均衡內核級的軟件,全稱爲Linux virtual server,Linux虛擬服務器,其實我們上面提到的3種實現方式正是LVS實現負載均衡的3種不同模式。可以這麼說上面3種是原理,LVS是對它們的應用,Linux系統的內核裏有LVS的實現代碼(ipvs模塊),因此只要服務器上安裝了Linux系統,那麼我們就可以將其做成一個負載均衡服務器。

在虛擬機上搭建LVS

node01做負載均衡服務器,node02、node03做真正的應用服務器。
在這裏插入圖片描述

步驟參考下圖:
步驟一:配置網絡
在這裏插入圖片描述
步驟二:在node02、node03中安裝一個http的服務,做應用服務器
在這裏插入圖片描述
步驟三:爲node01做LVS服務配置
在這裏插入圖片描述
步驟四:驗證
在這裏插入圖片描述
注:
-A 部分配置的是進入負載均衡服務器的請求相關參數 -a 配置的是請求在負載均衡服務器的具體分發
LVS的具體實現在內核中,我們需要一個客戶端的工具ipvsadm來操作內核中的ipvs模塊

高可用Keepalive

  • 上邊我們用LVS做了負載均衡服務器,有了它我們就可以面對高併發的場景了,但其實還會有一些問題,第一,負載均衡服務器可能會掛掉;第二,真正的應用服務器也可能出故障;這樣我們服務的可用性就沒有了保證。
  • 要使得我們的服務具備高可用,那麼我們就得解決上述兩個問題;對於第一個其實關鍵點就是單點問題,我們的負載均衡服務器只有一個,解決它的辦法其實也簡單,我們可以用多臺(常使用的方式有主備),第二個我們可以通過發送請求根據相應狀態碼判斷它是否故障。
  • 主備模式:雙方要能交流(備服務器要能拿到主服務器的狀態 )
  • 爲了解決這個問題,Keepalive這個第三方應用軟件應運而生,我們可以使用它來搭建出高可用的系統,它可以操作內核中的ipvs模塊(可以做LVS相關的配置工作)、可以給備用服務器發送消息(自己是否還存活)、可以發送請求給真正的應用服務器(判斷服務是否正常),它的整個工作都通過配置文件來完成(配置好了,啓動軟件即可)

在虛擬機上搭建高可用的LVS

在上面LVS的基礎上進行試驗:

第一步:清空node01的配置
node01:
ipvsadm -C
ifconfig eth0:8 down


第二步:安裝Keepalive,做配置文件

node01,node04:
yum install keepalived ipvsadm -y
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vi keepalived.conf
node01的配置文件:

		vrrp:虛擬路由冗餘協議
			vrrp_instance VI_1 {
				state MASTER         // 標記主服務器   在node04上將MASTER改爲 BACKUP標記備服務器
				interface eth0           //用哪個網口   一臺服務器可能有多個網口
				virtual_router_id 51    //ID號
				priority 100		 //	 權重,數值越大,權重越高,可以有多臺備服務器,根據這個來確定主服務器掛掉後誰  來做主服務器
				advert_int 1
				authentication {
					auth_type PASS
					auth_pass 1111
				}
				virtual_ipaddress {
					192.168.150.100/24 dev eth0 label  eth0:3       //配置做負載均衡的IP地址 
				}
			}
		virtual_server 192.168.150.100 80 {    這個模塊用來配置LVS的哪個IP需要做負載和一些負載策略和真正的應用服務器信息
			delay_loop 6
			lb_algo rr
			lb_kind DR
			nat_mask 255.255.255.0
			persistence_timeout 0
			protocol TCP

			real_server 192.168.150.12 80 {     //真正的應用服務器信息
				weight 1
				HTTP_GET {       //定義請求,負載服務器判斷真正的應用服務器是否有故障
					url {
					  path /
					  status_code 200
					}
					connect_timeout 3
					nb_get_retry 3
					delay_before_retry 3
				}   
			}       
			real_server 192.168.150.13 80 {
				weight 1
				HTTP_GET {
					url {
					  path /
					  status_code 200
					}
					connect_timeout 3
					nb_get_retry 3
					delay_before_retry 3
				}
			}
		scp  ./keepalived.conf  root@node04:`pwd`      //將node01中的配置拷貝到node04中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章