Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

7 Mackerel とは

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

15 proxy

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

20 本体

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

35 diamond (時系列 DB)

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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)

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

47 グラフ表示の仕組み

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

58 ロール内異常検知

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

63 ロール内異常検知

Slide 64

Slide 64 text

64 外形監視

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

79 Mackerel の運用を支える Mackerel

Slide 80

Slide 80 text

80 Mackerel の運用を支える Mackerel

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

83 Mackerel の運用を支える Mackerel

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

85 mackerel.io