# 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 是用什麼參數判斷來分配主機,這也是比較困難的點。