Journal InTime


2014-06-30 (Mon) [長年日記]

_ InfluxDBの古いデータの削除

InfluxDBを試しているが、InfluxDBには今のところ古いデータを自動で削除する機能がない(対応予定はあるようだ)。

古いshardを丸ごと削除するのが効率がよいらしい(InfluxDBでは一定期間ごとにshardが作成される)ので、以下のようなcron用スクリプトを書いてみた。

require "influxdb"

USER = "root"
PASS = "root"
TTL = "1d"

def parse_ttl(ttl)
  case ttl
  when /\A(\d+)s\z/
    return $1.to_i
  when /\A(\d+)m\z/
    return 60 * $1.to_i
  when /\A(\d+)h\z/
    return 60 * 60 * $1.to_i
  when /\A(\d+)d\z/
    return 24 * 60 * 60 * $1.to_i
  else
    raise "invalid TTL - #{ttl}"
  end
end

secs_to_live = parse_ttl(TTL)
influxdb = InfluxDB::Client.new

for shard in influxdb.get_shard_list["shortTerm"]
  end_time = Time.at(shard["endTime"])
  if Time.now - end_time > secs_to_live
    influxdb.delete_shard(shard["id"], shard["serverIds"], USER, PASS)
  end
end

InfluxDBでは小文字で始まる名前のseriesは短期間(short term)、大文字で始まる名前のseriesは長期間(long term)と決まっているが、上記のスクリプトでは短期間のshardだけ削除するようにしている。

ただ、デフォルトでは各shardの期間が7日間になっているので、それよりも短い期間でshardを削除する場合は/opt/influxdb/shared/config.tomlの設定を以下のように変更しておく必要がある(この例では6時間に設定している)。

[sharding.short-term]
duration = "6h"

/opt/influxdb/current/config.tomlの方を変更しても反映されないので注意。

Tags: Ruby InfluxDB