---
# System prepended metadata

title: LoadBalancer
tags: [GCP]

---

---
title: LoadBalancer
tags: GCP
---

# <center>LoadBalancer</center>
>[name=王鵬維]
>[time=TUE, NOV 16, 2020 14:09 PM]

---

## Agenda
* 起源
* 擴展方式
* 實現原理
* 可能的問題
* 分配演算法
* GCP(LB)實作

---

## 起源 

---

![](https://i.imgur.com/ICGQfLl.png)
傳統網頁服務模式，通常會碰上流量問題，下面舉飲料店的例子做解釋。

---

![](https://i.imgur.com/yZUHWXF.png)
左邊為客人右邊為店員，假設這個店員最多能一次做8杯。

---

![](https://i.imgur.com/rpZtR5F.png)

---

![](https://i.imgur.com/TEpPUGB.png)

---

![](https://i.imgur.com/MI4oSCj.png)
同時有10000個客人點飲料時...

---

![](https://i.imgur.com/cdgejw9.png)
店員就會變成熊大，客人就是兔子，熊大即使被兔子催促也無能為力，早就超出它的能力了..QQ喔~

---

![](https://i.imgur.com/8RD2dpb.png)
若不想讓店員輕易崩潰，除非把他變成鋼鐵人。

---

![](https://i.imgur.com/gI4L493.png)
傳統模式的網路服務，一旦伺服器當機，整個服務就會異常，容錯率極低。

---

## 有哪些擴展方式?
* 縱向擴展
* 橫向擴展

---

## 縱向擴展

![](https://i.imgur.com/VenR5v6.png)

---

![](https://i.imgur.com/f7Q1uGC.png)

---

## 橫向擴展

![](https://i.imgur.com/PHOWaTX.png)

---

## 實現的原理為何?

---

![](https://i.imgur.com/i8UYVw2.png)
加上負載平衡器，統一由負載平衡器接收客端請求，再依據演算法分配流量。

---

* 四層負載(L4)
* 七層負載(L7)

---

## 四層負載
* LVS/NAT (網域地址修改)
* LVS/DR  (直接路由模式)

---

### LVS/NAT (網域地址修改)
負載平衡器在接收到封包後，會分別更改封包內的傳輸層接口埠號及網路層的IP地址。

---

![](https://i.imgur.com/JjLQnwj.png)

---

![](https://i.imgur.com/7j8uPYH.png)


---

![](https://i.imgur.com/U2d90Qv.png)
伺服器回覆client的請求時，響應封包會先到負載平衡器，再由它去回傳給client端。

---

![](https://i.imgur.com/fhRDNLL.png)

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

---

### LVS/DR (直接路由模式)
負載平衡器在接收到封包後，直接更改封包內資料連結層的MAC位置，透過MAC位置傳送封包。

---

![](https://i.imgur.com/Iz8EgJw.png)

---

![](https://i.imgur.com/O8SeEwq.png)

---

![](https://i.imgur.com/GeMfTS7.png)

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


---

## 七層負載

---

![](https://i.imgur.com/t1Y9gqC.png)
先過濾含有惡意元素的封包，並分析客端的請求，依據分析結果再將封包轉送至伺服器處理。

---

## 四層負載與七層負載差異性 :
* 四層負載 : 
不需與客戶端連接(握手)，效率上會較七層負載高。
* 七層負載 : 
會先與客戶端連接(握手)，並分析客戶端的請求後，最後才會將請求派給各伺服器處理。這個方式能過濾惡意的封包，但也間接影響負載平衡器的效率。

---

## 可能會碰到的問題?

---

![](https://i.imgur.com/EFMrAwl.png)
當負載均衡器故障，整個負載均衡系統就無法正常運作。

---

![](https://i.imgur.com/4r5HiHV.png)
使用一對或數個負載平衡器

---

## 分配的演算法有哪些?
* 輪轉法
* 加權法
* 最小連接法
* 隨機法
* 一致性哈希法

---

## 輪轉法

![](https://i.imgur.com/51RS3e5.png)
每台伺服器會輪流接收封包。

---

## 加權法

![](https://i.imgur.com/GR3Ug57.png)
依伺服器性能賦予不同權重，依照權重派發封包。

---

## 最小連接法

![](https://i.imgur.com/YfUZgRG.png)
優先派發當前最小連接數的伺服器。

---

## 隨機法
沒有硬性規定，封包會隨機分派。

---

## 一致性哈希法

---

![](https://i.imgur.com/RStDTWU.png)
依據客端ip求出客端的雜湊值。

---

![](https://i.imgur.com/m63zGPK.png)
再依據伺服器ip求出伺服器的雜湊值。

---

![](https://i.imgur.com/1nGsHAZ.png)
一致性哈希的方式可以大幅提高會話(session)的一致性，當然目前比較常見的方式是直接使用session共享的機制來完成會話一致性的功能。

---

# 實作GCP的LB

---

建立vm。
![](https://i.imgur.com/JbqVtQ4.png)

---

建立映像檔，並以剛剛建的vm為來源磁碟。
![](https://i.imgur.com/9CAKHXI.png)

---

建立vm範本，以剛剛建的映像檔為開機磁碟。
![](https://i.imgur.com/U4bHUb4.png)

---

建立群組，設定2個vm，並以剛才建立的範本建立vm。
![](https://i.imgur.com/GwnZp18.png)

---

建立lb防火牆的規則。
![](https://i.imgur.com/rQYGsPS.png)

---

建立lb，並以剛才建立的群組為後端服務。
![](https://i.imgur.com/znrJEz4.png)

---

<center>End</center>