<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2813字,需瀏覽 6分鐘

           ·

          2020-10-28 11:32

          今天和大家系統(tǒng)性聊聊TCP的負(fù)載均衡,高可用,與擴(kuò)展性架構(gòu)。

          web-server的負(fù)載均衡,高可用,擴(kuò)展性架構(gòu)是怎么實施的?
          互聯(lián)網(wǎng)架構(gòu)中,web-server接入一般使用nginx來做反向代理,實施負(fù)載均衡。整個架構(gòu)分三層:
          (1)上游調(diào)用層,一般是browser或者APP;
          (2)中間反向代理層,nginx;
          (3)下游真實接入集群,web-server,常見web-server的有tomcat,apache;
          ?
          那整個訪問過程是怎么樣的?
          (1)browser向daojia.com發(fā)起請求;
          (2)DNS將daojia.com解析為外網(wǎng)IP(1.2.3.4);
          (3)browser通過外網(wǎng)IP(1.2.3.4)訪問nginx;
          (4)nginx實施負(fù)載均衡策略,常見策略有輪詢,隨機(jī),IP-hash等;
          (5)nginx將請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)IP(192.168.0.1)的web-server;
          ?
          由于http短連接,以及web應(yīng)用無狀態(tài)的特性,理論上任何一個http請求落在任意一臺web-server都應(yīng)該得到正常處理。
          畫外音:如果必須落在一臺,說明架構(gòu)可能不合理,難以水平擴(kuò)展。
          ?
          問題來了,tcp是有狀態(tài)的連接,客戶端和服務(wù)端一旦建立連接,一個client發(fā)起的請求必須落在同一臺tcp-server上,此時如何做負(fù)載均衡,如何保證水平擴(kuò)展呢?
          ?
          方案一:單機(jī)法tcp-server
          單個tcp-server顯然是可以保證請求一致性:
          (1)client向tcp.daojia.com發(fā)起tcp請求;
          (2)DNS將tcp.daojia.com解析為外網(wǎng)IP(1.2.3.4);
          (3)client通過外網(wǎng)IP(1.2.3.4)向tcp-server發(fā)起請求;
          ?
          這個方案有什么缺點(diǎn)?
          無法保證高可用。
          ?
          方案二:集群法tcp-server
          可以通過搭建tcp-server集群來保證高可用,客戶端來實現(xiàn)負(fù)載均衡
          (1)client內(nèi)配置有tcp1/tcp2/tcp3.daojia.com三個tcp-server的外網(wǎng)IP;
          (2)客戶端通過“隨機(jī)”的方式選擇tcp-server,假設(shè)選擇到的是tcp1.daojia.com;
          (3)通過DNS解析tcp1.daojia.com;
          (4)通過外網(wǎng)IP連接真實的tcp-server;
          ?
          如何保證高可用呢?
          如果client發(fā)現(xiàn)某個tcp-server連接不上,則選擇另一個。
          ?
          這個方案有什么缺點(diǎn)?
          每次連接前,需要多實施一次DNS訪問:
          (1)難以預(yù)防DNS劫持;
          (2)多一次DNS訪問意味著更長的連接時間,這個不足在手機(jī)端更為明顯;
          ?
          如何解決DNS的問題?
          直接將IP配置在客戶端,可以解決上述兩個問題,很多公司也就是這么做的,俗稱“IP直通車”。
          ?
          “IP直通車”有什么新問題?
          將IP寫死在客戶端,在客戶端實施負(fù)載均衡,擴(kuò)展性很差
          (1)如果原有IP發(fā)生變化,客戶端得不到實時通知;
          (2)如果新增IP,即tcp-sever擴(kuò)容,客戶端也得不到實時通知;
          (3)如果負(fù)載均衡策略變化,需要升級客戶端;
          ?
          方案三:服務(wù)端實施負(fù)載均衡
          只有將復(fù)雜的策略下沉到服務(wù)端,才能根本上解決擴(kuò)展性的問題。
          增加一個http接口,將客戶端的“IP配置”與“均衡策略”放到服務(wù)端是一個不錯的方案:
          (1)client每次訪問tcp-server前,先調(diào)用一個新增的get-tcp-ip接口,對于client而言,這個http接口只返回一個tcp-server的IP;
          (2)這個http接口,實現(xiàn)的是原client的IP均衡策略;
          (3)拿到tcp-server的IP后,和原來一樣向tcp-server發(fā)起TCP長連接;
          ?
          這樣的話,擴(kuò)展性問題就解決了:
          (1)如果原有IP發(fā)生變化,只需要修改get-tcp-ip接口的配置;
          (2)如果新增IP,也是修改get-tcp-ip接口的配置;
          (3)如果負(fù)載均衡策略變化,不需要升級客戶端;
          ?
          然而,新的問題又產(chǎn)生了,如果所有IP放在客戶端,當(dāng)有一個IP掛掉的時候,client可以再換一個IP連接,保證可用性,而get-tcp-ip接口只是維護(hù)靜態(tài)的tcp-server集群IP,對于這些IP對應(yīng)的tcp-server是否可用,是完全不知情的,怎么辦呢?
          ?
          方案四:tcp-server狀態(tài)上報
          get-tcp-ip接口怎么知道tcp-server集群中各臺服務(wù)器是否可用呢,tcp-server主動上報是一個潛在方案,如果某一個tcp-server掛了,則會終止上報,對于停止上報狀態(tài)的tcp-server,get-tcp-ip接口,將不返回給client相應(yīng)的tcp-server的外網(wǎng)IP。
          ?
          該設(shè)計的存在的問題?
          誠然,狀態(tài)上報解決了tcp-server高可用的問題,但這個設(shè)計犯了一個“反向依賴”的耦合小錯誤:使得tcp-server要依賴于一個與本身業(yè)務(wù)無關(guān)的web-server。
          ?
          方案五:tcp-server狀態(tài)拉取
          更優(yōu)的方案是:web-server通過“拉”的方式獲取各個tcp-server的狀態(tài),而不是tcp-server通過“推”的方式上報自己的狀態(tài)。
          ?
          這樣的話,每個tcp-server都獨(dú)立與解耦,只需專注于資深的tcp業(yè)務(wù)功能即可。

          高可用、負(fù)載均衡、擴(kuò)展性等任務(wù)由get-tcp-ip的web-server專注來執(zhí)行
          ?
          多說一句,將負(fù)載均衡實現(xiàn)在服務(wù)端,還有一個好處,可以實現(xiàn)異構(gòu)tcp-server的負(fù)載均衡,以及過載保護(hù)
          (1)靜態(tài)實施:web-server下的多個tcp-server的IP可以配置負(fù)載權(quán)重,根據(jù)tcp-server的機(jī)器配置分配負(fù)載(nginx也有類似的功能);
          (2)動態(tài)實施:web-server可以根據(jù)“拉”回來的tcp-server的狀態(tài),動態(tài)分配負(fù)載,并在tcp-server性能急劇下降時實施過載保護(hù);
          ?
          總結(jié)
          web-server如何實施負(fù)載均衡?
          利用nginx反向代理來輪詢、隨機(jī)、ip-hash。
          ?
          tcp-server怎么快速保證請求一致性?
          單機(jī)。
          ?
          如何保證高可用?
          客戶配置多個tcp-server的域名。
          ?
          如何防止DNS劫持,以及加速?
          IP直通車,客戶端配置多個tcp-server的IP。
          ?
          如何保證擴(kuò)展性?
          服務(wù)端提供get-tcp-ip接口,向client屏屏蔽負(fù)載均衡策略,并實施便捷擴(kuò)容。
          ?
          如何保證高可用?
          tcp-server“推”狀態(tài)給get-tcp-ip接口,
          or
          get-tcp-ip接口“拉”tcp-server狀態(tài)。

          細(xì)節(jié)重要,思路比細(xì)節(jié)更重要。
          系統(tǒng)性了解架構(gòu),希望大家有收獲,謝轉(zhuǎn)。
          瀏覽 99
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  777奇米狠狠色 | 精品无码人妻一区二区免费蜜桃 | 国内精品毛片 | 天天插天天狠天天透 | 一级婬片A片AAAA毛片A级 |