前言#
fly.io 是一個現代的應用程式交付平台,提供了負載平衡和自動彈性伸縮功能,保證應用程式的可靠性和性能。
根據 fly.io 負載平衡 的文件,可以知道 fly.io 支持通過請求數或者 TCP 連接數來進行自動擴容,因為前段時間我朋友的 API 被攻擊了,然後伺服器直接死亡,又因為他的 API 都是在非瀏覽器下使用,比如一些應用程式,腳本什麼的不好做防禦策略,所以我推薦他遷移到 fly.io 上
配置#
首先把程式打包成 Docker,然後部署到 fly.io 上,我使用的是 2H512M 的配置,並且創建了 11 台的實例。
然後通過 fly.toml
進行配置每一台實例的最高連接數,使用 [services.concurrency]
,參考配置:
# fly.toml app configuration file generated for cheat-show-backend on 2023-09-15T18:53:53-05:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = "XXXXXXXXXXXX"
primary_region = "lax"
swap_size_mb = 1024
[http_service]
internal_port = 8080
force_https = false
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[services.concurrency]
type = "connections"
hard_limit = 10000
soft_limit = 1200
[build]
dockerfile = "Dockerfile"
soft_limit
是軟限制,fly.io 會判斷這個連接數從而限制每台實例,如果單台超出這個連接數則會啟動其他實例,從而實現自動擴容。使用 wrk
測試後可以得出,我們部署的服務單台可以支撐 2k 的並發,為了給他足夠的時間擴容,我把它的限制改成 1200,如果低於這個值,fly.io 只會啟動一台機器,如果超過這個值,則根據連接數啟動多台。
hard_limit
是硬限制,單台實例超過這個數值會返回 503。
壓測#
默認狀態#
連接數巨增狀態 (wrk 5000 線程)#
正常情況下只會開啟一台,按分鐘計費,一台跑一個月 3.8 刀,如果在連接數下降後會自動縮放至一台,停止狀態的實例不會收費。
關於一些坑#
fly.io 的負載平衡是就近回源。如果我有一台實例在紐約,有一台在洛杉磯,我默認想洛杉磯開著,紐約當後備的話需要一台洛杉磯的伺服器進行反向代理 fly.io,如果直接訪問的話會導致 fly.io 就近啟動實例,比如紐約用戶訪問它會啟動紐約的實例,即使連接數只有 1 也會啟動。所以我還在 fly.io 的洛杉磯地區部署了 3 台 nginx 反向代理實例,使用 3 台 1h256m 的實例做負載平衡,經過優化後單台並發可以達到 1w+。
更新:好像修復了同地區自動彈性的問題,之前同地區的情況下會開啟所有機器默認負載平衡,彈性只對跨地區起作用,這個坑已經沒了,目前對同地區也生效。
。
優化後的 Dockerfile
FROM nginx
RUN sed -i 's/worker_processes auto;/worker_processes 8;/' /etc/nginx/nginx.conf
RUN sed -i 's/worker_connections [0-9]*;/worker_connections 9999999;/' /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/conf.d/nginx.conf
nginx.conf
server {
listen 8080 default_server;
listen [::]:8080 default_server;
server_name api.test.com;
keepalive_timeout 75s;
keepalive_requests 100;
location / {
proxy_pass http://ip:80;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
}
}
即可實現低成本的服務自動彈性擴容
成本問題#
用於部署 nginx 的 3 台實例免費,後端實例基本上只有一台在開啟,每個月 3.8 刀,不開啟的不會收費。