系统设计
系统设计
PG 扩展
透明自动分区特性
在时序数据的应用场景下,其记录数往往是非常庞大的,很容易就达到 数以
-
随着数据写入的不断增加,将时序数据表的数据分区存放,保证每一个分区的索引维持在一个较小规模,从而维持住写入性能
-
基于时序数据的查询场景,自动分区时以时序数据的时间戳为分区键,从而确保查询时可以快速定位到所需的数据分区,保证查询性能
-
分区过程对用户透明,从而达到
Auto-Scalability 的效果

在这个机制下
需要注意的是,
自适应算法的详细实现位于
借助透明化自动分区的特性,根据官方的测试结果,在同样的数据量级下,

面向时序场景的定制功能
time_bucket() 函数
该函数用于 降采样 查询时使用,通过该函数指定一个时间间隔,从而将时序数据按指定的间隔降采样,并辅以所需的聚合函数从而实现降采样查询。一个示例语句如下
SELECT time_bucket('5 minutes', time)
AS five_min, avg(cpu)
FROM metrics
GROUP BY five_min
ORDER BY five_min DESC LIMIT 10;
将数据点按
新增的聚合函数
为了提供对时序数据进行多样性地分析查询,
-
first() 求被聚合的一组数据中的第一个值 -
last() 求被聚合的一组数据中的最后一个值 -
histogram() 求被聚合的一组数据中值分布的直方图 -
drop_chunks() 删除指定时间点之前/ 之后的数据chunk. 比如删除三个月时间前的所有chunk 等等。这个接口可以用来类比InfluxDB 的Retention Policies 特性,但是目前TimescaleDB 尚未实现自动执行的chunk 删除。若需要完整的Retention Policies 特性,需要使用系统级的定时任务(如crontab )加上drop_chunks() 语句来实现。
SELECT drop_chunks(older_than => interval '3 months', newer_than => interval '4 months', table_name => 'conditions');
除此之外,
TimescaleDB 的存储机制

关于这套存储机制本身不用过多解释,毕竟
-
PG 存储的特征是 只增不改,即无论是数据的插入还是变更。体现在Heap Tuple 中都是Tuple 的Append 操作。因此这个存储引擎在用于OLTP 场景下的普通数据表时,会存在表膨胀问题;而在时序数据的应用场景中,时序数据正常情况下不会被更新或删除,因此可以避免表膨胀问题(当然,由于时序数据本身写入量很大,所以也可以认为海量数据被写入的情况下单表实际上仍然出现了膨胀,但这不是此处讨论的问题) 。 -
在原生的
PG 中,为了解决表膨胀问题,所以PG 内存在AUTOVACUUM 机制,即自动清理表中因更新/ 删除操作而产生的“Dead Tuple”,但是这将会引入一个新的问题,即AUTOVACUUM 执行时会对表加共享锁从而对写入性能的影响。但是在时序数据的应用场景中,由于没有更新/ 删除的场景,也就不会存在“Dead Tuple“,因此这样的Chunk 表就不会成为AUTOVACUUM 的对象,因此INSERT 性能便不会受到来自这方面的影响。
至于对海量数据插入后表和索引增大的问题,这正好通过上述的 自动分区 特性进行了规避。此外,由于