正文
分布式计算是一种计算方法,与之相对的是集中式计算,是通过使用多个计算资源在分布式的环境中并发执行计算的方法。在时序数据库领域,随着数据的增长,时序数据会越来越多,单机的存储、查询和聚合分析 IO 时间成本非常高,虽然使用更加高效的硬件也能够缓解,但是有处理上限,基于成本等因素的考虑,分布式聚合查询仍然是时序数据库自然而然的选择。
当时序数据库存储的数据越来越多时,聚合查询不可避免,这也是 OLAP 分析查询中最常见操作之一,使用预处理可以提高查询性能,但是不够灵活。分布式聚合计算则是能够使用分布式的特性,通过多个计算资源并行计算,再对结果进行合并返回,通过并发提高聚合查询性能。
时序数据的分布式聚合计算需要多个节点并行计算,逻辑上也是一个 Map/Reduce 的过程,Map 过程需要对原始时序数据进行分片,分别聚合计算。Reduce 过程则是对多个分片计算结果的合并。往往聚合运算的结果和原始数据有着明显数据量的差距,其次分布式计算可以更多的考虑数据的本地化,因此使用分布式聚合计算显然能够有效提高查询性能。
时序数据要进行分布式计算需要解决两个基本问题:时序数据计算分片以及计算结果的合并。
时序数据聚合计算的分片可以分为几个维度考虑:存储分片、聚合函数时间窗口以及查询条件。
首先,时序数据聚合查询包含多种条件,对时序数据进行分组聚合查询也是一种常用查询,不同的分组原始时序数据不同,因此可以通过查询分组对时序数据计算进行分片,不同的分组使用不同节点并发计算。
其次,时序数据聚合查询函数通常都包含时间窗口,相同时间窗口的原始数据聚合计算为一个数据点,不同的时间窗口用于计算的时序原始数据不同,因此也同样可以通过时间窗口对时序数据计算进行时间维度的分片,不同的节点计算不同时间窗口的数据。
第三,按照存储分片进行计算。我们先来回忆一下前文说描述的时序数据的存储,时序数据由于存储的数据量很大,单机并不能满足需求,因此需要对时序数据进行分片存储,分片 (shard) 通常使用 metric+tags 的方式进行,不同的分片存储在不同的存储节点,分片存储着原始时序数据,使用存储分片进行分片计算,也是一种自然而然的选择。如下图先对 shard 进行分片计算查询,最后对结果进行合并。