自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

TCP接入層的負(fù)載均衡、高可用、擴(kuò)展性架構(gòu)

開發(fā) 開發(fā)工具
本文主要介紹TCP接入層如何實(shí)施負(fù)載均衡、如何保證高可用以及擴(kuò)展性架構(gòu)。

一、web-server的負(fù)載均衡

互聯(lián)網(wǎng)架構(gòu)中,web-server接入一般使用nginx來做反向代理,實(shí)施負(fù)載均衡。整個(gè)架構(gòu)分三層:

  • 上游調(diào)用層,一般是browser或者APP
  • 中間反向代理層,nginx
  • 下游真實(shí)接入集群,web-server,常見web-server的有tomcat,apache

整個(gè)訪問過程為:

  • browser向daojia.com發(fā)起請(qǐng)求
  • DNS服務(wù)器將daojia.com解析為外網(wǎng)IP(1.2.3.4)
  • browser通過外網(wǎng)IP(1.2.3.4)訪問nginx
  • nginx實(shí)施負(fù)載均衡策略,常見策略有輪詢,隨機(jī),IP-hash等
  • nginx將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)IP(192.168.0.1)的web-server

由于http短連接,以及web應(yīng)用無狀態(tài)的特性,理論上任何一個(gè)http請(qǐng)求落在任意一臺(tái)web-server都應(yīng)該得到正常處理(如果必須落在一臺(tái),說明架構(gòu)不合理,不能水平擴(kuò)展)。

問題來了,tcp是有狀態(tài)的連接,客戶端和服務(wù)端一旦建立連接,一個(gè)client發(fā)起的請(qǐng)求必須落在同一臺(tái)tcp-server上,此時(shí)如何做負(fù)載均衡,如何保證水平擴(kuò)展呢?

二、單機(jī)法tcp-server

單機(jī)法tcp-server

單個(gè)tcp-server顯然是可以保證請(qǐng)求一致性:

  • client向tcp.daojia.com發(fā)起tcp請(qǐng)求
  • DNS服務(wù)器將tcp.daojia.com解析為外網(wǎng)IP(1.2.3.4)
  • client通過外網(wǎng)IP(1.2.3.4)向tcp-server發(fā)起請(qǐng)求

方案的缺點(diǎn)?

  • 無法保證高可用。

三、集群法tcp-server

集群法tcp-server

通過搭建tcp-server集群來保證高可用,客戶端來實(shí)現(xiàn)負(fù)載均衡:

  • client內(nèi)配置有tcp1/tcp2/tcp3.daojia.com三個(gè)tcp-server的外網(wǎng)IP
  • 客戶端通過“隨機(jī)”的方式選擇tcp-server,假設(shè)選擇到的是tcp1.daojia.com
  • 通過DNS解析tcp1.daojia.com
  • 通過外網(wǎng)IP連接真實(shí)的tcp-server

1. 如何保證高可用呢?

如果client發(fā)現(xiàn)某個(gè)tcp-server連接不上,則選擇另一個(gè)。

2. 潛在的缺點(diǎn)?

每次連接前,需要多實(shí)施一次DNS訪問:

  • 難以預(yù)防DNS劫持
  • 多一次DNS訪問意味著更長(zhǎng)的連接時(shí)間,這個(gè)不足在手機(jī)端更為明顯

3. 如何解決DNS的問題?

直接將IP配置在客戶端,可以解決上述兩個(gè)問題,很多公司也就是這么做的(俗稱“IP直通車”)。

4. “IP直通車”有什么新問題?

將IP寫死在客戶端,在客戶端實(shí)施負(fù)載均衡,擴(kuò)展性很差:

  • 如果原有IP發(fā)生變化,客戶端得不到實(shí)時(shí)通知
  • 如果新增IP,即tcp-sever擴(kuò)容,客戶端也得不到實(shí)時(shí)通知
  • 如果負(fù)載均衡策略變化,需要升級(jí)客戶端

四、服務(wù)端實(shí)施負(fù)載均衡

只有將復(fù)雜的策略下沉到服務(wù)端,才能根本上解決擴(kuò)展性的問題。

服務(wù)端實(shí)施負(fù)載均衡

增加一個(gè)http接口,將客戶端的“IP配置”與“均衡策略”放到服務(wù)端是一個(gè)不錯(cuò)的方案:

  • client每次訪問tcp-server前,先調(diào)用一個(gè)新增的get-tcp-ip接口,對(duì)于client而言,這個(gè)http接口只返回一個(gè)tcp-server的IP
  • 這個(gè)http接口,實(shí)現(xiàn)的是原client的IP均衡策略
  • 拿到tcp-server的IP后,和原來一樣向tcp-server發(fā)起TCP長(zhǎng)連接

這樣的話,擴(kuò)展性問題就解決了:

  • 如果原有IP發(fā)生變化,只需要修改get-tcp-ip接口的配置
  • 如果新增IP,也是修改get-tcp-ip接口的配置
  • 如果負(fù)載均衡策略變化,需要升級(jí)客戶端

然而,新的問題又產(chǎn)生了,如果所有IP放在客戶端,當(dāng)有一個(gè)IP掛掉的時(shí)候,client可以再換一個(gè)IP連接,保證可用性,而get-tcp-ip接口只是維護(hù)靜態(tài)的tcp-server集群IP,對(duì)于這些IP對(duì)應(yīng)的tcp-server是否可用,是完全不知情的,怎么辦呢?

五、tcp-server狀態(tài)上報(bào)

tcp-server狀態(tài)

get-tcp-ip接口怎么知道tcp-server集群中各臺(tái)服務(wù)器是否可用呢,tcp-server主動(dòng)上報(bào)是一個(gè)潛在方案,如果某一個(gè)tcp-server掛了,則會(huì)終止上報(bào),對(duì)于停止上報(bào)狀態(tài)的tcp-server,get-tcp-ip接口,將不返回給client相應(yīng)的tcp-server的外網(wǎng)IP。

該設(shè)計(jì)存在的問題?

誠(chéng)然,狀態(tài)上報(bào)解決了tcp-server高可用的問題,但這個(gè)設(shè)計(jì)犯了一個(gè)“反向依賴”的耦合小錯(cuò)誤:使得tcp-server要依賴于一個(gè)與本身業(yè)務(wù)無關(guān)的web-server。

六、tcp-server狀態(tài)拉取

tcp-server狀態(tài)拉取

更優(yōu)的方案是:web-server通過“拉”的方式獲取各個(gè)tcp-server的狀態(tài),而不是tcp-server通過“推”的方式上報(bào)自己的狀態(tài)。

這樣的話,每個(gè)tcp-server都獨(dú)立與解耦,只需專注于資深的tcp業(yè)務(wù)功能即可。

高可用、負(fù)載均衡、擴(kuò)展性等任務(wù)由get-tcp-ip的web-server專注來執(zhí)行。

多說一句,將負(fù)載均衡實(shí)現(xiàn)在服務(wù)端,還有一個(gè)好處,可以實(shí)現(xiàn)異構(gòu)tcp-server的負(fù)載均衡,以及過載保護(hù):

  • 靜態(tài)實(shí)施:web-server下的多個(gè)tcp-server的IP可以配置負(fù)載權(quán)重,根據(jù)tcp-server的機(jī)器配置分配負(fù)載(nginx也有類似的功能)
  • 動(dòng)態(tài)實(shí)施:web-server可以根據(jù)“拉”回來的tcp-server的狀態(tài),動(dòng)態(tài)分配負(fù)載,并在tcp-server性能***下降時(shí)實(shí)施過載保護(hù)

七、總結(jié)

  • web-server如何實(shí)施負(fù)載均衡? 利用nginx反向代理來輪詢、隨機(jī)、ip-hash。
  • tcp-server怎么快速保證請(qǐng)求一致性? 單機(jī)。
  • 如何保證高可用? 客戶配置多個(gè)tcp-server的域名。
  • 如何防止DNS劫持,以及加速? IP直通車,客戶端配置多個(gè)tcp-server的IP。
  • 如何保證擴(kuò)展性? 服務(wù)端提供get-tcp-ip接口,向client屏屏蔽負(fù)載均衡策略,并實(shí)施便捷擴(kuò)容。
  • 如何保證高可用? tcp-server“推”狀態(tài)給get-tcp-ip接口,orget-tcp-ip接口“拉”tcp-server狀態(tài)。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2020-10-28 08:07:58

TCP負(fù)載均衡網(wǎng)絡(luò)協(xié)議

2023-12-20 09:26:20

高可用高吞吐高擴(kuò)展性

2013-04-09 10:16:28

OpenStackGrizzlyHyper-V

2024-11-11 16:29:54

負(fù)載均衡器系統(tǒng)

2013-03-19 10:50:38

2014-05-29 10:09:13

甲骨文MySQL Fabri

2021-09-02 09:42:11

測(cè)試軟件可擴(kuò)展性開發(fā)

2010-06-30 17:15:39

向外擴(kuò)展SQL Ser

2023-11-07 09:54:27

架構(gòu)演進(jìn)

2010-07-21 11:21:05

SQL Server

2010-07-01 11:38:13

向外擴(kuò)展 SQL Se

2022-09-05 15:17:34

區(qū)塊鏈比特幣可擴(kuò)展性

2018-04-10 14:38:10

區(qū)塊鏈

2009-09-03 17:18:40

C#擴(kuò)展性對(duì)象模型

2015-05-13 17:15:01

Elasticsear分布式搜索插件

2009-09-03 17:33:08

C#常規(guī)擴(kuò)展性模型

2020-04-14 12:03:49

AI擴(kuò)展性機(jī)器學(xué)習(xí)

2021-12-03 14:41:00

云存儲(chǔ)可擴(kuò)展性存儲(chǔ)

2024-10-10 14:01:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)