---
# System prepended metadata

title: AWS ELB vs. HAProxy
tags: [AWS, HAProxy]

---

# AWS ELB vs. HAProxy
###### tags: `HAProxy`、`AWS`
> 嘗試將 HAProxy 設定模擬成 ALB 和 NLB 並做比較。
- - -


## 比較測試
使用 Docker Compose 來製作四種 HAProxy 模擬 AWS ELB，比較設定如下：

| No. | AWS ELB                  | vs. | HAProxy                      |
|:---:| ------------------------ | --- | ---------------------------- |
|  1  | ALB + stick + roundrobin | vs. | HAProxy + stick + roundrobin |
|  2  | ALB + stick + leastconn  | vs. | HAProxy + stick + leastconn  |
|  3  | NLB + Cross-Zone         | vs. | HAProxy + tcp                |
|  4  | NLB + Cross-Zone + stick | vs. | HAProxy + tcp + stick        |


## Test No.1

| load balancer                | 播放 15 分鐘 |
| ---------------------------- |:------------:|
| ALB + stick + roundrobin     |      ×       |
| HAProxy + stick + roundrobin |      √       |

HAProxy 可以選擇參數來做分配的判斷，這邊我用 Source IP 來判斷，所以可以一直維持在同一台主機。
可能 ALB 的 stick 是用 url 去做分配，我們每次的 request 都是不同的切片，所以造成分配的主機會不一樣。

※ 如果只訪問 index.html，會一直維持在同一台主機。
※ HAProxy 用 url 做分配也不會有亂跳的現象，可能 AWS 用了某些判斷方式我們不清楚。


## Test No.2

| load balancer               | 播放 15 分鐘 |
| --------------------------- |:------------:|
| ALB + stick + leastconn     |      ×       |
| HAProxy + stick + leastconn |      √       |

這次測試 ALB 應該也是因為 stick 判斷的參數問題而造成無法正常播放。


## Test No.3

| load balancer    | 播放 15 分鐘 |
| ---------------- |:------------:|
| NLB + Cross-Zone |      △       |
| HAProxy + tcp    |      △       |

這兩個 load balancer 每隔幾分鐘就會 lag 一次。


## Test No.4

| load balancer            | 播放 15 分鐘 |
| ------------------------ |:------------:|
| NLB + Cross-Zone + stick |      √       |
| HAProxy + tcp + stick    |      √       |


## 結論
主要還是差在 AWS ELB 對 stick 的判斷，tcp 時有沒有 stick 都沒有甚麼區別，但是 http 的 stick 就是一個問題，不過我們沒辦法看到 ALB 是用什麼參數判斷來分配主機，這也是比較困難的點。