Slide 1

Slide 1 text

Sentry GKEに リプレイス 1年間の 知見見せます 2021/05/12 エンジニア勉強会@PIXIV DEV MEETUP pixiv Inc. sue445 2021.5.12

Slide 2

Slide 2 text

2 自己紹介 ● sue445 ● 2018年7月入社 ○ もうすぐ4年目 ● インフラ部所属 ● #z-アニメ, #z-precure, #z-pretty-series sue445

Slide 3

Slide 3 text

3 ● AWS, GCP, CI, GitLab, Sentry etc… ● 最近は各チームがやりたいことに対して AWS, GCP, オンプレでいくつか案を出してアドバイ スしたり、実際に自分でシステムを構築 ● 例)オンプレで動いてたSentryをGKEに移行、Herokuで動いてたアプリをECSに移行 ● publicな業務内容: https://inside.pixiv.blog/search?q=sue445 業務内容

Slide 4

Slide 4 text

4 ● AWS, GCP, CI, GitLab, Sentry etc… ● 最近は各チームがやりたいことに対して AWS, GCP, オンプレでいくつか案を出してアドバイ スしたり、実際に自分でシステムを構築 ● 例)オンプレで動いてたSentryをGKEに移行、Herokuで動いてたアプリをECSに移行 ● publicな業務内容: https://inside.pixiv.blog/search?q=sue445 業務内容

Slide 5

Slide 5 text

5 ● Sentryとは? ● 劇的Before/After ● リプレイスについて ● Datadogで見る1年間 ● Sentryをリプレイスしたことによるメリット ● 今後の課題 Agenda

Slide 6

Slide 6 text

6 ● アプリケーションのエラーを収集するウェブアプリ ○ https://docs.sentry.io/ ● クライアントライブラリが充実しててメジャーどころの言語は全部対応してる ● SaaS(https://sentry.io/)が有名だが、Sentry自体もOSSなので自分でホスティングするこ ともできる ○ https://develop.sentry.dev/self-hosted/ ○ https://github.com/getsentry/onpremise ○ https://hub.docker.com/r/getsentry/sentry ● 似たようなアプリとしてAirbrake, Errbit, RollberなどがあるがSentryが一番メジャーだと思 う Sentryとは?

Slide 7

Slide 7 text

7 ● Before : オンプレのサーバ1台 ○ そんなにスペックは高くない ○ アプリとミドルウェア一式がdocker-composeで雑に実行 ● After : 全てGCP ○ GKE ○ Cloud SQL for PostgreSQL ○ Cloud Memorystore for Redis ○ 業務でGCPやkubernetesを使ったのはこれが初めて 劇的Before/After

Slide 8

Slide 8 text

8 ● オンプレのSentryのスペックがそんなに高くないので、どこかのアプリでエラーが大量に発 生すると高負荷で他アプリにも通知遅延などの影響が出る問題があった ● ストレージの容量が逼迫してた ○ 試算したらこのまま行くと3ヶ月くらいでdisk fullになりそうだったので「100日後 に死ぬサーバです(なので早く新Sentryに移行してください)」って全社アナウン スした ● 2019年末にインフラ部内で来期(FY2020)の予算計画を立てることになって、そのタイミン グでリプレイスすることにした リプレイスの理由

Slide 9

Slide 9 text

9 ● リプレイスの際に下記の3つで検討した ○ SaaS ○ Self hosting (オンプレ) ○ Self hosting (クラウド) ● 最終的には「Self hosting (クラウド)」を選択したのだが、そこに至るまでの変遷を紹介 実装&選択方針

Slide 10

Slide 10 text

10 ● オンプレ単一サーバ構成 ○ 構成が同じだとスペックだけ上げてもいずれは頭打ちになるのでスケールアウト をしたい ● オンプレ複数サーバ構成 ○ SentryがDockerイメージ利用を推奨してるのだが、オンプレで Dockerのクラス タを自前で管理しようとすると実行環境以外にもサーバが必要で台数がかさむ ○ kubernetesだとクラスタの管理で最低3台必要になる ● オンプレだとアプリで急激にエラーが増えた場合に増設しづらい 【ボツ案】Self hosting (オンプレ)

Slide 11

Slide 11 text

11 ● SaaS案だと旧Sentryのイベント数(2019年末時点で1,500万イベント)で月1万ドルの試算 になったので費用感が合わなかった ● 問い合わせたらディスカウントでも月 2,800ドルくらいだった ○ 費用面だけならGKE案と割といい線いってた ● アプリからパスワードなどの機微情報を含むエラーが送られた場合に sentry.ioに機微情報 が保存されてしまうので、(オンプレ使うにしろクラウド使うにしろ) SaaSよりも自前のサーバ で管理するのがよいと判断 【ボツ案】SaaS

Slide 12

Slide 12 text

12 ● クラウドのフルマネージドのDockerクラスタで作るのが前述の問題を解決でき、アーキテク チャ的にも筋が良さそうだった ○ SentryのHelm chartがあったのが一番大きい(後述) ● この時点でEKS(AWSのKubernetes)かGKE(GCPのKubernetes)の二択になったが、自分 自身とインフラ部内でのGCPの運用経験値を貯めるためにGKEを選択した ○ 「知らないからやらなかったら一生新しいことはできない」 が持論なので、敢えて やったことないものを使いたかった ○ EKSとGKEで費用的にはそんなに変わらなかった 【採用】Self hosting (クラウド)

Slide 13

Slide 13 text

13 GKE版Sentryの構成 Cloud SQL (PostgreSQL) Cloud Memorystore (redis) GCS GKE node x 20台以上 pod x 60〜100台くらい

Slide 14

Slide 14 text

14 ● ウェブアプリケーションが動く環境を全部作った ○ 新sentryのドメイン取得 ○ GCPのプロジェクトを作成してインフラを全て作った ○ Sentry本体のデプロイ sue445がやったこと

Slide 15

Slide 15 text

15 ● 2020年1月:新Sentryの開発開始 ● 2020年2月:本番環境が完成し、一部のアプリのみ新 Sentryを開放 ○ 自分がメンテしてたアプリと旧Sentryで一番エラーの多かったアプリ ● 2020年3月:新Sentryを全社に開放 リリースノート

Slide 16

Slide 16 text

16 ● GCPもkubernetesも全く分からない状態 ● Google App Engineは趣味で多少使ったことはあったけど、 GCPのプロジェクト全体をガッ ツリ触ったのは今回が初めて ● 1ヶ月でブラウザで一通り動く状態の開発環境を作りきった 開発当初のsue445の経験値

Slide 17

Slide 17 text

17 https://www.credential.net/9643f19d-5584-40b6-a330-5b966a26f310 【余談】GCP赤ちゃんの状態から1年で認定資格をとった

Slide 18

Slide 18 text

18 ● Terraformリポジトリ:GCPのインフラ全般 ○ Deployment Manager(GCP公式の構成管理ツール)を使うという選択肢もあっ たが、TerraformだとAWSとGCPの両方に対応していて運用コストや学習コスト が抑えられた ○ ピクシブではAWSとGCPの両方運用してるので同じツールでやりたい ● Dockerイメージ:アプリケーション本体 ○ 公式のDockerイメージだとGCS対応に必要なライブラリがなくて自分でビルドし た ● デプロイ用リポジトリ:アプリケーションの実行環境 ○ KubernetesにはHelmという公式パッケージマネージャがあり、そこで配布され てるHelm chartをCIでデプロイしてる 作ったもの

Slide 19

Slide 19 text

19 ● 開発環境:masterブランチが自動デプロイ、必要に応じてトピックブランチを手動デプロイ ● 本番環境:必要に応じてmasterブランチを手動デプロイする デプロイフロー

Slide 20

Slide 20 text

20 1. 最初はdevelopブランチを開発環境に自動デプロイ、 masterブランチをproductionに自動 デプロイにしてたのだが、git-flowが社内ではあまり浸透してなくて自分以外がブランチ運 用できる気がしないので途中でやめた 2. 次は開発環境と本番両方手動デプロイにしてたのが、開発環境デプロイするのに毎回デプ ロイボタンをポチるのが面倒なのでやめた 3. そして今の構成(開発環境は自動 or手動デプロイ、本番環境は手動デプロイ)に落ち着い た デプロイフローの歴史

Slide 21

Slide 21 text

21 ● 1年間運用してどのように成長したのかを紹介 Datadogで見る1年間

Slide 22

Slide 22 text

22 ● オートスケールによって常時20〜30台くらい稼働してる ● VMが増えすぎるとDatadogのコストになるため台数が増えすぎないように VMをスペック アップしてる ● 例)「n1-standard-1のVM2台」と「n1-standard-2のVM1台」とではGCEの金額は同じなの だが、Datadog agentは監視する台数によって変わるので後者の方が安くなる GKE: node(VM)

Slide 23

Slide 23 text

23 ● GKEのnode全体で初期は20コアくらい、 今は200コアくらい ● 去年6月に増えてるのはpodが自動で増えずに無理やり増やしたため GKE: vCPU

Slide 24

Slide 24 text

24 ● GKEのnode全体で200〜400GBくらい ● 4月にガクッと減ってるのは、nodeのスペックを調整したため(後述) GKE: Memory

Slide 25

Slide 25 text

25 ● Sentryのpodのスペックを細かく調整していった結果、 CPUに対してメモリが無駄になってた ので調整した ● Before: n1-highmem-8 (メモリ52GB) ● After: n1-custom-16-30720 (n1-standard-16の半分のメモリ) GKE: Memory

Slide 26

Slide 26 text

26 ● web(httpのリクエストを受けるpod)が50〜60個、worker(エラーをバックグラウンドで処理す るpod)が20〜30個くらい GKE: pods

Slide 27

Slide 27 text

27 ● 1年間で約100GBくらい ● 上の線がCloud SQLに割り当てられたストレージサイズで、下の線が実際に使用してるスト レージサイズ。(容量逼迫すると自動でストレージが増えて便利) Cloud SQL(PostgreSQL): ストレージ

Slide 28

Slide 28 text

28 ● 100〜200万くらいのkey ● 一気にKeyが0になってるのはSentryのqueueが詰まってRedisのメモリが溢れて死んだ時 や、メモリが溢れる直前にflushallした時 Memorystore (Redis): Keyの数

Slide 29

Slide 29 text

29 ● 今はだいたい200万くらいのオブジェクト数 ● Datadogだとバケット全体のサイズが取れないので GCPのコンソールで確認したら66GiBく らいだった GCS: オブジェクト数

Slide 30

Slide 30 text

30 ● リプレイス前はオンプレサーバのストレージサイズを逼迫してたが、リプレイス後は Cloud SQLやGCSにデータが保存されるので容量問題が完全に解決した ● 全てをクラウドに移したことにより Sentry全体のスペック変更がしやすくなった ● GKEのオートスケールにより社内の利用状況やエラーの量によって自動でサーバが増減 するようになった ● インフラ部内でのGCPやKubernetesの運用経験値が上がった Sentryをリプレイスしたことによるメリット

Slide 31

Slide 31 text

31 ● GKEのオートスケールで無限にサーバを増やせると思ったが、サーバを増やしすぎると DB やRedisが高負荷になってSentryの挙動がおかしくなるのであまり増やせない ○ 特にSentryはRedisをヘビーに使ってる ○ DBやRedisのスペックを上げるとお金がかかる ● pgbouncerを入れてPostgreSQLのコネクションをプールしてるのだが、 INSERT時には効 かないのでエラーが大量に飛んできた時に PostgreSQLのコネクションが枯渇する Sentryを1年間運用しての学び

Slide 32

Slide 32 text

32 ● サーバサイドのエラーよりもフロントエンドのエラーの方が Sentryに飛んでくる圧倒的にエ ラーが多い ○ サーバサイドのエラーは送信元がピクシブのサーバだけだが、フロントエンドの エラーはユーザのブラウザからSentryにリクエストが飛んでくるため ○ アプリだけじゃなく広告系のjsがエラーになってもSentryにエラーが飛んでくるの でつらい ○ jsのエラーが大量発生した時にSentryが死ぬことがしょっちゅうあったので ReteLimitを設定するようにしてる Sentryを1年間運用しての学び

Slide 33

Slide 33 text

33 ● Sentryのメジャーバージョンアップ ○ 今ピクシブで使ってるのは9系なので最新まで上げたいのだが、今使ってる helm chart( https://github.com/helm/charts/tree/master/stable/sentry ) だと最新版に対応していないので https://github.com/sentry-kubernetes/charts に移行する必要があって大変 今後の課題