连续查询内部机制 - 第二部分
作者:Jimmy Guerrero / 产品
2015年11月10日
导航至
InfluxDB中,连续查询允许您预先计算并存储查询结果,以便在需要时使用,而不会过载您的数据库。在本系列的第一部分中,我们介绍了连续查询的基本知识和应用场景。在这一部分中,我们将进一步探讨InfluxDB中连续查询的执行方式。
那么,让我们开始吧...
连续查询执行服务
要执行查询,无论是连续的还是非连续的,数据库都需要有一个执行引擎。在InfluxDB内部,连续查询的执行由一个名为“连续查询器”的后台服务在幕后处理。此服务模仿了您坐在键盘前不断执行查询的体验。查询器服务由数据库引擎启动,并等待创建连续查询。
可以使用CREATE CONTINUOUS QUERY
语句创建连续查询。在连续查询存储之前,它会被解析并进行语法验证,以确保它是一个有效的连续查询。如果一切顺利,与查询相关的元数据将存储在集群范围内的数据库元存储中,该存储对所有集群中的服务器都是可访问的。
安排连续查询执行
为了执行连续查询,查询器服务会遍历所有数据库,从元存储中读取连续查询,并逐一检查它们是否需要执行。这个操作由查询器服务每秒重复一次。
一旦查询器服务找到需要执行的连续查询,它将根据查询中指定的分组间隔来决定查询执行的频率。
首先,使用以下公式估计执行间隔:
computeEvery = (group-by-time/ compute-runs-per-interval)
用户在查询中指定的分组间隔除以compute-runs-per-interval(当前和前一个间隔将计算的次数)。默认情况下,compute-runs-per-interval的值配置为10。
例如,如下所示,如果我们有一个具有10分钟分组间隔的连续查询,compute-runs-per-interval设置为10,compute-no-more-than设置为1分钟。
查询将每分钟计算一次,在10分钟查询间隔中将有10次运行。
接下来,如果计算出的执行间隔比配置中指定的最大频率(compute-no-more-than)更频繁,则执行间隔将被最大频率值覆盖。如果连续查询的分组间隔短于compute-no-more-than设置,则使用recompute-previous-n设置。
例如,如下所示,如果我们有一个具有5分钟分组间隔的连续查询,compute-runs-per-interval设置为10,compute-no-more-than设置为1分钟。
查询将每分钟计算一次(而不是每1.5分钟计算一次),在5分钟查询间隔中将有5次运行。
验证、运行和写入结果
当创建连续查询时,会从查询的into子句中提取测量和保留策略并进行验证。验证后,执行查询,并将输出结果写入到磁盘上指定的测量中。如果未指定测量保留策略,则将测量写入数据库的默认保留策略。
使用连续查询,InfluxDB会自动重新计算滞后数据的情况。这在数据流滞后或写入历史数据时很有用。在第一次运行写入通过后,执行服务将重新执行连续查询,直到最近的周期,最多到配置设置中指定的最大间隔设置(recompute-no-older-than
)。通常,此设置必须至少与到达的最不匹配时间戳一样旧,否则数据将不包含在降采样中。
结论
今天,我们介绍了如何在InfluxDB内部执行连续查询。请继续关注本系列博客的最后一部分,了解如何监控和故障排除您的连续查询。
在此之前,我们邀请您免费试用14天的托管InfluxDB + Grafana(https://customers.influxdb.com/),希望您开始使用InfluxDB为您的应用程序。