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 開発者だ!

さっちゃん

April 27, 2021
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  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)ノ゙☆)

    View Slide

  4. 4
    SRE (Site Reliability Engineer)
    CRE (Customer Reliability Engineer)
    アプリケーションエンジニア
    Mackerel のエンジニア達

    View Slide

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

    View Slide

  6. 6
    SRE (Site Reliability Engineer)
    CRE (Customer Reliability Engineer)
    アプリケーションエンジニア ←ここ
    Mackerel のエンジニア達

    View Slide

  7. 7
    Mackerel とは

    View Slide

  8. 8

    View Slide

  9. 9

    View Slide

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

    View Slide

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

    View Slide

  12. 12
    ホスト ∈ ロール ∈ サービス

    View Slide

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

    View Slide

  14. 14
    最近の仕組みの更新ハイライト!
    Redis が EC2 から ElastiCache に移行しました
    多くのサーバーが EC2 から ECS Fargate に移行しました
    デプロイの方法も Capistrano 2 から CodePipeline へ移行していっています
    Google Cloud インテグレーション用のコンポーネントが増えました
    AngularJS が React に移行しつつあります
    Mackerel の仕組み

    View Slide

  15. 15
    proxy

    View Slide

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

    View Slide

  17. 17
    (※AZ 冗長は省略した図。以降のページでも同じ)
    proxy
    NLB Nginx
    本体へ

    View Slide

  18. 18
    アプリケーションエンジニアが操作する機会はあまり無い
    インターネットからの全てのリクエストを受け、URL を見て適切なサーバーへ振り分ける
    TLS を終端する
    IP address を固定する。閉域からこの IP address へだけ通信を許可する運用が可能
    一部の静的ファイルを配信する
    proxy

    View Slide

  19. 19
    proxy
    NLB Nginx
    本体へ
    Elastic IP で
    IP address を固定
    適切なサーバーへ
    振り分ける

    View Slide

  20. 20
    本体

    View Slide

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

    View Slide

  22. 22
    Mackerel の全て (全てではない) のロジックが詰まっている
    巨大なコードのかたまり。サーバーは Scala (Play Framework)、フロントエンドは
    TypeScript (s/AngularJS/React/)
    言語やライブラリの更新は、軽いものは当番が dependabot や renovate も活用して上げ
    る、重いものは issue を立て計画してがんばる (他のコンポーネントでも同様)
    だいたいコンテナ (ECS Fargate) で動いている
    同一のコードが以下の 3 種類のサーバーへデプロイされる
    • Web コンソールサーバー
    • API サーバー
    • バッチサーバー
    本体

    View Slide

  23. 23
    本体 / Web コンソール & API サーバー
    proxy
    diamond
    PostgreSQL
    Redis
    ALB ECS Fargate
    Web コンソール
    サーバー
    API サーバー

    View Slide

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

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

    View Slide

  25. 25
    API リクエスト (メトリック投稿等多数) を受け付け、処理を行う
    https://mackerel.io/ja/api-docs/
    本体 / API サーバー

    View Slide

  26. 26
    本体 / Web コンソール & API サーバー
    proxy
    diamond
    PostgreSQL
    Redis
    ALB ECS Fargate
    Web コンソール
    サーバー
    API サーバー

    View Slide

  27. 27
    色々な定期バッチ処理 (ホスト死活監視、外形監視の実行、課金処理等多数) を行う
    EC2 (現行) から Lambda & ECS (新) へ移行中
    本体 / バッチサーバー

    View Slide

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

    View Slide

  29. 29
    EC2 上で動く cron が HTTP リクエストを発行し、ALB の背後にある EC2 上の Scala コー
    ドがバッチ処理を行う
    cron 用の EC2 を 2 台置く事で AZ 冗長を確保。バッチは冪等であるか、あるいは Redis を
    介してロックを取る
    本体 / 現行バッチサーバー

    View Slide

  30. 30
    本体 / 現行バッチサーバー
    diamond
    PostgreSQL
    Redis
    ALB
    cron (EC2) EC2
    ロックを
    取得
    冗長化された
    リクエスト

    View Slide

  31. 31
    本体 / 新バッチサーバー
    diamond
    PostgreSQL
    Redis
    ECS Fargate
    Lambda
    ClaudWatch
    Events

    View Slide

  32. 32
    (※移行中なので大幅に変更されるかもしれない)
    cron は CloudWatch Events に置き換わる。冗長性は CloudWatch Events に任せる
    素早く終わるバッチは Lambda (container) で、時間のかかるバッチは ECS Fargate で処
    理する
    この移行が完了すると、本体は全てコンテナで動作する事になる!
    本体 / 新バッチサーバー

    View Slide

  33. 33
    本体 / 新バッチサーバー
    diamond
    PostgreSQL
    Redis
    ECS Fargate
    Lambda
    ClaudWatch
    Events
    時間のかかる
    バッチ
    素早く終わる
    バッチ

    View Slide

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

    View Slide

  35. 35
    diamond (時系列 DB)

    View Slide

  36. 36
    diamond (時系列 DB)
    proxy
    Web
    コンソール
    バッチ
    API
    ロール内
    異常検知
    外形監視
    AWS
    インテグレーション
    Azure
    インテグレーション
    Google Cloud
    インテグレーション
    diamond
    本体

    View Slide

  37. 37
    Graphite 互換の時系列 DB
    Mackerel に投稿されたメトリックは diamond に保存される
    Graphite 互換の式を提供する。式グラフや式監視で使える
    TypeScript (Lambda) & Go (Lambda, ECS)
    diamond (時系列 DB)

    View Slide

  38. 38
    diamond (時系列 DB)
    ALB
    ECS Fargate
    Lambda
    DynamoDB
    Redis Cluster
    S3
    Kinesis
    Data
    Stream
    読み込み
    書き込み

    View Slide

  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)

    View Slide

  40. 40
    メトリック投稿
    グラフ表示
    アラーティング
    本体で実現される主な機能の仕組み

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  47. 47
    グラフ表示の仕組み

    View Slide

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

    View Slide

  49. 49
    直近のメトリックは Redis Cluster に、少し前のメトリックは DynamoDB に、古いメトリックは
    圧縮されて S3 にある。(diamond の各資料を参照)
    diamond の中のデータは「メトリックキー × 時刻 → メトリック値」
    グラフ定義を元にメトリック値を取得し表示するには…
    グラフ表示の仕組み

    View Slide

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

    View Slide

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

    View Slide

  52. 52
    グラフの画像を共有する機能 (Slack 通知、共有グラフ等) では Web コンソールサーバーで
    グラフを描画する
    SVG を作り java.awt で画像を作っている
    グラフ表示の仕組み

    View Slide

  53. 53
    アラーティングの仕組み

    View Slide

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

    View Slide

  55. 55
    メトリック投稿の時に、diamond とは別に Redis にも直近のメトリックを保存する。この平均
    が閾値を超えるとアラートを発報
    Graphite (アラーティングの機能が無かった) を使っていた時期の実装を使い続けている
    アラーティング / メトリック監視の仕組み
    API Redis

    View Slide

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

    View Slide

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

    View Slide

  58. 58
    ロール内異常検知

    View Slide

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

    View Slide

  60. 60
    ロール (似た働きをするホスト達) 内のメトリックの異常な動きを機械学習により検知する
    Python (Batch, ECS)
    ロール内異常検知

    View Slide

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

    View Slide

  62. 62
    ロール内異常検知
    ALB
    バッチ
    API DynamoDB
    ECS Fargate
    Batch
    予測
    学習
    モデルを
    保存する
    diamond API

    View Slide

  63. 63
    ロール内異常検知

    View Slide

  64. 64
    外形監視

    View Slide

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

    View Slide

  66. 66
    外形監視
    バッチ Redis
    ALB NAT
    Gateway
    Web
    コンソール
    API

    View Slide

  67. 67
    顧客の Web サイトへ HTTP/HTTPS リクエストを投げ、レスポンスによってアラーティングし
    たり、レスポンスタイムをメトリックとして記録する機能
    独自の DB は持たない。毎分バッチサーバーから外形監視用のデータが送られてくる。これ
    を Redis に enqueue し、ECS タスクにて分散して処理する (AWS インテグレーションと
    Azure インテグレーションも同様の仕組み)
    ユーザーが Web コンソールで外形監視を設定した時に、その設定が妥当か検査する機能
    も持つ (AWS インテグレーション、Azure インテグレーション、Google Cloud インテグレー
    ションも同様)
    Go (ECS)
    外形監視

    View Slide

  68. 68
    外形監視
    バッチ Redis
    ALB NAT
    Gateway
    Web
    コンソール
    バリデーション
    enqueue
    API
    結果
    Elastic IP で
    IP address を固定

    View Slide

  69. 69
    AWS, Azure, Google Cloud インテグレーション

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  73. 73
    AWS インテグレーション
    バッチ Redis
    ALB
    Web
    コンソール
    API
    AWS
    バリデーション
    enqueue
    結果

    View Slide

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

    View Slide

  75. 75
    Azure インテグレーション
    バッチ Redis
    ALB
    Web
    コンソール
    API
    Azure
    バリデーション
    enqueue
    結果

    View Slide

  76. 76
    Google Cloud インテグレーション
    バッチ
    ALB
    Web
    コンソール
    API
    Google
    Cloud
    SQS

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  85. 85
    mackerel.io

    View Slide