
我有一個區域實例組有 2 個實例在連接埠 8000 上提供服務,未啟用自動縮放。
此實例組是一個實例組的後端全域外部應用程式負載平衡器。
實例上的 Web 伺服器正在執行 Flask,每個請求將需要 1 秒鐘來處理:
@app.route("/", methods=["GET"])
def main() -> Response:
sleep(1)
response = jsonify(
success=True,
hostname=gethostname(),
)
response.status_code = 200
response.headers["Access-Control-Allow-Origin"] = "*"
return response
我可以透過存取全域負載平衡器公用 IP 來確認該行為,即需要 1 秒鐘才能獲得回應。
如果我同時執行 2 個請求,因為有 2 個實例,我希望每個請求都會傳送到不同的實例,而不是它們總是發送到同一個實例並在該實例上排隊,因此:
- 一個請求需要 1 秒
- 另一個請求將需要 2 秒
我嘗試將 、 和 改為Locality load balancing policy
,Round-Robin
和Least-Request
,Random
但我總是得到相同的行為。
我是否正確理解這Locality load balancing policy
只是選擇哪個後端?如果是,如何在後端(即實例組)內設定負載平衡策略?
謝謝
配置
實例組
- 區域性
- 目標分佈形狀:均勻
- [x] 允許實例重新分配
- 自動縮放開啟:最小 2,最大 2
- 自動縮放訊號:HTTP 負載平衡 100%
- 初始化時間:60s
- 健康檢查:
- 路徑:/健康
- 協定:HTTP
- 端口:8000
- 間隔:30秒
- 超時:30 秒
- 健康閾值:1
- 不健康閾值:10
負載平衡器
- 前端:
- 協定:HTTP
- IP位址:xxx
- 網路等級:進階
- HTTP 保活超時:610 秒
- 路由規則:全部不符
- 後端服務:
- 端點協定:HTTP
- 命名連接埠:web
- 超時:300秒
- 雲端 CDN:已停用
- 記錄:啟用(取樣率:1)
- 會話關聯性:無
- 連線耗盡逾時:300 秒
- 交通政策:
- Locality負載平衡策略:Round robin
- 異常值偵測:停用
- 後端安全策略:無
- 邊緣安全策略:無
- 身份感知代理:已停用
- 平衡方式:最大。 RPS:1(每個實例)
- 容量:100%
測試
siege \
--concurrent 1 \
--time 60s \
"http://x.x.x.x"
有 2 個節點:
concurrent=1
:平均 1.02 秒concurrent=2
:平均 1.66 秒concurrent=4
:平均 3.35 秒concurrent=8
:平均 5.54 秒
有 4 個節點:
concurrent=1
:平均 1.02 秒concurrent=2
:平均 1.18 秒concurrent=4
:平均 2.70 秒concurrent=8
:平均 3.83 秒concurrent=16
:平均 7.26 秒
有 8 個節點:
concurrent=2
:平均 1.20 秒concurrent=4
:平均 1.85 秒concurrent=16
:平均 4.40 秒concurrent=64
:平均 14.06 秒concurrent=128
:平均 19.04 秒
預期行為
我會假設結果如下:
- 2個節點:
concurrent=1
: 1秒concurrent=2
: 1秒concurrent=4
:~2 秒concurrent=8
:~4 秒
- 4個節點:
concurrent=1
: 1秒concurrent=2
: 1秒concurrent=4
: 1秒concurrent=8
:~2 秒concurrent=16
:~4 秒
更新1
如果我切換到 aClassic proxy network load balancer
並發送 100 個請求:
- 56 轉到vm0
- 44 轉到vm1
對於 HTTP LB:
- 99 轉到vm0
- 1 進入vm1
答案1
基於全球外部應用程式負載平衡器GFE(Google 前端)估計哪些後端實例有能力接收請求。您可以掃描分享的鏈接,以了解更多流量分佈。
如果您認為循環法不適合您,我建議使用平衡模式其中概念或配置是均勻分配流量。
我也發現了這個關聯stackoverflow 中的一個問題可能會對使用平衡模式有所幫助。