Slide 1

Slide 1 text

メトリックはいかにして 見え續ける樣になったか .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆) 2022/07 DevelopersIO 2022 1

Slide 2

Slide 2 text

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆) id:ne-sachirou @ 株式会社はてな Mackerel のアプリケーションエンジニア curl -sI https://mackerel.io | grep X-Recruitment 2

Slide 3

Slide 3 text

Mackerel とは? 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5 メトリック ホストグラフ

Slide 6

Slide 6 text

6 メトリック ロールグラフ メトリック

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

2021/09/13 以前 8 退役したホストのメトリックは 見られなくなる (※カスタムメトリックのみ)

Slide 9

Slide 9 text

2021/09/13 以後 9 退役してもカスタムメトリック が見られる

Slide 10

Slide 10 text

2021/09/13 以後 10 退役してもカスタムメトリック が見られる How?

Slide 11

Slide 11 text

11 mackerel-agent plugin システムメトリック カスタムメトリック

Slide 12

Slide 12 text

12 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと ロールメトリックを 組み合はせて表示する

Slide 13

Slide 13 text

13 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック カスタムメトリックは? ホストメトリックと ロールメトリックを 組み合はせて表示する

Slide 14

Slide 14 text

14 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック カスタムメトリックは? ホストメトリックと ロールメトリックを 組み合はせて表示する (代案を比較した結果) カスタムメトリックも システムメトリックと 同じ樣に保存しよう

Slide 15

Slide 15 text

15 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ロールグラフ用のカスタムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと ロールメトリックを 組み合はせて表示する

Slide 16

Slide 16 text

いかにして ホストメトリックと ロールメトリックを うまく組み合はせるか? 16

Slide 17

Slide 17 text

17 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ロールグラフ用のカスタムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと ロールメトリックを 組み合はせて表示する How?

Slide 18

Slide 18 text

システムメトリックの場合 18 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列 DB (diamond)

Slide 19

Slide 19 text

システムメトリックの場合 19 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列 DB (diamond) 對應する 對應する

Slide 20

Slide 20 text

システムメトリックの場合 20 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列 DB (diamond) ユーザーが 増やせる 仕組みでない

Slide 21

Slide 21 text

21 ロールID ロールメトリック名 0 custom.a.2 1 custom.b.1 … … ホストID ホストメトリック名 1 custom.a.1 1 custom.b.1 ロール 追 加 退 役 ホストID ホストメトリック名 0 custom.a.1 0 custom.a.2

Slide 22

Slide 22 text

カスタムメトリックの場合 22 22 今在るホストの ホストメトリック 今在るホストは? 時系列 DB (diamond)

Slide 23

Slide 23 text

カスタムメトリックの場合 23 23 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列 DB (diamond) どんなロールメト リックが在るかわ からない

Slide 24

Slide 24 text

24 ロールID ロールメトリック名 0 custom.a.2 1 custom.b.1 … … ホストID ホストメトリック名 1 custom.a.1 1 custom.b.1 ロール 追 加 退 役 ホストID ホストメトリック名 0 custom.a.1 0 custom.a.2 最近のホストを集 めればロール全体 のメトリックと極 端には異ならない ≒ 近似でき る

Slide 25

Slide 25 text

カスタムメトリックの場合 25 25 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? 今在るホスト または最近退役した ホストの カスタムメトリック ≒ ロールメトリック 時系列 DB (diamond)

Slide 26

Slide 26 text

カスタムメトリックの場合 26 26 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? 今在るホスト または最近退役した ホストの カスタムメトリック ≒ ロールメトリック 時系列 DB (diamond) OK

Slide 27

Slide 27 text

書き込み負荷は大丈夫か? 27

Slide 28

Slide 28 text

28 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ロールグラフ用のカスタムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと ロールメトリックを 組み合はせて表示する 書き込み負荷は大丈夫か?

Slide 29

Slide 29 text

2021 年某日、負荷調査の爲に 一部のカスタムメトリックを ロールメトリックにも書き込み開始 29

Slide 30

Slide 30 text

30 時系列 DB (diamond) の使ふ Redis Cluster の cpu.engine が 100% に (※簡略表示してゐます)

Slide 31

Slide 31 text

時系列 DB (diamond) の仕組み 31 書き込み 讀み出し まづ Redis Cluster へ 書き込む 古い世代のメトリックを DynamoDB へ移す 更新されなくなった メトリックを DynamoDB へ 移す TTL の切れた メトリックを S3 へ 移す

Slide 32

Slide 32 text

時系列 DB (diamond) の仕組み 32 書き込み 讀み出し まづ Redis Cluster へ 書き込む 古い世代のメトリックを DynamoDB へ移す 更新されなくなった メトリックを DynamoDB へ 移す TTL の切れた メトリックを S3 へ 移す

Slide 33

Slide 33 text

時系列 DB (diamond) の仕組み Redis Cluster ● 複數臺の Redis node に key に從って data を分散 する ● key を x{y}z とすると y の所 (hash tag) だけを見 て保存する node を決める ○ 同時に讀み書きする data を同じ node に保存すると高 performence 33

Slide 34

Slide 34 text

34 (簡略表示してゐますが) cpu.engine が 100% にまで上がったのは 1 node だけ data が分散されず大きく偏った → node を増やしても解決しない

Slide 35

Slide 35 text

ロールメトリックの舊 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 ● オーガニゼーション : サービスはオーガニゼーションに屬する ● サービス : ロールはサービスに屬する ● ロール : ホストはロールに屬する ○ ホスト∈ロール∈サービス∈オーガニゼーション ● スロット番號 : ホストに對應する。ホストが退役するとロール內で再利用される 35

Slide 36

Slide 36 text

ロールメトリックの舊 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 數千臺ホストのあるサービスのカスタムメトリックが同じ Redis node に讀み書 きされる🔥 36

Slide 37

Slide 37 text

ロールメトリックの新 key の構造 {オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名 スロット番號はホストに對應するから、ホスト毎にカスタムメトリックを保存す る Redis node が決められる 37

Slide 38

Slide 38 text

ロールメトリックの新 key の構造 {オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名 Q. key の形を變へて大丈夫? A. ● Redis Cluster は 1 週閒程しかメトリックが保存されないので頑張って移行 できる ● DynamoDB へ移す前、ECS で讀み出した後に hash tag の {} を取り除くの で、Redis Cluster の外には影響しない 38

Slide 39

Slide 39 text

ロールメトリックの新 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 ↓ {オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名 39 移行しませう (長時閒の downtime 無しで)

Slide 40

Slide 40 text

ロールメトリックの新 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 ↓ {オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名 40 移行しませう (長時閒の downtime 無しで) How?

Slide 41

Slide 41 text

時系列 DB (diamond) の仕組み 41 まづ Redis Cluster へ 書き込む 古い世代のメトリックを DynamoDB へ移す 更新されなくなった メトリックを DynamoDB へ 移す Redis Cluster に觸るのはこの 3 箇所

Slide 42

Slide 42 text

時系列 DB (diamond) の仕組み 42 まづ Redis Cluster へ 書き込む 古いメトリックを DynamoDB へ移す (1 週閒程で) 讀み出し

Slide 43

Slide 43 text

移行手順 43

Slide 44

Slide 44 text

移行手順 44 もう 1 臺 Redis Cluster を立てる 舊 新

Slide 45

Slide 45 text

移行手順 45 舊 新 掃除だけする

Slide 46

Slide 46 text

移行手順 46 舊 新 新しい key で、ロール グラフ用のカスタムメ トリックも含めて書き 込む node 數を 調整する

Slide 47

Slide 47 text

移行手順 47 舊 新 merge して DynamoDB に移す

Slide 48

Slide 48 text

移行手順 48 舊 新 兩書き込み開始以後の data だけ になるまで 1 週閒超待った

Slide 49

Slide 49 text

移行手順 49 舊 新 新しい Redis Cluster を 本番として使ふ

Slide 50

Slide 50 text

移行手順 50 舊 新 掃除だけする

Slide 51

Slide 51 text

移行手順 51 舊 新 書き込みをやめる

Slide 52

Slide 52 text

移行手順 52 舊 新 掃除もやめる

Slide 53

Slide 53 text

移行手順 53 新 古い Redis Cluster を消 す

Slide 54

Slide 54 text

移行手順 54 新 OK

Slide 55

Slide 55 text

55 退役してもカスタムメトリック が見られる

Slide 56

Slide 56 text

56 退役してもカスタムメトリック が見られる Done