TCP接入層的負載均衡 高可用 擴充套件性架構

2022-05-05 11:12:12 字數 3015 閱讀 9822

一、web-server的負載均衡

網際網路架構中,web-server接入一般使用nginx來做反向**,實施負載均衡。整個架構分三層:

中間反向**層,nginx

下游真實接入集群,web-server,常見web-server的有tomcat,apache

整個訪問過程為:

browser向daojia.com發起請求

dns伺服器將daojia.com解析為外網ip(1.2.3.4)

browser通過外網ip(1.2.3.4)訪問nginx

nginx實施負載均衡策略,常見策略有輪詢,隨機,ip-hash等

nginx將請求**給內網ip(192.168.0.1)的web-server

由於http短連線,以及web應用無狀態的特性,理論上任何乙個http請求落在任意一台web-server都應該得到正常處理(如果必須落在一台,說明架構不合理,不能水平擴充套件)。

問題來了,tcp是有狀態的連線,客戶端和服務端一旦建立連線,乙個client發起的請求必須落在同一臺tcp-server上,此時如何做負載均衡,如何保證水平擴充套件呢?

二、單機法tcp-server

單個tcp-server顯然是可以保證請求一致性:

client向tcp.daojia.com發起tcp請求

dns伺服器將tcp.daojia.com解析為外網ip(1.2.3.4)

client通過外網ip(1.2.3.4)向tcp-server發起請求

方案的缺點?

無法保證高可用。

三、集群法tcp-server

通過搭建tcp-server集群來保證高可用,客戶端來實現負載均衡:

client內配置有tcp1/tcp2/tcp3.daojia.com三個tcp-server的外網ip

客戶端通過「隨機」的方式選擇tcp-server,假設選擇到的是tcp1.daojia.com

通過dns解析tcp1.daojia.com

通過外網ip連線真實的tcp-server

如何保證高可用呢?

如果client發現某個tcp-server連線不上,則選擇另乙個。

潛在的缺點?

每次連線前,需要多實施一次dns訪問:

難以預防dns劫持

多一次dns訪問意味著更長的連線時間,這個不足在手機端更為明顯

如何解決dns的問題?

直接將ip配置在客戶端,可以解決上述兩個問題,很多公司也就是這麼做的(俗稱「ip直通車」)。

「ip直通車」有什麼新問題?

將ip寫死在客戶端,在客戶端實施負載均衡,擴充套件性很差:

如果原有ip發生變化,客戶端得不到實時通知

如果新增ip,即tcp-sever擴容,客戶端也得不到實時通知

如果負載均衡策略變化,需要公升級客戶端

四、服務端實施負載均衡

只有將複雜的策略下沉到服務端,才能根本上解決擴充套件性的問題。

增加乙個http介面,將客戶端的「ip配置」與「均衡策略」放到服務端是乙個不錯的方案:

client每次訪問tcp-server前,先呼叫乙個新增的get-tcp-ip介面,對於client而言,這個http介面只返回乙個tcp-server的ip

這個http介面,實現的是原client的ip均衡策略

拿到tcp-server的ip後,和原來一樣向tcp-server發起tcp長連線

這樣的話,擴充套件性問題就解決了:

如果原有ip發生變化,只需要修改get-tcp-ip介面的配置

如果新增ip,也是修改get-tcp-ip介面的配置

如果負載均衡策略變化,需要公升級客戶端

然而,新的問題又產生了,如果所有ip放在客戶端,當有乙個ip掛掉的時候,client可以再換乙個ip連線,保證可用性,而get-tcp-ip介面只是維護靜態的tcp-server集群ip,對於這些ip對應的tcp-server是否可用,是完全不知情的,怎麼辦呢?

五、tcp-server狀態上報

get-tcp-ip介面怎麼知道tcp-server集群中各台伺服器是否可用呢,tcp-server主動上報是乙個潛在方案,如果某乙個tcp-server掛了,則會終止上報,對於停止上報狀態的tcp-server,get-tcp-ip介面,將不返回給client相應的tcp-server的外網ip。

該設計的存在的問題?

誠然,狀態上報解決了tcp-server高可用的問題,但這個設計犯了乙個「反向依賴」的耦合小錯誤:使得tcp-server要依賴於乙個與本身業務無關的web-server。

六、tcp-server狀態拉取

更優的方案是:web-server通過「拉」的方式獲取各個tcp-server的狀態,而不是tcp-server通過「推」的方式上報自己的狀態。

這樣的話,每個tcp-server都獨立與解耦,只需專注於資深的tcp業務功能即可。

高可用、負載均衡、擴充套件性等任務由get-tcp-ip的web-server專注來執行。

多說一句,將負載均衡實現在服務端,還有乙個好處,可以實現異構tcp-server的負載均衡,以及過載保護:

靜態實施:web-server下的多個tcp-server的ip可以配置負載權重,根據tcp-server的機器配置分配負載(nginx也有類似的功能)

動態實施:web-server可以根據「拉」回來的tcp-server的狀態,動態分配負載,並在tcp-server效能極具下降時實施過載保護

七、總結

web-server如何實施負載均衡?

利用nginx反向**來輪詢、隨機、ip-hash。

tcp-server怎麼快速保證請求一致性?

單機。如何保證高可用?

客戶配置多個tcp-server的網域名稱。

如何防止dns劫持,以及加速?

ip直通車,客戶端配置多個tcp-server的ip。

如何保證擴充套件性?

服務端提供get-tcp-ip介面,向client屏遮蔽負載均衡策略,並實施便捷擴容。

如何保證高可用?

tcp-server「推」狀態給get-tcp-ip介面,

orget-tcp-ip介面「拉」tcp-server狀態。

接入層的負載均衡 高可用 擴容

利用nginx的反向 來實現站點層web server的負載均衡,負載均衡演算法有 隨機,輪詢,靜態權重,一致性hash等。接入層的負載均衡實現是依賴於lvs的負載均衡 作業系統級別,比nginx應用層效能更好 使用f5 硬體級別,效能比lvs更好 不管使用lvs,還是f5,雖然效能比nginx好很...

TCP接入層的負載均衡 高可用 擴充套件性架構

中間反向 層,nginx 下游真實接入集群,web server,常見web server的有tomcat,apache dns伺服器將daojia.com解析為外網ip 1.2.3.4 browser通過外網ip 1.2.3.4 訪問nginx nginx實施負載均衡策略,常見策略有輪詢,隨機,i...

高可用和四層負載均衡

高可用指一般是指2臺機器啟動著完全相同的業務系統,當有一台機器down機了,另外一台伺服器就能快速的接管,對於訪問的使用者是無感知的。1.硬體通常使用 f5 2.軟體通常使用 keepalived 修改keepalived的配置檔案 檢測指令碼 vrrp script check nginx 配置v...