可視化ツールに保存される時系列データの正確さ(RRDtool vs Graphite)

時系列データの可視化で使われる古参のツールに、RRDtoolというものがあります。これはCactiとかMuninとかで使われているので(Zabbixはなんか別らしい)、名前に聞き覚えはなくてもこういう感じのグラフはみたことある、という人もけっこういるでしょう。

が、最近は見た目のイケてなさを理由に、Graphite系のやつを使うひとが多いと思います。

そんな感じでGraphiteが優勢な世の中ですが、RRDtoolの方が正確だよ、という記事を見つけたので、読んで調べたことをメモ。

現実は甘くない、的な前置き

A time series is most often described as a sequence of (time, value) tuples [1]. The most naive method of recording a time series is to store timestamps as is. Since the data points might arrive at arbitrary and inexact intervals, to correlate the series with a particular point in time might be tricky.

データ点は観測時刻と観測値のペアであるかのように言われるけど、現実の観測データはけっこうずれまくって届くので、それを補正するいい方法考えないといけない。具体的には、いい感じに値を平均したりまとめたりします。

たとえば、以下のようなばらつきのある観測データがあったとします。上は時刻、下は観測値です。

0         10        20        30    time (seconds)
+.........+.........+.........+.....
|           |     |    |       |
0           50    10   30      30   data points

Whisperのデータ記録方法

Whisperというのは、Graphiteが使っているデータベースです。

Graphite simply changes the timestamp of the data point to the aligned one. If multiple data points arrive in the same step, then the last one “wins”.

ということで、単純に区間内で最後に記録された値が使われるだけです。結果は以下のようになるらしいです。

時刻0~10: N/A
時刻10~20: 10
時刻20~30: 30
時刻30~40: 30

RDDtoolのデータ記録方法

RRDtool keeps track of the last timestamp and calculates a weight for every incoming data point based on time since last update or beginning of the step and the step length.

RRDtoolは、測定頻度で重み付けをしてくれます。以下のようになります。

時刻0~10: 50×1 = 50
時刻10~20: 50×0.2 + 10×0.6 + 30×0.2 = 22
時刻20~30: 30×0.3 + 30×0.7 = 30
時刻30~40: N/A

こんな感じで、RRDtoolの方は積分値が変わらないようにしてます。この記事の2つ目の図が分かりやすかったです。

で?

なのでRRDtoolのほうがいい、とこの人が言うのには理由があって、

Back in my ISP days, we used data stored in RRDs to bill our customers.

だかららしいです。RRDに入ったデータでそのままチャリンチャリンするのか。。という気もしますけど。

ただ、RRDtoolが不便なのは、その観測区間が終わってさらに次の値が来るまで記録される値が確定しないことです。

上の例で言うと

時刻10~20: 50×0.2 + 10×0.6 + 30×0.2 = 22

この区間の値を出すのには、時刻10~20の観測値だけではだめで、時刻22の観測値まで見ないといけません。この例はデータを記録する間隔が短いのでいいですが、もっと間隔が長いデータだとけっこうな間待たされることになります。リアルタイムにグラフを観たいがためにF5連打するくらいならGraphite使えばいいと思います。

あと、計算された値しか保持しないので、通信時の障害で抜けたデータ点を後から入れたりすることはできません。Whisperは、そのへんが不満でつくられたものらしいです。

RRD is great, and initially Graphite did use RRD for storage. Over time though, we ran into several issues inherent to RRD's design. 1. RRD can't take updates for a timestamp prior to its most recent update. So for example, if you miss an update for some reason you have no simple way of back-filling your RRD file by telling rrdtool to apply an update to the past. Whisper does not have this limitation, and this makes importing historical data into Graphite way way easier (http://graphite.wikidot.com/whisper)

まあ、どっちがいいかと言われても、なんとも言えない感じですね…

感想

そもそもああいう可視化ツールって観測点をそのまま格納してくれないのかーと思ったのと、あと逆に、そもそもグラフ描くためのデータに色々求めすぎなんじゃないのか?という気もしました。大方の人はたぶん、なんかそれっぽいグラフを見れればいい気がするので、Graphiteでいいんじゃないっすかね。

(個人的にはPrometheus推しです)