$30 off During Our Annual Pro Sale. View Details »

メトリックはいかにして見え續ける樣になったか #devio2022

メトリックはいかにして見え續ける樣になったか #devio2022

2021年9月13日にカスタムメトリックが強化されたMackerel。2つの大きな困難をどう乗り越えカスタムメトリック強化を実現したのかご紹介します。

發表動畫 : https://www.youtube.com/watch?v=D6Ie8Q-cdBw

さっちゃん

July 28, 2022
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

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

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

    https://mackerel.io | grep X-Recruitment 2
  3. Mackerel とは? 3

  4. 4

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

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

  7. 7

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

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

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

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

  12. 12 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと ロールメトリックを

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

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

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

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

  17. 17 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ロールグラフ用のカスタムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと

    ロールメトリックを 組み合はせて表示する How?
  18. システムメトリックの場合 18 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列

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

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

    DB (diamond) ユーザーが 増やせる 仕組みでない
  21. 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
  22. カスタムメトリックの場合 22 22 今在るホストの ホストメトリック 今在るホストは? 時系列 DB (diamond)

  23. カスタムメトリックの場合 23 23 今在るホストの ホストメトリック 今在るホストは? どんな ロールメトリック が在る? 時系列

    DB (diamond) どんなロールメト リックが在るかわ からない
  24. 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 最近のホストを集 めればロール全体 のメトリックと極 端には異ならない ≒ 近似でき る
  25. カスタムメトリックの場合 25 25 ロールメトリック 今在るホストの ホストメトリック 今在るホストは? 今在るホスト または最近退役した ホストの

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

    カスタムメトリック ≒ ロールメトリック 時系列 DB (diamond) OK
  27. 書き込み負荷は大丈夫か? 27

  28. 28 時系列 DB (diamond) メトリック ロールグラフ用のシステムメトリック ロールグラフ用のカスタムメトリック ホストグラフ用のシステムメトリック ホストグラフ用のカスタムメトリック ホストメトリックと

    ロールメトリックを 組み合はせて表示する 書き込み負荷は大丈夫か?
  29. 2021 年某日、負荷調査の爲に 一部のカスタムメトリックを ロールメトリックにも書き込み開始 29

  30. 30 時系列 DB (diamond) の使ふ Redis Cluster の cpu.engine が

    100% に (※簡略表示してゐます)
  31. 時系列 DB (diamond) の仕組み 31 書き込み 讀み出し まづ Redis Cluster

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

    へ 書き込む 古い世代のメトリックを DynamoDB へ移す 更新されなくなった メトリックを DynamoDB へ 移す TTL の切れた メトリックを S3 へ 移す
  33. 時系列 DB (diamond) の仕組み Redis Cluster • 複數臺の Redis node

    に key に從って data を分散 する • key を x{y}z とすると y の所 (hash tag) だけを見 て保存する node を決める ◦ 同時に讀み書きする data を同じ node に保存すると高 performence 33
  34. 34 (簡略表示してゐますが) cpu.engine が 100% にまで上がったのは 1 node だけ data

    が分散されず大きく偏った → node を増やしても解決しない
  35. ロールメトリックの舊 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 • オーガニゼーション : サービスはオーガニゼーションに屬する • サービス

    : ロールはサービスに屬する • ロール : ホストはロールに屬する ◦ ホスト∈ロール∈サービス∈オーガニゼーション • スロット番號 : ホストに對應する。ホストが退役するとロール內で再利用される 35
  36. ロールメトリックの舊 key の構造 {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名 數千臺ホストのあるサービスのカスタムメトリックが同じ Redis node に讀み書 きされる🔥 36

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

  38. ロールメトリックの新 key の構造 {オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名 Q. key の形を變へて大丈夫? A. • Redis

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

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

    無しで) How?
  41. 時系列 DB (diamond) の仕組み 41 まづ Redis Cluster へ 書き込む

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

    古いメトリックを DynamoDB へ移す (1 週閒程で) 讀み出し
  43. 移行手順 43

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

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

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

    node 數を 調整する
  47. 移行手順 47 舊 新 merge して DynamoDB に移す

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

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

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

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

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

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

  54. 移行手順 54 新 OK

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

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