关于influxdb:InfluxDB-Retention-Policy解析

69次阅读

共计 3699 个字符,预计需要花费 10 分钟才能阅读完成。

Retention Policy(RP)是数据保留工夫策略,超过了肯定的工夫后,老的数据会被主动删除。

联合 CQ(Continuous Query)和 RP,能够将历史数据保留为低精度,最近的数据保留为高精度,以升高存储用量。

RP 的语法结构:

CREATE RETENTION POLICY <retention_policy_name> 
ON <database_name> 
DURATION <duration> 
REPLICATION <n> 
[SHARD DURATION <duration>] 
[DEFAULT]

其中:

  • duration 指定了数据保留的工夫,当超过了这个工夫后,数据被主动删除;
  • replication 指定每个 shard 的正本数,默认为 1,集群场景须要 >=2;
  • shard duration 实际上指定每个 shardGroup 保留数据的工夫长度,能够不传入,零碎会依据 duration 主动计算一个值;
  • default 指定是否默认的 RP,若 RP 为默认,创立 database 未指定 RP 时,就应用默认的 RP;

influxdb 内置了一个默认策略 autogen:

  • duration=0s 示意永不过期;
  • shardGroupDuration=168h 示意 1 个 shardGroup 保留 7 天的数据;
> show retention policies;
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

shardGroup vs shard:

  • shardGroup 蕴含若干个 shard;
  • shardGroup 指定保留 1 段时间的数据,shardGroup 下所有 shard 的数据都位于这个工夫范畴内;

看一下单机版 influxdb,rp=autogen,replica= 1 的 shards 状况:

> show shard groups;
name: shard groups
id database  retention_policy start_time           end_time             expiry_time
-- --------  ---------------- ----------           --------             -----------
25 falcon    autogen          2020-04-27T00:00:00Z 2020-05-04T00:00:00Z 2020-05-04T00:00:00Z
33 falcon    autogen          2020-05-04T00:00:00Z 2020-05-11T00:00:00Z 2020-05-11T00:00:00Z
42 falcon    autogen          2020-05-11T00:00:00Z 2020-05-18T00:00:00Z 2020-05-18T00:00:00Z
51 falcon    autogen          2020-05-18T00:00:00Z 2020-05-25T00:00:00Z 2020-05-25T00:00:00Z
60 falcon    autogen          2020-05-25T00:00:00Z 2020-06-01T00:00:00Z 2020-06-01T00:00:00Z
69 falcon    autogen          2020-06-01T00:00:00Z 2020-06-08T00:00:00Z 2020-06-08T00:00:00Z
78 falcon    autogen          2020-06-08T00:00:00Z 2020-06-15T00:00:00Z 2020-06-15T00:00:00Z

每个 shardGroup 保留 7day 的数据,1 个 shardGroup 蕴含 1 个 shard:

> show shards;
name: falcon
id database retention_policy shard_group start_time           end_time             expiry_time          owners
-- -------- ---------------- ----------- ----------           --------             -----------          ------
25 falcon   autogen          25          2020-04-27T00:00:00Z 2020-05-04T00:00:00Z 2020-05-04T00:00:00Z
33 falcon   autogen          33          2020-05-04T00:00:00Z 2020-05-11T00:00:00Z 2020-05-11T00:00:00Z
42 falcon   autogen          42          2020-05-11T00:00:00Z 2020-05-18T00:00:00Z 2020-05-18T00:00:00Z
51 falcon   autogen          51          2020-05-18T00:00:00Z 2020-05-25T00:00:00Z 2020-05-25T00:00:00Z
60 falcon   autogen          60          2020-05-25T00:00:00Z 2020-06-01T00:00:00Z 2020-06-01T00:00:00Z
69 falcon   autogen          69          2020-06-01T00:00:00Z 2020-06-08T00:00:00Z 2020-06-08T00:00:00Z
78 falcon   autogen          78          2020-06-08T00:00:00Z 2020-06-15T00:00:00Z 2020-06-15T00:00:00Z

1. 如何确定 1 个 shardGroup 蕴含几个 shard?

// replicaN 是创立 RP 时指定的正本数
shardN := len(data.DataNodes) / replicaN

若有 3 个数据节点,每个 shard 2 正本,那么每个 shardGroup 下只有 3 /2= 1 个 shard;

2. 写入时序数据时,先依据工夫确定存入哪个 shardGroup,那如何确定数据放入哪个 shard?

写入的时序数据,计算时序数据的 hash,而后 hash % shardN 后,决定放入哪个 shard;

// HashID returns a non-cryptographic checksum of the point's key.
func (p *point) HashID() uint64 {h := NewInlineFNV64a()
    h.Write(p.key)        //p.key 是 measurement+tags
    sum := h.Sum64()
    return sum
}
func (sgi *ShardGroupInfo) ShardFor(hash uint64) ShardInfo {return sgi.Shards[hash%uint64(len(sgi.Shards))]
}

每个 shard 对应 OS 上的一个目录,目录名称是 shardId,递增的整数:

/var/lib/influxdb/data/mydatabase/six_month # ls -alh
total 0
drwx------    6 root     root          42 Sep  6 08:00 .
drwx------    4 root     root          38 Sep  3 14:59 ..
drwxr-xr-x    3 root     root          68 Sep  6 08:41 1
drwxr-xr-x    3 root     root          68 Sep  3 16:48 3
drwxr-xr-x    3 root     root          68 Sep  3 17:02 4
drwxr-xr-x    3 root     root          68 Sep 15 09:59 6

shard 所在目录:datapath/database/retentionPolicy/shardId

func (s *Store) CreateShard(database, retentionPolicy string, shardID uint64, enabled bool) error {
    ......
    path := filepath.Join(s.path, database, retentionPolicy, strconv.FormatUint(shardID, 10))
    shard := NewShard(shardID, path, walPath, sfile, opt)
    ......
}

3. 默认 shardGroupDuration 的计算方法:

shardGroup duration 若未指定,influxdb 会依据 duration 计算一个,计算方法:

RP’s DURATION shardGroup duration
<2day 1h
>=2day and <=6month 1day
>6month 7day

计算方法的实现代码:

// shardGroupDuration returns the duration for a shard group based on a policy duration.
func shardGroupDuration(d time.Duration) time.Duration {
    if d >= 180*24*time.Hour || d == 0 { // 6 months or 0
        return 7 * 24 * time.Hour
    } else if d >= 2*24*time.Hour { // 2 days
        return 1 * 24 * time.Hour
    }
    return 1 * time.Hour
}

正文完
 0