2021年9月13日にカスタムメトリックが強化されたMackerel。2つの大きな困難をどう乗り越えカスタムメトリック強化を実現したのかご紹介します。
發表動畫 : https://www.youtube.com/watch?v=D6Ie8Q-cdBw
メトリックはいかにして見え續ける樣になったか.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)2022/07 DevelopersIO 20221
View Slide
.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)id:ne-sachirou @ 株式会社はてなMackerel のアプリケーションエンジニアcurl -sI https://mackerel.io | grep X-Recruitment2
Mackerel とは?3
4
5メトリックホストグラフ
6メトリックロールグラフメトリック
7
2021/09/13 以前8退役したホストのメトリックは見られなくなる(※カスタムメトリックのみ)
2021/09/13 以後9退役してもカスタムメトリックが見られる
2021/09/13 以後10退役してもカスタムメトリックが見られるHow?
11mackerel-agentpluginシステムメトリックカスタムメトリック
12時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックホストメトリックとロールメトリックを組み合はせて表示する
13時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックカスタムメトリックは?ホストメトリックとロールメトリックを組み合はせて表示する
14時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックカスタムメトリックは?ホストメトリックとロールメトリックを組み合はせて表示する(代案を比較した結果)カスタムメトリックもシステムメトリックと同じ樣に保存しよう
15時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックロールグラフ用のカスタムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックホストメトリックとロールメトリックを組み合はせて表示する
いかにしてホストメトリックとロールメトリックをうまく組み合はせるか?16
17時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックロールグラフ用のカスタムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックホストメトリックとロールメトリックを組み合はせて表示するHow?
システムメトリックの場合18ロールメトリック今在るホストのホストメトリック今在るホストは?どんなロールメトリックが在る?時系列 DB(diamond)
システムメトリックの場合19ロールメトリック今在るホストのホストメトリック今在るホストは?どんなロールメトリックが在る?時系列 DB(diamond)對應する對應する
システムメトリックの場合20ロールメトリック今在るホストのホストメトリック今在るホストは?どんなロールメトリックが在る?時系列 DB(diamond)ユーザーが増やせる仕組みでない
21ロールID ロールメトリック名0 custom.a.21 custom.b.1… …ホストID ホストメトリック名1 custom.a.11 custom.b.1ロール追加退役ホストID ホストメトリック名0 custom.a.10 custom.a.2
カスタムメトリックの場合2222今在るホストのホストメトリック今在るホストは?時系列 DB(diamond)
カスタムメトリックの場合2323今在るホストのホストメトリック今在るホストは?どんなロールメトリックが在る?時系列 DB(diamond)どんなロールメトリックが在るかわからない
24ロールID ロールメトリック名0 custom.a.21 custom.b.1… …ホストID ホストメトリック名1 custom.a.11 custom.b.1ロール追加退役ホストID ホストメトリック名0 custom.a.10 custom.a.2最近のホストを集めればロール全体のメトリックと極端には異ならない≒ 近似できる
カスタムメトリックの場合2525ロールメトリック今在るホストのホストメトリック今在るホストは?今在るホストまたは最近退役したホストのカスタムメトリック≒ ロールメトリック時系列 DB(diamond)
カスタムメトリックの場合2626ロールメトリック今在るホストのホストメトリック今在るホストは?今在るホストまたは最近退役したホストのカスタムメトリック≒ ロールメトリック時系列 DB(diamond)OK
書き込み負荷は大丈夫か?27
28時系列 DB(diamond)メトリックロールグラフ用のシステムメトリックロールグラフ用のカスタムメトリックホストグラフ用のシステムメトリックホストグラフ用のカスタムメトリックホストメトリックとロールメトリックを組み合はせて表示する書き込み負荷は大丈夫か?
2021 年某日、負荷調査の爲に一部のカスタムメトリックをロールメトリックにも書き込み開始29
30時系列 DB (diamond) の使ふ Redis Cluster のcpu.engine が 100% に(※簡略表示してゐます)
時系列 DB (diamond) の仕組み31書き込み讀み出しまづ Redis Cluster へ書き込む古い世代のメトリックをDynamoDB へ移す更新されなくなったメトリックを DynamoDB へ移すTTL の切れたメトリックを S3 へ移す
時系列 DB (diamond) の仕組み32書き込み讀み出しまづ Redis Cluster へ書き込む古い世代のメトリックをDynamoDB へ移す更新されなくなったメトリックを DynamoDB へ移すTTL の切れたメトリックを S3 へ移す
時系列 DB (diamond) の仕組みRedis Cluster● 複數臺の Redis node に key に從って data を分散する● key を x{y}z とすると y の所 (hash tag) だけを見て保存する node を決める○ 同時に讀み書きする data を同じ node に保存すると高performence33
34(簡略表示してゐますが)cpu.engine が 100% にまで上がったのは 1 node だけdata が分散されず大きく偏った → node を増やしても解決しない
ロールメトリックの舊 key の構造{オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名● オーガニゼーション : サービスはオーガニゼーションに屬する● サービス : ロールはサービスに屬する● ロール : ホストはロールに屬する○ ホスト∈ロール∈サービス∈オーガニゼーション● スロット番號 : ホストに對應する。ホストが退役するとロール內で再利用される35
ロールメトリックの舊 key の構造{オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名數千臺ホストのあるサービスのカスタムメトリックが同じ Redis node に讀み書きされる🔥36
ロールメトリックの新 key の構造{オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名スロット番號はホストに對應するから、ホスト毎にカスタムメトリックを保存する Redis node が決められる37
ロールメトリックの新 key の構造{オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名Q. key の形を變へて大丈夫?A.● Redis Cluster は 1 週閒程しかメトリックが保存されないので頑張って移行できる● DynamoDB へ移す前、ECS で讀み出した後に hash tag の {} を取り除くので、Redis Cluster の外には影響しない38
ロールメトリックの新 key の構造{オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名↓{オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名39移行しませう (長時閒の downtime 無しで)
ロールメトリックの新 key の構造{オーガニゼーションID.r.1.サービスID}.ロールID.スロット番號.メトリック名↓{オーガニゼーションID.r.1.サービスID.ロールID.スロット番號}.メトリック名40移行しませう (長時閒の downtime 無しで)How?
時系列 DB (diamond) の仕組み41まづ Redis Cluster へ書き込む古い世代のメトリックをDynamoDB へ移す更新されなくなったメトリックを DynamoDB へ移すRedis Cluster に觸るのはこの 3 箇所
時系列 DB (diamond) の仕組み42まづ Redis Cluster へ書き込む古いメトリックをDynamoDB へ移す(1 週閒程で)讀み出し
移行手順43
移行手順44もう 1 臺 Redis Clusterを立てる舊新
移行手順45舊新掃除だけする
移行手順46舊新新しい key で、ロールグラフ用のカスタムメトリックも含めて書き込むnode 數を調整する
移行手順47舊新merge してDynamoDB に移す
移行手順48舊新兩書き込み開始以後の data だけになるまで 1 週閒超待った
移行手順49舊新新しい Redis Cluster を本番として使ふ
移行手順50舊新掃除だけする
移行手順51舊新書き込みをやめる
移行手順52舊新掃除もやめる
移行手順53新古い Redis Cluster を消す
移行手順54新OK
55退役してもカスタムメトリックが見られる
56退役してもカスタムメトリックが見られるDone