Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 に移行する必要があって大変 今後の課題