TDengine 时序数据库对数据文件有自己的命名规则,文件名中包含了vnodeID、时间范围、版本、文件类型等多种信息。了解数据文件命名规则,可以让运维工作更简单。
废话不多说,直接上图:
- v4:文件所属 Vgroup 组,该文件属于 Vgroup 4。
- f1833:FileID,该ID使用时间命名,为时间分片的初始时间点,ID=UnixTime/Duration。
[root@c2-125 ~]# echo "1833*864000"|bc
1583712000
[root@c2-125 ~]# date -d @1583712000 +'%Y-%m-%d %H:%M:%S'
2020-03-09 08:00:00
##Otherway
[root@c2-125 ~]# echo "1833*864000"|bc|awk '{print strftime("%Y-%m-%d",$1)}'
2020-03-09
f1833 表示存储 2023-03-09 至 2023-03-19 时间范围的数据(以上示例数据库 Duration 是10天[864000秒])。
TIPS:TDengine 是按照零时区进行的时间分片和本地时区设置无关。
- ver151:版本号,随文件更新而递增。
- data:文件类型。
TDengine 3.0 版本有如下文件类型:
- data 数据文件,存储时序数据
- head 头文件(索引文件):存储data文件中的数据分布信息。
- stt 临时文件:临时存储不满足落盘条件(minRows)的数据。
- sma 预计算文件:存储时序数据的预计算结果。
案例演示
下面我们对上述说法进行验证,验证步骤如下:
- 创建数据库
- 写入指定时间数据
- 让数据落盘
- 检查文件名称
1. 创建数据库
taos> show databases;
name |
=================================
information_schema |
performance_schema |
Query OK, 2 row(s) in set (0.001396s)
taos> create database db01 vgroups 1 duration 1d wal_retention_period 0;
Create OK, 0 row(s) affected (0.090438s)
taos> show databases;
name |
=================================
information_schema |
performance_schema |
db01 |
Query OK, 3 row(s) in set (0.001374s)
为方便展示将 vgroups 数量设置为 1,文件分片粒度 duration 设置为 1天,wal 保存时间设置为 0。
2. 写入指定时间数据
taos> use db01;
Database changed.
taos> create table t1(ts timestamp,v1 int);
Create OK, 0 row(s) affected (0.001026s)
taos> insert into t1 values('2023-05-01T00:00:00Z',1);
Insert OK, 1 row(s) affected (0.000884s)
taos> insert into t1 values('2023-05-01T00:00:01Z',2);
Insert OK, 1 row(s) affected (0.000697s)
taos> insert into t1 values('2023-05-01T00:00:03Z',3);
Insert OK, 1 row(s) affected (0.000729s)
taos> select * from t1;
ts | v1 |
========================================
2023-05-01 08:00:00.000 | 1 |
2023-05-01 08:00:01.000 | 2 |
2023-05-01 08:00:03.000 | 3 |
Query OK, 3 row(s) in set (0.016896s)
TIPS: 我在写入数据时采用的是 ISO8601 时间格式,指定时区为零时区。而我本地客户端设置的是东八区,因此显示的时间和我写入的时间相差 8 小时。
为保证写入数据时间的准确性,TDengine 建议采用 ISO8601 和 Epoch (Unix Time) 两种格式。
3. 数据落盘
taos> flush database db01;
Query OK, 0 row(s) affected (0.003168s)
4. 检查文件名称
检查文件名称前,我们先查看以下文件所属Vgroup
taos> show vgroups;
vgroup_id | db_name | tables | v1_dnode | v1_status | v2_dnode | v2_status | v3_dnode | v3_status | v4_dnode | v4_status | cacheload | cacheelements | tsma |
======================================================================================================================================================================================================
6 | db01 | 1 | 1 | leader | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 0 | 0 |
Query OK, 1 row(s) in set (0.002075s)
[root@c2-125 ~]# cd /var/lib/taos/vnode/vnode6/tsdb/
[root@c2-125 tsdb]# ll
total 8
drwxr-xr-x 2 root root 123 Oct 20 08:51 cache.rdb
-rwxrwxrwx 1 root root 135 Oct 20 08:57 current.json
-rwxrwxrwx 1 root root 4096 Oct 20 08:57 v6f19478ver1.stt
查看数据文件目录,可以看到里面只有 1 个 v6f19478ver1.stt 文件,因为刚才只写了 3 条数据,达不到落盘条件。
[root@c2-125 tsdb]# echo "19478*86400"|bc
1682899200
[root@c2-125 tsdb]# date -d @1682899200 +'%Y-%m-%d %H:%M:%S'
2023-05-01 08:00:00
做一下时间转换,显示该文件时间起始范围是 2023-05-01。
扩展
知道数据文件的命名规则可以帮助我们做哪些事情呢?
- 了解数据文件在硬盘上的分布。
- 了解进程在对哪些数据进行操作(lsof -p
pidof taosd
|grep REG) - 了解不同时间范围数据特征(如果stt文件较大,可能需要compact)
- …