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

まかれるあなとみあ ―Mackerel のしくみを理解する 30 分― @ Hatena En...

まかれるあなとみあ ―Mackerel のしくみを理解する 30 分― @ Hatena Engineer Seminar #16

devops を繋ぐ監視サービス Mackerel がどんな仕組みで動いているか気になりませんか? あの機能の裏側はどうなってるの〜!? 知りたくて夜も眠れないあなたに、アラーティングからロール内異常検知まで、グラフ表示から Google Cloud インテグレーションまで、Mackerel の裏側を全部教えちゃいます! これを聞けばあなたも Mackerel 開発者だ!

さっちゃん

April 27, 2021
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

  1. 3 .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆) id:ne-sachirou Mackerel のアプリケーションエンジニア 2019/09〜 仕事で使ってる言語 :

    Scala, TypeScript, Go, Python, (Bash, Perl…) 仕事で使ってるエディタ : Emacs with Evil and lsp-mode 今嵌まってる言語 : Clojure, Babashka, Clojerl (Clojure on Erlang VM) 幼なじみ : Ruby .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)
  2. 5 SRE (Site Reliability Engineer) : サービス動作の信頼性を担保する CRE (Customer Reliability

    Engineer) : 顧客に対するサービスの信頼性を担保する アプリケーションエンジニア : サービスのアプリケーションを開発する Mackerel のエンジニア達
  3. 8

  4. 9

  5. 13 Mackerel の仕組み proxy Web コンソール バッチ API ロール内 異常検知

    外形監視 AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  6. 14 最近の仕組みの更新ハイライト! Redis が EC2 から ElastiCache に移行しました 多くのサーバーが EC2

    から ECS Fargate に移行しました デプロイの方法も Capistrano 2 から CodePipeline へ移行していっています Google Cloud インテグレーション用のコンポーネントが増えました AngularJS が React に移行しつつあります Mackerel の仕組み
  7. 16 proxy proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  8. 19 proxy NLB Nginx 本体へ Elastic IP で IP address

    を固定 適切なサーバーへ 振り分ける
  9. 21 本体 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  10. 22 Mackerel の全て (全てではない) のロジックが詰まっている 巨大なコードのかたまり。サーバーは Scala (Play Framework)、フロントエンドは TypeScript

    (s/AngularJS/React/) 言語やライブラリの更新は、軽いものは当番が dependabot や renovate も活用して上げ る、重いものは issue を立て計画してがんばる (他のコンポーネントでも同様) だいたいコンテナ (ECS Fargate) で動いている 同一のコードが以下の 3 種類のサーバーへデプロイされる • Web コンソールサーバー • API サーバー • バッチサーバー 本体
  11. 23 本体 / Web コンソール & API サーバー proxy diamond

    PostgreSQL Redis ALB ECS Fargate Web コンソール サーバー API サーバー
  12. 24 Web コンソール (mackerel.io でサインインすると表示される Web UI) のリソースを配信す る Web

    コンソールからの操作を受け付け、処理を行う 共有グラフや公開グラフを配信する ECS Fargate で動作する。Jenkins から ECR へイメージを置き、CodeDeploy から B/G デ プロイする (API サーバーも同じく) Redis は容量を確保する為に 2 台に垂直分割してある (API サーバーも同じく) 本体 / Web コンソールサーバー
  13. 26 本体 / Web コンソール & API サーバー proxy diamond

    PostgreSQL Redis ALB ECS Fargate Web コンソール サーバー API サーバー
  14. 29 EC2 上で動く cron が HTTP リクエストを発行し、ALB の背後にある EC2 上の

    Scala コー ドがバッチ処理を行う cron 用の EC2 を 2 台置く事で AZ 冗長を確保。バッチは冪等であるか、あるいは Redis を 介してロックを取る 本体 / 現行バッチサーバー
  15. 30 本体 / 現行バッチサーバー diamond PostgreSQL Redis ALB cron (EC2)

    EC2 ロックを 取得 冗長化された リクエスト
  16. 32 (※移行中なので大幅に変更されるかもしれない) cron は CloudWatch Events に置き換わる。冗長性は CloudWatch Events に任せる

    素早く終わるバッチは Lambda (container) で、時間のかかるバッチは ECS Fargate で処 理する この移行が完了すると、本体は全てコンテナで動作する事になる! 本体 / 新バッチサーバー
  17. 33 本体 / 新バッチサーバー diamond PostgreSQL Redis ECS Fargate Lambda

    ClaudWatch Events 時間のかかる バッチ 素早く終わる バッチ
  18. 36 diamond (時系列 DB) proxy Web コンソール バッチ API ロール内

    異常検知 外形監視 AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  19. 38 diamond (時系列 DB) ALB ECS Fargate Lambda DynamoDB Redis

    Cluster S3 Kinesis Data Stream 読み込み 書き込み
  20. 39 • 坪内佑樹、他「HeteroTSDB: 異種混合キーバリューストアを用いた自動階層化のための時系列データベース アーキテクチャ」2018 http://id.nii.ac.jp/1001/00192569/ • 時系列データベースという概念をクラウドの技で再構築する / The

    rebuild of time-series database on AWS https://speakerdeck.com/yuukit/the-rebuild-of-time-series-database-on-aws • サーバレスアーキテクチャによる時系列データベースの構築と監視 / Serverlessconf Tokyo 2017 https://speakerdeck.com/itchyny/serverlessconf-tokyo-2017 • AWS で実現した Mackerel 時系列データ1分粒度長期保存の裏側 / Mackerel Meetup #11 Tokyo https://speakerdeck.com/astj/mackerel-meetup-number-11-tokyo • Mackerel の時系列データベースにおける Redis Cluster の利用と Amazon ElastiCache への移行について / AWS Purpose-Built Databases Week https://speakerdeck.com/astj/aws-purpose-built-databases-week diamond (時系列 DB)
  21. 46 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 異常検知 アラート 保存

    ホスト数記録 死活監視 メトリック監視 グラフ定義保存 メトリック
  22. 49 直近のメトリックは Redis Cluster に、少し前のメトリックは DynamoDB に、古いメトリックは 圧縮されて S3 にある。(diamond

    の各資料を参照) diamond の中のデータは「メトリックキー × 時刻 → メトリック値」 グラフ定義を元にメトリック値を取得し表示するには… グラフ表示の仕組み
  23. 50 diamond の中のデータは「メトリックキー × 時刻 → メトリック値」 ロール (ホストの集合) のグラフを表示する場合:

    グラフ定義 := ロールのグラフ定義 ∪ ホストのグラフ定義 グラフの線 := ロール自身の持つグラフの本数 ∪ ロールに紐づくホスト メトリックキー ∈ グラフ定義 × グラフの線 メトリック値 := diamond(メトリックキー × 時刻) グラフ表示の仕組み
  24. 51 diamond の中のデータは「メトリックキー × 時刻 → メトリック値」 ロールグラフを表示する場合: グラフ定義 :=

    ロールのグラフ定義 ∪ ホストのグラフ定義 グラフの線 := ロール自身の持つグラフの本数 ∪ ロールに紐づくホスト メトリックキー ∈ グラフ定義 × グラフの線 メトリック値 := diamond(メトリックキー × 時刻) グラフ表示の仕組み
  25. 54 アラーティングの仕組み ホストメトリック監視 ホストメトリックの移動平均 (1〜10 分) が閾値を超えるとアラート サービスメトリック監視 サービスメトリックの移動平均が閾値を超えるとアラート 式による監視

    式の値が閾値を超えるとアラート ホスト死活監視 エージェントからメトリックが送られてこなくなった事を検知する チェック監視 エージェントから OK/NG が送られてくる ロール内異常検知 ロール内のメトリックの異常な動きを機械学習により検知する (後述) 外形監視 顧客の Web サイトへ HTTP/HTTPS リクエストを投げ、レスポンスによってア ラーティングする (後述)
  26. 59 ロール内異常検知 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  27. 65 外形監視 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  28. 67 顧客の Web サイトへ HTTP/HTTPS リクエストを投げ、レスポンスによってアラーティングし たり、レスポンスタイムをメトリックとして記録する機能 独自の DB は持たない。毎分バッチサーバーから外形監視用のデータが送られてくる。これ

    を Redis に enqueue し、ECS タスクにて分散して処理する (AWS インテグレーションと Azure インテグレーションも同様の仕組み) ユーザーが Web コンソールで外形監視を設定した時に、その設定が妥当か検査する機能 も持つ (AWS インテグレーション、Azure インテグレーション、Google Cloud インテグレー ションも同様) Go (ECS) 外形監視
  29. 70 AWS, Azure, Google Cloud インテグレーション proxy Web コンソール バッチ

    API ロール内 異常検知 外形監視 AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  30. 77 顧客の Google Cloud Monitoring からいい感じにメトリックを取得する SQS を使って enqueue するようになった

    (キューにはキューを使う) 「いつのメトリックを取得するべきか」をデータに含めて euqueue することでリトライ可能に なった Go (ECS) Google Cloud インテグレーション