rrdtool resize して、cactiのデータ保存期間を延長する

 2014-10-16
ストレージサイズが大きくなった昨今では、より大量のデータを保存してもコストは大したことがない。
せっかくなので長期にデータを保存し後で眺めてニヤニヤしたい。
 
cactiではrrdにてデータを保存しており、古いデータから上書きされ、粒度の大きなデータに置き換えられる。もっとも大きな粒度のデータも指定された総数を超えたものから順に上書きされる。

rrdでは指定された保存期間の中でデータをリングバッファ状に保存しており、 データサイズが際限なく膨れ上がることがない。 さらにデータの丸め込みに対応しており、より古いデータは、より粒度の大きなものを残すことでデータサイズの肥大化を抑えている。

cactiの初期値では下記の期間/粒度で保存するrrdファイルを生成する
  • 5分毎のデータを2日2時間
  • 30分毎のデータを14日14時間
  • 2時間毎のデータを64日14時間
  • 24時間毎のデータを2年67日

cactiの設定を変更する事でrrdの保存期間/粒度を変更できる。
しかし、すでに作成済みのrrdファイルは変更されないため、別途rrdtoolコマンドでrrdファイルを修正する必要がある。

step1. まずはcactiでの処理

webインターフェースからRRAの設定を変更する
Console->Data Sources->RAAsから、下記の項目のRowsをそれぞれ変更する
項目Rows
Daily (5 Minute Average)315360
Weekly (30 Minute Average)78840
Monthly (2 Hour Average)29565
Yearly (1 Day Average)3695
  • 5分毎のデータを3年間
  • 30分毎のデータを4.5年間
  • 2時間毎のデータを6.75年間
  • 24時間毎のデータを10.125年間
たとえば、5分毎だと ( 3[年] * 365[日] * 24[時] * 60[分] ) / 5[分毎] = 1576800 / 5 = 315360 を指定する感じ。
※cactiは(通常では)5分毎にしかデータを採取しないので、Hourly (1 Minute Average)を変更しても特に意味はない

上記の設定によってデータ保存期間は3年~10年となり、この設定をした後に作成するrrdはそのように作られる。
既存のrrdファイルは、別途次の手順で期間を延長してやる必要がある。(一度削除して作成し直すのが手っ取り早いが、現時点まで貯めたデータを消すことになる)

step2. rrdtoolでの処理

rrdtool resize <rrdファイル名> <対象rra番号>.rows GROW <増差分> というコマンドで既存のrrdファイルの保存期間を変更できる。
rra番号はrrdtool info で確認できる。
rrdファイルは、AVERAGE、MAX等のデータ種別、データ粒度別に複数のrraを含んでいることが普通。
GROWで指定するのが差分なので直感的に数字を指定しにくい&rra番号によって変わるため面倒すぎるのでshellscriptを自作して対応した。

これで安心・・・とはいかないのである。
rrdtoolでresizeしてデータ期間を延ばした場合、それまで存在していなかった期間のデータはNaNになる。

これがcacti(rrdtool系全般?)では嬉しくない事態を引き起こす。
データのレコードが存在し、データ自体はNaNの状態になるため、cactiでグラフ化するとその期間がデータなしとなる。
粒度の大きいレコードにはデータが残っていても、cacti(rrdtool系?)ではより粒度の小さいレコードを参照するため、グラフが描写されない。ガッカリ!

たとえば5日前のグラフを描写させたい場合、5分毎のデータはNaNになっており30分毎のデータはなんらかデータ残っていたとしても、5分毎のデータを参照してしまい、グラフが描写されない。


粒度の大きな残されたデータを、延長した粒度の小さいレコードへコピーしてやればグラフは描写されるようになる。
これをうまいことやってくれる手法を探したが見つからなかったためperlで自作した。これでようやく既存rrdファイルの保存期間延長(&延長部分の既存データのグラフ表示)が出来るようになる。

step2-1. rrd データ保存期間延長

rrdextend.sh
zshで動くように作ってあるがちょっと変えればbashでもいけるかもしれない。
引数にrrdファイルを指定する。
データの保存期間をファイル内に記載する。とりあえず先述の通り5分毎を3年間保存する設定にした。それ以降の粒度は1.5倍増しの期間を設定するようにした。
################
# settings
extended_year=3 # extended value for "pdp_per_row" is 1
extended_month=0 # extended value for "pdp_per_row" is 1
extended_day=0 # extended value for "pdp_per_row" is 1
extended_hour=0 # extended value for "pdp_per_row" is 1
step_extend_num=1.5 # coefficient num for next "php_per_row"
# end settings
################

# ex.
# extended_year=3 month,day,hour=0
# step_extend_num=1.5
# then
# 5mins data : 3 years hold
# 30mins data : 4.5 years hold
# 2hours data : 6.75 years hold
# 24hours data : 10.125 years hold
# (rrd step=300sec)

# ex.
# extended_year=3 month,day,hour=0
# step_extend_num=1
# then
# all data spans : 3 years hold

念のためrrdファイルのバックアップを取ってから作業すると安全。
user$ cd <cacti_dir>/
user$ tar czvf rra_backup.tgz ./rra

cactiユーザで実行したいときはsudo -u cactiを使う。
findでrrdファイルを見つけてshellscriptに渡すと便利。
user$ sudo -u cacti find ./rra -iname "*.rrd" -exec rrdextend.sh {} \;
rrdtool resize ./raspberrypi_load_1min_69.rrd ... ok
rrdtool resize ./raspberrypi_mem_free_74.rrd ... ok
rrdtool resize ./localhost_hdd_free_121.rrd ... ok
rrdtool resize ./localhost_hdd_free_120.rrd ... ok
rrdtool resize ./localhost_snmp_oid_20.rrd ... ok
<省略>
rrdtool infoやcactiでrrdファイルとして問題ないものが生成されたことを確認しておく。(なんかエラーが出なければおっけーでしょう)

step2-2. rrdデータ展開

rrdspread.pl
基本的な使い方はrrdextend.shと同じ。
設定項目はrrdtoolコマンドへのpathを入れておくくらい。pathが通っているならコマンド名だけでok
################  
# settings
our $RRDTOOL="rrdtool";
# end settings
################

同じく、cactiユーザで実行したいときは(略
user$ sudo -u cacti find ./rra -iname "*.rrd" -exec perl rrdspread.pl {} \;
rrdtool dump : ./raspberrypi_load_1min_69.rrd --> ./raspberrypi_load_1min_69.rrd_xml ... done
read dumpfile : ./raspberrypi_load_1min_69.rrd_xml ... done
data collectiong : ./raspberrypi_load_1min_69.rrd_xml ... done
spread & output : ./raspberrypi_load_1min_69.rrd_sprd ... done
rrdtool restore : ./raspberrypi_load_1min_69.rrd_sprd --> ./raspberrypi_load_1min_69.rrd_new ... done
rrd file backup : ./raspberrypi_load_1min_69.rrd --> ./raspberrypi_load_1min_69.rrd_BAK ... done
rrd file swap : ./raspberrypi_load_1min_69.rrd_new --> ./raspberrypi_load_1min_69.rrd ... done
delete temporary : ./raspberrypi_load_1min_69.rrd_xml ... done
delete temporary : ./raspberrypi_load_1min_69.rrd_sprd ... done
rrdtool dump : ./raspberrypi_mem_free_74.rrd --> ./raspberrypi_mem_free_74.rrd_xml ... done
read dumpfile : ./raspberrypi_mem_free_74.rrd_xml ... done
<省略>

結果

無事にcactiでデータ粒度の境目がグラフに表示されるようになった。
graph.png

掲載したshellscriptやperlはいずれも私の環境では一見するとうまく動いた。
それ以上のデバッグはしていないのでもし使用される場合は各々方で修正してみてくだちい。
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/177-6d18905b
≪ トップページへこのページの先頭へ  ≫