banner
moeyy

moeyy

一条有远大理想的咸鱼。
github
mastodon
email

使用 fly.io 實現負載均衡和自動彈性伸縮

前言#

image

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。

壓測#

默認狀態#

image

連接數巨增狀態 (wrk 5000 線程)#

image

正常情況下只會開啟一台,按分鐘計費,一台跑一個月 3.8 刀,如果在連接數下降後會自動縮放至一台,停止狀態的實例不會收費。

關於一些坑#

fly.io 的負載平衡是就近回源。如果我有一台實例在紐約,有一台在洛杉磯,我默認想洛杉磯開著,紐約當後備的話需要一台洛杉磯的伺服器進行反向代理 fly.io,如果直接訪問的話會導致 fly.io 就近啟動實例,比如紐約用戶訪問它會啟動紐約的實例,即使連接數只有 1 也會啟動。所以我還在 fly.io 的洛杉磯地區部署了 3 台 nginx 反向代理實例,使用 3 台 1h256m 的實例做負載平衡,經過優化後單台並發可以達到 1w+。

更新:好像修復了同地區自動彈性的問題,之前同地區的情況下會開啟所有機器默認負載平衡,彈性只對跨地區起作用,這個坑已經沒了,目前對同地區也生效。

image

優化後的 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 刀,不開啟的不會收費。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。