BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Netlifyのインフラストラクチャチームがどのようにしてデプロイ速度を上げながら可観測性を向上させたか

Netlifyのインフラストラクチャチームがどのようにしてデプロイ速度を上げながら可観測性を向上させたか

原文(投稿日:2020/05/16)へのリンク

Netlifyのインフラストラクチャチームは、どのようにして顧客のデプロイ速度を最大2倍に向上させたかの話を共有した。これは、デプロイアルゴリズムを最適化し、プロセス中のシステムの可観測性を向上させることによるものである。

Netlifyは、Webアプリケーションと静的Webサイトのホスティングサービスとバックエンドサービスを提供する。Netlifyは、ユーザが提供したコンテンツから静的ファイルを生成し、複数のクラウドベンダーを跨ってコンテンツ配信ネットワークを介してそれらを提供する。50000以上のファイルの大規模なデプロイでパフォーマンスの問題が発生した。その理由はMongoDBに格納されている内部データ構造での再帰的なクエリである。インフラストラクチャチームはこれを最適化し、この実施の一環として、システムの可観測性も向上させた。

内部的には、ユーザコンテンツのデプロイについてのNetlifyのコアは、Merkleツリーを中心に構築されているMerkleツリーは、各リーフノードがデータのハッシュでラベル付けされるデータ構造である。そして、すべての非リーフノードがその子ノードのラベルのハッシュでラベル付けされる。ファイルコンテンツのハッシュは、Netlifyのバックエンドのコンテンツの変更を検出するためにツリーのファイル名として使用される。デプロイは、変更と既存のコンテンツに基づいて「それらのハッシュを計算し、新しいツリーを生成する」。MongoDBに内部的に保存されているツリーは、デプロイが顧客によって開始したときに最初に作成されていた。その後、顧客のファイルがアップロードされると、デプロイの進行状況を追跡するためにツリーがスキャンされて更新された。これによりパフォーマンスの問題が発生した。MongoDBでのロックの競合が原因であり、特に大規模なデプロイメントの場合に発生する。

パフォーマンスを向上させるための最初のステップは、プロセスの可視性を向上させるための機器を導入することであった。これにより、ファイルのアップロードごとに操作が繰り返されていることがわかった。チームは、デプロイの進行状況の追跡をコアツリーから分離することを決定した。また、ツリー全体を事前に作成するのをやめ、代わりに情報を個別に保存して、最後に最終的なツリーを作成する。

InfoQは、より詳細に理解するために、NetlifyのシニアソフトウェアエンジニアであるIngrid Epure氏に連絡を取った。

チームは、いくつかの初期の問題を抱えつつも、新機能を本番環境にデプロイした。彼らは、信頼性と可視性を確保するために、テストとテレメトリの広範なリストを持つことにフォーカスした。ただし、最初に直面した問題のために、いくつかのチェックポイントを追加し、十分な自信が持てるようになるまでチェックポイントを繰り返した。Epure氏によると、これらのチェックポイントには、テレメトリ(メトリック収集)を使用して問題を正確に特定することや、ガードレールを追加してビルドを最終的に安定した状態にすることが含まれる。


画像提供: https://www.netlify.com/blog/2020/05/05/what-netlifys-infrastructure-team-learned-as-it-increased-deploy-speed-by-up-to-2x/ (許可を得て使用)

Epure氏によると、監視は「システムの動作に関する質問に答えるために、構造化されたイベント、トレース、メトリックの組み合わせ」を中心としている。彼女は詳しく説明している。

大規模な分散システムの現実は、失敗するすべてのケースを予測することはできないため、エンジニアが遭遇する質問の大部分は未だ知らない未知のものに向かう傾向があります。これらのタイプのシナリオでは、メトリック駆動型の従来の監視以上のものが必要です。これは、どのようにシステムに障害が起こるかを予測することに大きく依存し、事前定義された障害をチェックします。私たちは、アラーム、履歴トレンド、および事前に定めた一連の質問に対してシンプルな回答を得るためにメトリックを使用します。たとえば、サービスXが1秒間に受信したリクエスト数などです。また、イベントとトレースを使用して、情報をいくつかの関心のあるポイントに分類し、振る舞いについての結論を導き出します。

Netlifyは、イベントの集約、分散トレース、監視、アラートに2つのサードパーティサービスを使用する。システムへの一般的な可観測性に加えて、監視はデプロイの展開においても重要な役割を果たす。Epure氏はより詳細に説明している。

問題が発生した場合、原因を理解し、タイムリーに軽減できることが重要です。顧客のビルドが多次元分散システムの場合、私たちは、顧客のビルドを実行するサービス全体でイベントを集約できることに大きく依存することになります。顧客ビルドを実行するサービス(Netlifyサーバー、Buildbot、およびAPI)は、データがストーリーを伝え、質問に答えることができるようにします。

彼女は、以前と比較して、より強力なテレメトリとそれを使用した経験によって改善されたと付け加えている。

Netlifyの継続的デプロイシステムはKubernetesで実行され、顧客向けの各カスタムビルドも実行される。各カスタムビルドは独自のポッドで実行され、ビルドの完了後に終了する。

 

この記事に星をつける

おすすめ度
スタイル

BT