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

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

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

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

4b071f90c5d9c0a58e2d9076460b7be4?s=128

さっちゃん

April 27, 2021
Tweet

Transcript

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

  2. 2 .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆) .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

  3. 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)ノ゙☆)
  4. 4 SRE (Site Reliability Engineer) CRE (Customer Reliability Engineer) アプリケーションエンジニア

    Mackerel のエンジニア達
  5. 5 SRE (Site Reliability Engineer) : サービス動作の信頼性を担保する CRE (Customer Reliability

    Engineer) : 顧客に対するサービスの信頼性を担保する アプリケーションエンジニア : サービスのアプリケーションを開発する Mackerel のエンジニア達
  6. 6 SRE (Site Reliability Engineer) CRE (Customer Reliability Engineer) アプリケーションエンジニア ←ここ

    Mackerel のエンジニア達
  7. 7 Mackerel とは

  8. 8

  9. 9

  10. 10 エンジニアをワクワクさせる「直感的サーバー監視サービス」 エージェントあるいはインテグレーションで簡単に導入できる 美しく、かつ使い易いグラフ 作り易いダッシュボード 簡単に設定できて障礙時に役に立つアラート 監視サービス自体の運用は Mackerel チームにおまかせ Mackerel

    とは
  11. 11 メトリックの投稿と閲覧 ホストにメタデータをつけて管理する アラーティングや各種通知 機械学習を利用したロール内異常検知 外形監視 AWS, Azure, Google Cloud

    とのインテグレーション Mackerel の主な機能
  12. 12 ホスト ∈ ロール ∈ サービス

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

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

    から ECS Fargate に移行しました デプロイの方法も Capistrano 2 から CodePipeline へ移行していっています Google Cloud インテグレーション用のコンポーネントが増えました AngularJS が React に移行しつつあります Mackerel の仕組み
  15. 15 proxy

  16. 16 proxy proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  17. 17 (※AZ 冗長は省略した図。以降のページでも同じ) proxy NLB Nginx 本体へ

  18. 18 アプリケーションエンジニアが操作する機会はあまり無い インターネットからの全てのリクエストを受け、URL を見て適切なサーバーへ振り分ける TLS を終端する IP address を固定する。閉域からこの IP

    address へだけ通信を許可する運用が可能 一部の静的ファイルを配信する proxy
  19. 19 proxy NLB Nginx 本体へ Elastic IP で IP address

    を固定 適切なサーバーへ 振り分ける
  20. 20 本体

  21. 21 本体 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

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

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

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

    コンソールからの操作を受け付け、処理を行う 共有グラフや公開グラフを配信する ECS Fargate で動作する。Jenkins から ECR へイメージを置き、CodeDeploy から B/G デ プロイする (API サーバーも同じく) Redis は容量を確保する為に 2 台に垂直分割してある (API サーバーも同じく) 本体 / Web コンソールサーバー
  25. 25 API リクエスト (メトリック投稿等多数) を受け付け、処理を行う https://mackerel.io/ja/api-docs/ 本体 / API サーバー

  26. 26 本体 / Web コンソール & API サーバー proxy diamond

    PostgreSQL Redis ALB ECS Fargate Web コンソール サーバー API サーバー
  27. 27 色々な定期バッチ処理 (ホスト死活監視、外形監視の実行、課金処理等多数) を行う EC2 (現行) から Lambda & ECS

    (新) へ移行中 本体 / バッチサーバー
  28. 28 本体 / 現行バッチサーバー diamond PostgreSQL Redis ALB cron (EC2)

    EC2
  29. 29 EC2 上で動く cron が HTTP リクエストを発行し、ALB の背後にある EC2 上の

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

    EC2 ロックを 取得 冗長化された リクエスト
  31. 31 本体 / 新バッチサーバー diamond PostgreSQL Redis ECS Fargate Lambda

    ClaudWatch Events
  32. 32 (※移行中なので大幅に変更されるかもしれない) cron は CloudWatch Events に置き換わる。冗長性は CloudWatch Events に任せる

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

    ClaudWatch Events 時間のかかる バッチ 素早く終わる バッチ
  34. 34 AngularJS から React へ移行中 https://speakerdeck.com/susisu/hatena-engineer-seminar-number-13 状態のスパゲッティーが解消されていってめでたい 本体 / フロントエンド

  35. 35 diamond (時系列 DB)

  36. 36 diamond (時系列 DB) proxy Web コンソール バッチ API ロール内

    異常検知 外形監視 AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  37. 37 Graphite 互換の時系列 DB Mackerel に投稿されたメトリックは diamond に保存される Graphite 互換の式を提供する。式グラフや式監視で使える

    TypeScript (Lambda) & Go (Lambda, ECS) diamond (時系列 DB)
  38. 38 diamond (時系列 DB) ALB ECS Fargate Lambda DynamoDB Redis

    Cluster S3 Kinesis Data Stream 読み込み 書き込み
  39. 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)
  40. 40 メトリック投稿 グラフ表示 アラーティング 本体で実現される主な機能の仕組み

  41. 41 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 メトリック

  42. 42 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 グラフ定義保存 メトリック

  43. 43 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 保存 グラフ定義保存 メトリック

  44. 44 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 保存 ホスト数記録 死活監視

    メトリック監視 グラフ定義保存 メトリック
  45. 45 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 異常検知 保存 ホスト数記録

    死活監視 メトリック監視 グラフ定義保存 メトリック
  46. 46 メトリック投稿の仕組み API Redis diamond PostgreSQL 異常検知 異常検知 アラート 保存

    ホスト数記録 死活監視 メトリック監視 グラフ定義保存 メトリック
  47. 47 グラフ表示の仕組み

  48. 48 グラフ定義 グラフ表示の仕組み

  49. 49 直近のメトリックは Redis Cluster に、少し前のメトリックは DynamoDB に、古いメトリックは 圧縮されて S3 にある。(diamond

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

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

    ロールのグラフ定義 ∪ ホストのグラフ定義 グラフの線 := ロール自身の持つグラフの本数 ∪ ロールに紐づくホスト メトリックキー ∈ グラフ定義 × グラフの線 メトリック値 := diamond(メトリックキー × 時刻) グラフ表示の仕組み
  52. 52 グラフの画像を共有する機能 (Slack 通知、共有グラフ等) では Web コンソールサーバーで グラフを描画する SVG を作り

    java.awt で画像を作っている グラフ表示の仕組み
  53. 53 アラーティングの仕組み

  54. 54 アラーティングの仕組み ホストメトリック監視 ホストメトリックの移動平均 (1〜10 分) が閾値を超えるとアラート サービスメトリック監視 サービスメトリックの移動平均が閾値を超えるとアラート 式による監視

    式の値が閾値を超えるとアラート ホスト死活監視 エージェントからメトリックが送られてこなくなった事を検知する チェック監視 エージェントから OK/NG が送られてくる ロール内異常検知 ロール内のメトリックの異常な動きを機械学習により検知する (後述) 外形監視 顧客の Web サイトへ HTTP/HTTPS リクエストを投げ、レスポンスによってア ラーティングする (後述)
  55. 55 メトリック投稿の時に、diamond とは別に Redis にも直近のメトリックを保存する。この平均 が閾値を超えるとアラートを発報 Graphite (アラーティングの機能が無かった) を使っていた時期の実装を使い続けている アラーティング

    / メトリック監視の仕組み API Redis
  56. 56 5 分毎にバッチが走り、diamond に式の結果を問い合わせる。結果が閾値を超えていたら アラートを発報する アラーティング / 式による監視の仕組み バッチ diamond

  57. 57 毎分バッチが走り、最後にエージェントがシステムメトリックを投稿してきた時刻が古過ぎると アラートを発報する アラーティング / ホスト死活監視の仕組み バッチ Redis

  58. 58 ロール内異常検知

  59. 59 ロール内異常検知 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  60. 60 ロール (似た働きをするホスト達) 内のメトリックの異常な動きを機械学習により検知する Python (Batch, ECS) ロール内異常検知

  61. 61 https://www.slideshare.net/syou6162/mackerel-148068652 ロール内異常検知

  62. 62 ロール内異常検知 ALB バッチ API DynamoDB ECS Fargate Batch 予測

    学習 モデルを 保存する diamond API
  63. 63 ロール内異常検知

  64. 64 外形監視

  65. 65 外形監視 proxy Web コンソール バッチ API ロール内 異常検知 外形監視

    AWS インテグレーション Azure インテグレーション Google Cloud インテグレーション diamond 本体
  66. 66 外形監視 バッチ Redis ALB NAT Gateway Web コンソール API

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

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

    enqueue API 結果 Elastic IP で IP address を固定
  69. 69 AWS, Azure, Google Cloud インテグレーション

  70. 70 AWS, Azure, Google Cloud インテグレーション proxy Web コンソール バッチ

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

  72. 72 顧客の AWS CloudWatch からいい感じにメトリックを取得する 仕組みは外形監視とほぼ同じ (バッチ間隔は 5 分毎) Go

    (ECS) AWS インテグレーション
  73. 73 AWS インテグレーション バッチ Redis ALB Web コンソール API AWS

    バリデーション enqueue 結果
  74. 74 顧客の Azure Monitor からいい感じにメトリックを取得する 仕組みは外形監視とほぼ同じ (バッチ間隔は 5 分毎) Go

    (ECS) Azure インテグレーション
  75. 75 Azure インテグレーション バッチ Redis ALB Web コンソール API Azure

    バリデーション enqueue 結果
  76. 76 Google Cloud インテグレーション バッチ ALB Web コンソール API Google

    Cloud SQS
  77. 77 顧客の Google Cloud Monitoring からいい感じにメトリックを取得する SQS を使って enqueue するようになった

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

    Cloud SQS バリデーション enqueue 結果
  79. 79 Mackerel の運用を支える Mackerel

  80. 80 Mackerel の運用を支える Mackerel

  81. 81 Mackerel の運用を支える Mackerel SLI / SLO を Mackerel で監視

  82. 82 https://speakerdeck.com/astj/noops-meetup-tokyo-number-8 監視設計の話も載っているので御覧下さい Mackerel の運用を支える Mackerel

  83. 83 Mackerel の運用を支える Mackerel

  84. 84 Mackerel の運用を支える Mackerel 開発の様子を Mackerel で可視化

  85. 85 mackerel.io