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を使用してテストした結果、デプロイしたサービスは単一のインスタンスで 2,000 の同時接続をサポートできることがわかりました。スケーリングに十分な時間を与えるために、制限を 1,200 に変更しました。この値を下回る場合、fly.io は 1 つのマシンのみを起動します。この値を超える場合は、接続数に基づいて複数のマシンが起動します。

hard_limitはハード制限であり、単一のインスタンスがこの値を超えると 503 が返されます。

压测#

默认状态#

image

连接数巨增状态 (wrk 5000 线程)#

image

通常、1 つのマシンのみが起動され、1 分ごとに請求が行われます。1 つのマシンは 1 か月で 3.8 ドルかかります。接続数が減少すると、自動的に 1 つのマシンにスケールダウンされ、停止状態のインスタンスには料金が発生しません。

关于一些坑#

fly.io の負荷分散は、最も近いソースに戻ります。ニューヨークに 1 つのインスタンスがあり、ロサンゼルスに 1 つのインスタンスがある場合、デフォルトではロサンゼルスを開いておきたいと思います。ニューヨークがバックアップの場合、ロサンゼルスのサーバーが fly.io に逆プロキシを行う必要があります。直接アクセスすると、fly.io は最も近いインスタンスを起動します。たとえば、ニューヨークのユーザーがアクセスすると、ニューヨークのインスタンスが起動されます。接続数が 1 であってもです。そのため、私は fly.io のロサンゼルス地域に 3 つの nginx リバースプロキシインスタンスをデプロイしました。3 つの 1h256m のインスタンスを使用して負荷分散を行い、最適化後、単一のインスタンスで 1 万以上の同時接続を実現できます。

更新: 同じ地域の自動スケーリングの問題が修正されたようです。以前は同じ地域の場合、すべてのマシンがデフォルトで負荷分散され、弾力性は異なる地域にのみ適用されました。この問題は解消され、現在は同じ地域でも有効です。

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 つのインスタンスは無料です。バックエンドのインスタンスは基本的に 1 つしか開始されず、1 か月につき 3.8 ドルかかります。開始されていないインスタンスには料金が発生しません。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。