# <center>LoadBalancer</center>
>[name=王鵬維]
>[time=TUE, NOV 16, 2020 14:09 PM]
---
## Agenda
* 起源
* 擴展方式
* 實現原理
* 可能的問題
* 分配演算法
* GCP(LB)實作
---
## 起源
---

傳統網頁服務模式,通常會碰上流量問題,下面舉飲料店的例子做解釋。
---

左邊為客人右邊為店員,假設這個店員最多能一次做8杯。
---

---

---

同時有10000個客人點飲料時...
---

店員就會變成熊大,客人就是兔子,熊大即使被兔子催促也無能為力,早就超出它的能力了..QQ喔~
---

若不想讓店員輕易崩潰,除非把他變成鋼鐵人。
---

傳統模式的網路服務,一旦伺服器當機,整個服務就會異常,容錯率極低。
---
## 有哪些擴展方式?
* 縱向擴展
* 橫向擴展
---
## 縱向擴展

---

---
## 橫向擴展

---
## 實現的原理為何?
---

加上負載平衡器,統一由負載平衡器接收客端請求,再依據演算法分配流量。
---
* 四層負載(L4)
* 七層負載(L7)
---
## 四層負載
* LVS/NAT (網域地址修改)
* LVS/DR (直接路由模式)
---
### LVS/NAT (網域地址修改)
負載平衡器在接收到封包後,會分別更改封包內的傳輸層接口埠號及網路層的IP地址。
---

---

---

伺服器回覆client的請求時,響應封包會先到負載平衡器,再由它去回傳給client端。
---

<center>客端 -> 負載(LB) -> 伺服器 -> 負載(LB) -> 客端<br>
|----------請求-----------|---------響應-----------|
</center>
---
### LVS/DR (直接路由模式)
負載平衡器在接收到封包後,直接更改封包內資料連結層的MAC位置,透過MAC位置傳送封包。
---

---

---

<center>客端 -> 負載(LB) -> 伺服器 -> 客端<br>
|-------請求-------|-------響應-------|
</center>
---
## 七層負載
---

先過濾含有惡意元素的封包,並分析客端的請求,依據分析結果再將封包轉送至伺服器處理。
---
## 四層負載與七層負載差異性 :
* 四層負載 :
不需與客戶端連接(握手),效率上會較七層負載高。
* 七層負載 :
會先與客戶端連接(握手),並分析客戶端的請求後,最後才會將請求派給各伺服器處理。這個方式能過濾惡意的封包,但也間接影響負載平衡器的效率。
---
## 可能會碰到的問題?
---

當負載均衡器故障,整個負載均衡系統就無法正常運作。
---

使用一對或數個負載平衡器
---
## 分配的演算法有哪些?
* 輪轉法
* 加權法
* 最小連接法
* 隨機法
* 一致性哈希法
---
## 輪轉法

每台伺服器會輪流接收封包。
---
## 加權法

依伺服器性能賦予不同權重,依照權重派發封包。
---
## 最小連接法

優先派發當前最小連接數的伺服器。
---
## 隨機法
沒有硬性規定,封包會隨機分派。
---
## 一致性哈希法
---

依據客端ip求出客端的雜湊值。
---

再依據伺服器ip求出伺服器的雜湊值。
---

一致性哈希的方式可以大幅提高會話(session)的一致性,當然目前比較常見的方式是直接使用session共享的機制來完成會話一致性的功能。
---
# 實作GCP的LB
---
建立vm。

---
建立映像檔,並以剛剛建的vm為來源磁碟。

---
建立vm範本,以剛剛建的映像檔為開機磁碟。

---
建立群組,設定2個vm,並以剛才建立的範本建立vm。

---
建立lb防火牆的規則。

---
建立lb,並以剛才建立的群組為後端服務。

---
<center>End</center>
{"metaMigratedAt":"2023-06-15T16:16:06.177Z","metaMigratedFrom":"YAML","title":"LoadBalancer","breaks":true,"contributors":"[{\"id\":\"ff0dfb84-4555-42a5-a11c-2d1b32c63013\",\"add\":3089,\"del\":0}]"}