ブログ

Mythexのサーバーを、ARMに移した理由

9月19日、Mythexの本番バックエンドを、x86サーバーから、より小さなARMベースのAWS Gravitonサーバーへ移しました。データベースも、プラットフォームのデータベースをGravitonのインスタンスへ移しました。きっかけは単純でした。各ユーザーのアプリを実行・ビルドする重い処理を、分離されたプロジェクトごとのサンドボックスに移した後、メインのサーバーのメモリ使用量はピーク時でおよそ3分の1でした。より小さいARMマシンのほうが実際の負荷に合い、月額のサーバー費用を約30%下げられました。

今、サーバーは実際に何をしているのか

以前は、バックエンドのサーバーが多くの作業を直接行っていました。9月半ばごろ、高コストな部分、つまり各プロジェクトのコードの実行、パッケージのインストール、アプリのビルドを、プライベートなクラウドサンドボックス、プロジェクトごとに1つに移し終えました。これにより、各プロジェクトは独立した環境とライブプレビューを持てるようになりました。

自分たちのサーバーに残ったのは、調整の役割です。APIやサンドボックスと公開を管理するオーケストレーター、認証、課金、ゲートウェイです。この作業は安定していて軽いものです。移行後、サーバーのピークは約1.3 GBのメモリで、その3倍ほどの容量のマシンで動いていました。

なぜARMなのか

AWSのGravitonプロセッサは、AWSが設計したARMチップです。同じ費用で、一般に同等のx86インスタンスより多くの処理能力が得られるか、同じ処理能力をより安く得られます。Node.jsのサービス、Docker、Postgresといった私たちのワークロードには、x86に縛られる理由がありません。

移したものは次のとおりです。

  • アプリサーバー2台:中規模のx86インスタンスから、それぞれ2 GBのメモリを持つ小さなGravitonインスタンスへ。
  • プラットフォームのデータベース:小さなx86データベースインスタンスから、そのGraviton版へ。

唯一の本当の難点:2つのアーキテクチャ向けのイメージ

ステージング環境は、今も小さなx86サーバーで動いています。本番はARMで動いています。一方のアーキテクチャ向けにビルドされたコンテナイメージは、もう一方では動きません。

そこで、すべてのイメージを、1つのタグの下で両方のアーキテクチャ向けにビルドするようにしました。マルチアーキテクチャのイメージです。Dockerが各マシンで適切なバリアントを自動的に選ぶため、デプロイパイプラインは、どの環境へプッシュしているかを知る必要がありません。代償はCIのビルドが長くなることです。得られるのは、ステージングと本番が、まったく同じタグから、まったく同じコードを実行することです。

移行の前に、ロールバックを計画する

稼働中のサービスのCPUアーキテクチャを変えることは、数分で元に戻せるようにしておきたい種類の変更です。切り替えの前に、次のことを行いました。

  • 以前のサーバーテンプレートのバージョンを、名前付きのロールバック先として残しました。
  • データベースのサイズを変更する直前に、データベースのスナップショットを取りました。
  • 移行とその巻き戻し方法をカバーするランブックを書きました。

ロールバックは必要になりませんでした。それでも、同じやり方を繰り返すでしょう。

注意すべき点

小さなサーバーは、余裕が少なくなります。そこから次の2つが生じます。

  1. 重い処理がこれらのサーバーに戻されると、2 GBでは足りません。 その場合の対処は、x86に戻すことではなく、より大きなGravitonのサイズにすることです。
  2. 小さなマシンにはスワップが必要です。 1週間後、これらのサーバーの1台が、技術的にはメモリ不足にならないまま、メモリの圧迫で凍結しました。スワップファイルがなかった話をご覧ください。

得られた教訓

  • アーキテクチャを変えたら、もう一度測定してください。 重い処理をサンドボックスに移したことで、サーバーに必要なものが変わりましたが、インスタンスのサイズはそれに追いついていませんでした。
  • マルチアーキテクチャのイメージを使えば、ARMは一般的なウェブのスタックにとって低リスクな勝ちになります。
  • 先にロールバックを書いてください。 使わなかったとしても、変更はより落ち着いたものになります。

Mythex · Pricing · AIでなんでも作ろう · ウェブサイト・アプリのテンプレート · Mythexを比較 · AIアプリ開発用語集 · AIアプリ開発の無料ツール · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)