【我的架構之路】什麼是代理服務器以及什麼是負載均衡?

正向代理與反向代理

普通概念來說:

  1. 正向代理是向外的,我通過一個終端訪問外面的服務
  2. 反向代理是向內的,當外面的人像通過一個終端訪問我的服務

這樣看來是不是很好理解,下面拿生活舉例來說明代理過程。


代入生活:

前提: 我的母親非常嚴格,給我買了臺電腦但只允許我使用QQ,除了QQ以外的所有網站均被牆(無法訪問)。

正向代理: 有一天我需要查看期中測評成績,但是我無法訪問學校的網站,於是我通過QQ向老師詢問我的成績,讓他替我查詢,老師是可以訪問到學校網站的所以他幫我查到了成績並告訴了我。
正向代理圖解
反向代理: 有一天我的同學也想知道我的成績,但突然發現沒有加我QQ好友,於是他去問咱們班主任,我們班主任又替他查了一次我的成績並告訴了他。
反向代理圖解
總結: 正反向代理的過程是正好相反的。

性能優化: 在剛剛同學詢問班主任的過程中,如果我的老師已經知道了我的成績就可以直接告訴那位同學,而沒有必要再去發起請求去查詢一次成績,所以代理服務器可以設置緩存提高性能。

反向代理有一個服務器通常有一個外網IP也有一個內網IP,此時外界訪問的是公網,我們內部通信使用私網,由於在一個內網不需要發送HTTPS請求,直接發送HTTP請求就行,代理服務器還可以設置緩存,如果代理服務器有我的數據直接應答轉告新來的請求,從而節省資源請求。


負載均衡

談到了“反向代理”必然也離不開“負載均衡”,那負載均衡是如何進行數據分發的呢?

實際上負載均衡就是反向代理服務器,但是它反向代理的目標節點有多個。

案例2: 銀行的資金管理系統是非常複雜且需要高安全性的,讓外部訪問代理服務器,內部目標服務器做數據存儲是不是很安全?

此時我們將目標服務器一模一樣的部署了兩份。

現在當一位用戶訪問資金管理系統時,代理服務器一會兒將他分配給了A服務器處理,一會兒讓B服務器處理,這時AB兩服務器的壓力都減少了許多。
負載均衡圖解

負載均衡的實質就是反向代理服務器,並且應用了一個負載均衡算法

  1. 輪轉法:
    讓多臺服務器形成一個大圓圈,一會兒讓A處理,一會兒讓B處理,一會兒讓C處理。
    但是真實場景不允許我們這樣做,我們需要保證在一個用戶接入進來的時候只有一個服務器爲他服務。
    輪轉法

  2. Hash法
    概念:hash法是一個散列算法,例如我們要去食堂打飯如何保證每位同學不擁擠呢,可以採用學號除以10取餘數,f(x) = 學號%10 ,所得到的個位數就是對應窗口號。

    這樣hash操作可以保證每個請求來的客戶端最終只能拿到一臺服務器作爲他的目標服務器。

在實際中我們常常採用原地址hash,因爲發來的HTTP請求基於TCP/IP協議,而TCP/IP協議中又很容易取到IP地址,直接將IP地址一hash就可以得到目標服務器的編號。


疑點解答

單點故障: 無論有多少臺目標服務器,但負載均衡可能被宕機,這是橫向擴展中的“單點故障”,所以一定要啓用主從備用計劃,主服務器宕機了立刻讓從服務器接上工作,並且緊急排查故障。

健康監視算法: 如果我們購買了1000臺服務器作爲目標服務器,但其中某些存在隱患,隨着業務的擴大,隱患服務器突然內存燒了,這個時候就不應該把外接請求交給這臺壞掉的服務器。
這個時候採用健康監視算法,負載均衡設備每隔10s對一臺服務器運行集成測試或者直接ping一下,如果能夠ping通那麼這個服務器就是“健康”的。

什麼採用橫向擴展?
無狀態服務可以被橫向擴展,無狀態服務的特點是任何一個時間點宕機,再開啓它依然能夠承載原服務。另一個概念爲一個服務不存儲數據就是無狀態服務。
而有狀態服務採取縱向擴展,直接擴展硬件配置。但是縱向擴展回報率和投入率不是線性關係,投入的越高、回報越低。

有時候會發現我買了一臺電腦,2G的運存可能喫不消現在主流玩法,但是我提升到8G了就可以直觀感受到8G帶來的速度提升,可如果我擴展到了16G或者是128G,這個時候並不能感受到大運存帶來的直觀速度體驗。

負載均衡和靜態端口映射有什麼不同嗎?
反向代理工作在應用層。端口映射工作在傳輸層。

如果1000臺服務器處理請求,也要從數據庫中讀取,數據庫是不是得性能非常好的數據庫?
數據庫一般是沒法橫向擴展的,所以只能靠主從,緩存,讀寫分離這些層面去提升可擴展性,或者使用縱向擴展法提升內存處理器。當然,現在社區中逐漸流行起來分佈式數據庫了,這樣就能解決橫向擴展了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章