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

メトリックはいかにして見え續ける樣になったか #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

    View Slide

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

    View Slide

  3. Mackerel とは?
    3

    View Slide

  4. 4

    View Slide

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

    View Slide

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

    View Slide

  7. 7

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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
    最近のホストを集
    めればロール全体
    のメトリックと極
    端には異ならない
    ≒ 近似でき

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. ロールメトリックの新 key の構造
    {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名

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

    View Slide

  40. ロールメトリックの新 key の構造
    {オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名

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

    View Slide

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

    View Slide

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

    View Slide

  43. 移行手順
    43

    View Slide

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


    View Slide

  45. 移行手順
    45


    掃除だけする

    View Slide

  46. 移行手順
    46


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

    View Slide

  47. 移行手順
    47


    merge して
    DynamoDB に移す

    View Slide

  48. 移行手順
    48


    兩書き込み開始以後の data だけ
    になるまで 1 週閒超待った

    View Slide

  49. 移行手順
    49


    新しい Redis Cluster を
    本番として使ふ

    View Slide

  50. 移行手順
    50


    掃除だけする

    View Slide

  51. 移行手順
    51


    書き込みをやめる

    View Slide

  52. 移行手順
    52


    掃除もやめる

    View Slide

  53. 移行手順
    53

    古い Redis Cluster を消

    View Slide

  54. 移行手順
    54

    OK

    View Slide

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

    View Slide

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

    View Slide