Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Backlog Git Hosting Architecture with AWS 2023

vvatanabe
October 07, 2023

Backlog Git Hosting Architecture with AWS 2023

プロジェクト管理ツール「Backlog」は、増加するユーザーの要求に応えるため、高可用性やスケーラビリティ、コスト効率の向上を目指してきました。本セッションでは、
「Backlog」のGitホスティング機能において、AWSの多岐にわたるサービスをどのように取り入れ、アーキテクチャと運用プロセスを改善してきたのか、実際の経験を基に、その学びを共有します。

https://jft2023.jaws-ug.jp/
https://backlog.com/ja/

vvatanabe

October 07, 2023
Tweet

More Decks by vvatanabe

Other Decks in Technology

Transcript

  1. 渡邉 祐一 Yuichi Watanabe ・ ・ ・ ・ 福岡在住、2児の父で大学生 BacklogのGitホスティング周りの開発・運用を担当

    趣味は小さなツールやライブラリのOSS開発 ・nulab/zxcvbn4j ・sashabaranov/go-openai お気に入りのAWSサービスは、SQSとDynamoDB ※写真は中学生にプログラミングを教える様子 Copyright Nulab Inc. All Rights Reserved. 株式会社ヌーラボ
  2. ▪ “進んでるね!”で、チームは進む。 みんなで使う簡単、便利な プロジェクト・タスク管理ツール。 タスク管理や Wiki など情報共有に関する豊富な機能がオ ールインワン 直感的に操作が可能なインターフェース SaaS版

    / インストール版の2つの形態で提供 ▪ ▪ 担当者・期限を明確に チームのタスクを、担当者や期限を明確にして課題 を予定通りに完了させましょう。課題の更新は Backlogやメールで受け取れます。 ガントチャートで可視化 プロジェクト計画をガントチャートで可視化します 。メンバーの進捗を把握することで、作業の遅延に いち早く気づけます。 Wikiでドキュメント管理 Backlog Wikiは個人メモ、会議の議事録、作業マニュ アル、仕様書などチームメンバーに向けた情報を文 書で管理します。リンク共有やPDF出力にも対応し ています。 出先からも楽々!モバイルアプリ 無料で使えるBacklogモバイルアプリ(iOS / Android サポート)を利用すれば、外出先でもプロジェクト の進捗を確認したり、課題の追加やコメントを投稿 できます。
  3. 初期のアーキテクチャと課題 AWS Cloud [EC2] GIT [EBS] Ripository 本体 WEB 本体

    API 初期のアーキテクチャ ・Backlog本体からGitのコア機能を切り出したアプリをEC2(通称Gitサーバー)で 稼働。(ストレージを本体に持たせると本体がスケールできなくなるため) ・本体はGitサーバーにRPCで接続してリポジトリのデータを読み書き。 ・複数のGitサーバーが一定のグループ毎に割り振られる。 ・グループに応じて適切なGitサーバーへ接続される。 ・Gitサーバーは複数のEBSをマウントしてGitリポジトリを保持。 ・Gitリポジトリは一定のグループに分けて特定のEBSに保存。 1サーバー・マルチプロセス Gitサーバーではマルチプロセスで複数のアプリが起動 ・Git HTTPSの認証、Git特有のHTTPプロトコルの解釈、リポジトリのIOを行うアプリ。 ・Git SSHの認証、SSH接続、リポジトリのIOを行うアプリ。 ・Backlog本体からのRPC接続、リポジトリのIOを行うアプリ。 ・書き込み時の重たい処理を非同期で行うアプリ。 WORKE R HTTPS SSH RPC ※ コンポーネント間のLBなどは省略
  4. 可用性を高めるアーキテクチャへの刷新 1. Amazon EFS ・複数のAZで冗長化されており、高い耐 久性を持つ。 ・複数のEC2からマウント可能。 ・リポジトリの状態によってCPU、ディ スクIOが跳ねやすく、EBSの10倍程度パ フォーマンスが損なわれる。

    3. Amazon EBS ・パフォーマンスはEBS一択。 ・複数のEC2からマウント不可。 ・ネットワーク越しに異なるEBSへ複製 する仕組みが必要。 2. Amazon S3 ・s3fs(FUSE)等のファイルシステムとし てマウントさせるツールが必要。 ・読み書きするファイルが増えると線形 に通信コストが増えて、パフォーマンス が損なわれる。 可用性を高めるためのストレージの見直し
  5. 可用性を高めるアーキテクチャへの刷新 1. 同期レプリケーション(強い整合性) ・複数のストレージに同時に書き込む。 ・データの整合性が高い。データロスのリスクが非常に低い。 ・レイテンシーが増加して、書き込みのパフォーマンスが低下 する可能性がある。 ・3PC等の分散アルゴリズムを用いてネットワーク越しのトラン ザクションが必要。 2.

    非同期レプリケーション(結果整合) ・プライマリのストレージに書き込まれると、その情報をキュ ーに追加する。 ・セカンダリに実際に書き込まれる前に、書き込み操作が完了 したことを通知する。 ・データが同期するまでにタイムラグがあるが、レイテンシー の影響を受けにくい。 Something [EC2] GIT [EBS] Ripository [EC2] GIT [EBS] Ripository ① ② ③ ④ Something [EC2] GIT [EBS] Ripository [EC2] GIT [EBS] Ripository ① ② ③ ④ レプリケーション方式の検討 ⑤
  6. 可用性を高めるアーキテクチャへの刷新 AWS Cloud [EC2] GIT [EBS] Ripository 本体 WEB 本体

    API アイコンは新しく追加されたコンポーネント。 ※ コンポーネント間のLBなどは省略 新しいアーキテクチャの概観(Before & After) AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica)
  7. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) 認証認可の部分やGit特有の通信プロトコルの実装など、Gitリポジト リの読み書きの手前の部分(ストレージに依存しない部分)は、 ECS Fargateでコンテナ化してスケールさせやすくした。 ストレージに依存しないフロントエンドはECS Fargateへ WORKE R HTTPS SSH RPC
  8. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) ・図の後段に配備されるGitサーバーのみストレージに依存する。 ・フロントエンドからRPCを受けGitリポジトリへ読み書きを行う。 ・アクティブ・アクティブなプライマリ・レプリカ構成 ・レプリカはプライマリを正とした複製。 ・書き込み系のRPCは全てプライマリで受ける。 ・読み取り系のRPCはプライマリかレプリカのどちらかで受ける。 ストレージに依存するバックエンドはプライマリ・レプリカ構成
  9. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) ECS Fargateで稼働するGit Proxyはフロントからの全てのRPC(gRPC)を 適切なバックエンドへ中継し、書き込み時はレプリケーションログを発行す る。 処理の流れ: レプリケーションの中核となる動的なプロキシ RPCの属性の読み取り 書き込み or 読み取りの判定 プライマリへ中継 S3にレプリケーションログを送 信 SQSにメッセージを送信 プライマリへ中継 レプリケーション中か判定(S3 のログを検索) プライマリ or レプリカ へ中継 書き込み 読み取り 完了 未完了
  10. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) レプリケーションログは、Git ProxyやReplication Workerから参照される 重要なデータ。常に最新のレプリケーションログにアクセスできる必要が ある。 S3を選択した理由: ・SQS自体はIDを指定したメッセージの参照をサポートしていない。 ・ログの実態はSQSの外に保持する必要がある。 ・S3がStrong Consistencyをサポート。 ・S3は常に最新のデータを返すためログの整合性が保たれる。 強い一貫性を持つAmazon S3に保持するレプリケーションログ
  11. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) ・レプリケーションログはリポジトリ単位で発行。 ・ログの種類は書き込み属性に応じて複数のイベントに分類。 ・レプリケーションの実行順序を守る必要がある。(以下、例) 1. リポジトリの作成 2. リポジトリへの書き込み 3. リポジトリのリネーム 4. リポジトリの削除 ・SQSのFIFO + メッセージグループ化機能で順序を保証する。 ・エンキューするメッセージにグループIDを付与すると、同一グループID のメッセージの配信順序が保証される。 Amazon SQSのFIFO・グループ化を用いた配信順序の保証
  12. 可用性を高めるアーキテクチャへの刷新 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) ・Replication WorkerはSQSをポーリングする。 ・Replication WorkerはECS Fargateで冗長化されており、単一のECSタス クで複数のメッセージを同時に処理する。 ・取得したメッセージに含まれるキーを元に、S3上のレプリケーションロ グの実態を取得する。 ・レプリケーションログの内容から、対象のGitリポジトリとレプリケーシ ョンの種別を特定して、レプリカのGitサーバーが提供するリポジトリのレ プリケーション用の適切なRPCを実行する。 ・レプリケーションが成功すると、S3のレプリケーションログとSQSのメ ッセージを削除する。レプリケーションが失敗した場合はSQSの可視性タ イムアウトを更新してリトライする。 ワーカーによるレプリケーションの制御
  13. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  14. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリク エストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  15. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  16. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。 Applay Patch & Reboot
  17. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  18. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  19. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。 Switch Over
  20. 運用作業の効率化 AWS Cloud 本体 WEB 本体 API [ECS] Git PROXY

    [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) プライマリ・レプリカ構成の非同期レプリケーション方式になり、カーネル アップデートに伴う作業がオンラインかつ自動でできるようになった。 EC2のセキュリティパッチ適用に伴う作業のオンライン化と自動化 Jenkinsによるオンラインアップデートの流れ: 1. Git ProxyのECSタスクが持つクラスタ設定からレプリカを抜いてリクエ ストをプライマリのみに中継。 2. Replication WorkerのECSタスクを0にしてレプリケーションを停止。 3. レプリカのEC2にセキュリティパッチを当てて再起動。 4. Replication WorkerのECSタスクを起動してレプリケーションを再開。 5. Git ProxyのECSタスクが持つクラスタ設定にレプリカを追加。 6. プライマリとレプリカのEC2をスイッチする。 7. 再度1.から5.の作業をスイッチしたレプリカに実施する。
  21. パフォーマンスとコストの最適化 コンピューターリソースとコストの最適化 AWS Cloud 本体 WEB 本体 API [ECS] Git

    PROXY [ECS] Git HTTPS [ECS] Replication Worker [ECS] Git SSH [SQS] [S3] [EC2] GIT [EBS] Ripository (Primary) [EC2] GIT [EBS] Ripository (Replica) [ECS] GC Worker EventBridge Scheduler [SQS] ・処理コストの高いGit GCが頻繁に発生してEC2のコンピューター リソースを大幅に消費する問題があった。 ・Git GCの実行をフックしていったんGC対象のリポジトリ情報を SQSに貯めて、アクセスの少ない深夜帯に処理するようにした。 ・この日時バッチにAWS Lamdaを使用するのは、Git GCの実行時間 が長いので断念した。 ・処理時間に対応するために、EventBridge SchedulerでECS Fargateのタスクを日時で定期実行するようにした。 EventBridge SchedulerとECS Fargateを用いたGit GCのバッチ処理
  22. コンピューターリソースとコストの最適化 X86からARM64に移行 リージョン: ap-northeast-1 vCPU単位(1時間) GB単位(1時間) X86 0.05056USD 0.00553USD ARM

    0.04045USD 0.00442USD ※ 2023/10/6時点 -25% Compute Savings Plansの適用 リージョン: ap-northeast-1, CPUアーキテクチャ: ARM vCPU単位(1時間) GB単位(1時間) オンデマンド 0.04045USD 0.00442USD Savings Plans 0.03185USD 0.00348USD ※ 2023/10/6時点 -27% ECS Fargateのコスト最適化