前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何查询InfluxDB

如何查询InfluxDB

作者头像
大数据弄潮儿
修改于 2018-05-21 08:41:18
修改于 2018-05-21 08:41:18
11.4K10
代码可运行
举报
文章被收录于专栏:大数据大数据
运行总次数:0
代码可运行

InfluxDB是一个很流行的基于时间序列的数据库,下面是这个数据库的最基本的查询命令。InfluxDB使用类SQL(实际上它就是一种特殊的“SQL”)的语言。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM "foodships" WHERE time > now() - 1h

一开始InfluxDB就支持这种类SQL语言,所以它也同时兼备了这类语言的优缺点:

  1. 对于新用户来说很容易用他们掌握的语言与数据库进行交互。SQL很流行,所以许多开发人员都会使用。这种查询语法对InfluxDB的早期发展很有帮助。
  2. 正如我之前所说的,InfluxQL是一种“类SQL”的语言。编写SQL查询语言不是一件简单的工作。其中一个问题就是DBA包含了一些SQL的预期设计,但是我们的语言与SQL并不完全兼容。这就造成了许多无法令人头疼的问题
  3. 时间序列数据库的特点之一是读写可以同时进行。这其实也是这类数据库的必备特性。你的物联网设备或服务器一直在写入数据,而与此同时仪表板,分析工具和警报管理器将从数据库读取数据。InfluxDB需要更好的可扩展性。
  4. 如果相同时刻存储引擎和查询语言都在同一个项目中,这会阻碍我们想要的代码的快速迭代功能。与存储引擎相比,查询语言更快地优化。引擎需要稳定性,而查询语言需要的更多的是功能和性能。
  5. InfluxQL需要重新进行架构,因为开发者团队无法保证满足社区里面千奇百怪的想法。
  6. 现在的话,SQL学习起来非常简单,但我们的栈中还有另一个DSL可采用:从Kapacitor使用的TICK脚本发送警报并对缩减你的系列样本。
  7. InfluxQL没有数学函数库,因为语言不允许我们用简单的方式添加数据。而使用IFQL,我们却很容易实现它们。

在旧金山的InfluxDays期间,InfluxData的首席技术官兼创始人Paul Dix发布了一种新的开源查询语言,其数据分析与InfluxDB很接近。我们称之为IFQL

架构

代码语言:typescript
AI代码解释
复制
var cpu = select(db: "telegraf")
  .filter(exp:{"_measurement" == "cpu" and "_field" == "usage_user"})
  .range(start: -30m)
  
select(db: "telegraf")
  .filter(exp:{"_measurement" == "mem" and "_field" == "used_percent"})
  .range(start: -30m)
  .join(on:["host"], eval:{$ + cpu})

IFQL不只是一种查询语言。它还包含有一个解析器,可以读取上面的查询,并生成一个可视化为JSON,然后通过IFQL直接运行。这意味着你所看到的语法只是其中一种可能的实现。真正重要的部分是在设计和处理器之间。

这个项目的架构和思想让我们可以在IFQL AST之上重新实现InfluxQL和PromQL,TICK Script。除此之外,如果你有你的查询构建器或者你需要创建一个自定义的实现来与InfluxDB交互,你可以简单地将JSON推送到IFQL。这的确很令人很意外。

IFQL的设计是可扩展的,为了实现这个特性 - 我们从Telegraf项目学到了深刻的教训。你需要一个简单的接口和一个接入点,这样开发人员才会很乐意为你的项目做出贡献。这就是为什么IFQL有一个叫做函数目录的原因。它包含当前支持的所有函数,并且希望添加功能的贡献者只在该目录中添加函数。

TICK Script和IFQL

IFQL的目的之一是能够提供TICK Script提供的所有功能,这样我们就能够在不学习两种语言的情况下进行查询,操作和发送警报。

目前,我们已经将两个项目中函数复制了,这样我们就可以通过IFQL再次使用它们。

目前,IFQL是GitHub上的一个独立项目。除了解析器和设计器之外,它还提供了一个简单的名叫 ifqld的http后台程序,用于进行一些测试。

IFQL仍处于测试阶段,这意味着API和查询语法可能将会更改,但它设置起来非常简单。我将使用Docker来举个例子,如果您不熟悉Docker,则可以在此处下载IFQL的安装包 。

我们先从IFQL存储库下载一个InfluxDB配置文件:

代码语言:html
AI代码解释
复制
wget https://raw.githubusercontent.com/influxdata/ifql/master/docker-compose.yml
mkdir examples
wget https://raw.githubusercontent.com/influxdata/ifql/master/examples/influxdb.conf -O examples/influxdb.conf

主要区别在于后者支持IFQL的段落:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ifql]
  enabled = true
  log-enabled = true
  bind-address = ":8082"

InfluxDB使用端口8082与IFQL的gRPC进行通信。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up

如您所见,我们创建了一个网络并部署了两个容器。一个是InfluxDB,我们修改了配置,并暴露了8082和8086端口。第二个是IFQL v0.0.2。它使用了端口8093,我们可以通过运行一个简单的curl来验证一切是否正常工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
15:21 $ curl -I http://localhost:8093/
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Tue, 28 Nov 2017 14:21:40 GMT
Content-Length: 19

现在让我们用一些示例数据填充我们的数据库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
influx
use NOAA_water_database
SELECT COUNT(*) FROM NOAA_water_database
> SELECT COUNT(*) FROM h2o_feet
name: h2o_feet
time count_level description count_water_level
---- ----------------------- -----------------
0    15258                   15258

正如看到的,我们有一些时间点和记录值。现在我们将使用curl运行一些基本示例与进行ifqld交互:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
20:11 $ curl -XPOST --data-urlencode 'q=from(db:"NOAA_water_database").filter(exp:{"_measurement"=="h2o_temperature"}).range(start: -500000h).limit(n: 10)' http://localhost:8093/query       
h2o_temperature,location=coyote_creek degrees=60 1439856000000000000                           
h2o_temperature,location=coyote_creek degrees=65 1439856360000000000                           
h2o_temperature,location=coyote_creek degrees=68 1439856720000000000                           
h2o_temperature,location=coyote_creek degrees=62 1439857080000000000                           
h2o_temperature,location=coyote_creek degrees=62 1439857440000000000                           
h2o_temperature,location=coyote_creek degrees=69 1439857800000000000                           
h2o_temperature,location=coyote_creek degrees=67 1439858160000000000                           
h2o_temperature,location=coyote_creek degrees=67 1439858520000000000                           
h2o_temperature,location=coyote_creek degrees=70 1439858880000000000                           
h2o_temperature,location=coyote_creek degrees=65 1439859240000000000                           
h2o_temperature,location=santa_monica degrees=70 1439856000000000000                           
h2o_temperature,location=santa_monica degrees=60 1439856360000000000                           
h2o_temperature,location=santa_monica degrees=62 1439856720000000000                           
h2o_temperature,location=santa_monica degrees=62 1439857080000000000                           
h2o_temperature,location=santa_monica degrees=60 1439857440000000000                           
h2o_temperature,location=santa_monica degrees=63 1439857800000000000                           
h2o_temperature,location=santa_monica degrees=64 1439858160000000000                           
h2o_temperature,location=santa_monica degrees=63 1439858520000000000                           
h2o_temperature,location=santa_monica degrees=63 1439858880000000000                           
h2o_temperature,location=santa_monica degrees=61 1439859240000000000

让我们将from(db:"NOAA_water_database").filter(exp:{"_measurement"=="h2o_temperature"}).range(start: -500000h).limit(n: 10)

与InfluxQL 进行比较:

  • from有点像SQL的select。它选择database来查询。
  • 在 filter里面有一些特定的关键字被数据库自身使用,比如_measurement。在这种情况下,它通过测量h2o-temperature进行过滤。
  • limit(10)在这种情况下返回20行。为什么是这样?这是我们构建的查询语言的第一个差异。有一种隐式的说法是按照 group by *的方式分组。在这种情况下,有两个系列:h2o_temperature, location=sata_monica和 h20_temperature,location=coyote_creek。如果你需要一个特定的系列,你应该添加.filter(exp:{"_measurement"=="h2o_temperature" AND "location" == "coyote_creek"})

查询语言背后的一些重要决定:

  • 参数的功能顺序并不重要。每个参数都有一个名称,并不是强制性的。
  • 必须使用 ",以避免单引号和双引号之间的不匹配。

IFQL将每个查询从特定语法简化为JSON AST。您可以通过添加查询参数 analyze=true

来获取特定查询的AST 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from(db:"NOAA_water_database").filter(exp:{"_measurement"=="h2o_temperature"}).range(start:
-500000h).limit(n: 10)

IFQL项目文档中的README.md包含所有其他可用的功能的说明。

可扩展性

ifqld是一个无状态的HTTP守护进程程序,因此它可以比InfluxDB(或其他数据库)更容易地扩展和缩减,因为不涉及任何状态或数据。一些功能,例如filters,被推送到引擎(并非所有情况下),因为InfluxDB能够检索时间序列和所有要求的点。

其他的一些功能,如聚合功能,不会推送到InfluxDB,但是一旦从数据库获取数据,ifqld 进程就会立即运行。这使我们能够以更灵活的方式扩展阅读和聚合。如果有更多的查询或更多的计算需求,我们可以启动更多的 ifqld进程,而不必关心底层存储。

可伸缩性的另一个重要方面就是 ifqld可以查询多个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
19:56 $ curl -s -XPOST --data-urlencode 'q=from(db:"NOAA_water_database").range(start: 200h).count()' http://localhost:8093/query?analyze=true | jq
{
  "operations": [
    {
      "id": "from0",
      "kind": "from",
      "spec": {
        "database": "NOAA_water_database",
        "hosts": null
      }
    },
    {
      "id": "range1",
      "kind": "range",
      "spec": {
        "start": "200h0m0s",
        "stop": "now"
      }
    },
    {
      "id": "count2",
      "kind": "count",
      "spec": {}
    }
  ],
  "edges": [
    {
      "parent": "from0",
      "child": "range1"
    },
    {
      "parent": "range1",
      "child": "count2"
    }
  ]
}

使用CLI参数--host=或环境变量$HOSTS可以指定多个后端。这意味着如果您运行的是开源版本,并且您可以在更多利用更多的数据库管理数据分片,还可以进行横向扩展。

路线图

该项目还不稳定,仍快速发展阶段。API和输出可以根据您和我们在查询语言方面的经历进行更改。这个想法是在2018年初固定API样式。如果您是一名活跃的InfluxDB用户,可以随时打开论坛或者提供有关您的使用的反馈信息,以帮助我们改进语法。

评论
登录后参与评论
1 条评论
热度
最新
我对不起大噶,没有认真翻译
我对不起大噶,没有认真翻译
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
InfluxDB-InfluxQL基础语法教程--数据说明与基础SELECT语句
Nginx+Grafana+Prometheus+Jmeter搭建可视化测试监控平台 (包括InfluxDB)
软测小生
2020/05/13
4.1K0
InfluxDB-InfluxQL基础语法教程--数据说明与基础SELECT语句
一小时入门时序数据库 influxDB
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。 主要特性有:
陈大剩博客
2023/03/06
1.1K0
1.InfluxDB数据库快速入门与基础使用
[TOC] 0x00 前言简述 InfluxDB 介绍 Q: 什么是InfluxDB? InfluxDB 采用Go语言开发是一个开源时间序列平台, 是一个可编程且高性能的时间序列数据库,具有跨 OS
全栈工程师修炼指南
2022/09/29
8.5K0
1.InfluxDB数据库快速入门与基础使用
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
之前介绍了运维监控系统Prometheus,然后就有朋友问我关于时序数据库的情况,所以这里总结一下时序数据库,并以InfluxDB为例,介绍时序数据库的功能特性和使用方式,希望能对大家有所帮助。
架构师精进
2023/10/06
19.5K0
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
influxdb 时间序列数据库
1、InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等) 可度量性:你可以实时对大量数据进行计算 基于事件:它支持任意的事件数据 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3)支持min, max, sum, count, mean, median 等一系列函数,方便统计 4)原生的HTTP支持,内置HTTP API 5)强大的类SQL语法 6)自带管理界面,方便使用 2、安装: rpm -ivh https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm 3、启动: sudo service influxdb start 4、客户端: 在usr/bin里使用influx即可登入Influx服务器。也可以将路径加入环境变量中,这样既可在任意地方使用influx。 InfluxDB自带web管理界面,在浏览器中输入 http://服务器IP:8083 即可进入web管理页面。 5、基本概念: database 数据库 measurement 表 point 表中的一行数据 point由time(自动生成的时间戳),field数据,tags由索引的数据 series所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。 6、基本操作: 客户端命令行、HTTP API、各语言API库 show databases; create database test drop database test use test
用户5760343
2022/05/14
1.2K0
influxdb 时间序列数据库
时序数据库 InfluxDB(一)
数据库种类有很多,比如传统的关系型数据库 RDBMS( 如 MySQL ),NoSQL 数据库( 如 MongoDB ),Key-Value 类型( 如 redis ),Wide column 类型( 如 HBase )等等等等,当然还有本系列文章将会介绍的时序数据库 TSDB( 如 InfluxDB )。
凌虚
2020/07/17
3.5K0
数据库笔记 InfluxDB 基础概念及操作
InfluxDB is the open source time series database
twowinter
2020/04/17
1K0
InfluxDB - 官方测试数据导入
Nginx+Grafana+Prometheus+Jmeter搭建可视化测试监控平台 (包括InfluxDB)
软测小生
2020/05/08
1.6K0
饿了么Influxdb实践之路
作者 | 刘平 文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59428f6f7e850f039399fd02/index.html Influxdb是一个基于golang编写,没有额外依赖的开源时序数据库,用于记录metrics、events,进行数据分析。这篇文章谈论的influxdb版本在1.2.0以上。这篇文章只谈论influxdb在监控中的数据存储应用,不会谈论influxdb提供的整套监控方案。本文主要谈论五个方面:时序数据库选
CSDN技术头条
2018/02/08
5K0
饿了么Influxdb实践之路
2.InfluxDB2.x数据库实践使用
描述: 在 V2.x 版本中 influx 客户端命令已独立处理, 其与V1.x版本的 influx cli 参数与使用大不相同, 此处主要讲解V2.x相关语法参数,但也会简单提及一下V1.x版本语法及其使用。
全栈工程师修炼指南
2022/09/29
5.8K1
2.InfluxDB2.x数据库实践使用
时序数据库技术体系(二)–初识InfluxDB
在上篇文章《时序数据库体系技术 – 时序数据存储模型设计》中笔者分别介绍了多种时序数据库在存储模型设计上的一些考虑,其中OpenTSDB基于HBase对维度值进行了全局字典编码优化,Druid采用列式存储并实现了Bitmap索引以及局部字典编码优化,InfluxDB和Beringei都将时间线挑了出来,大大降低了Tag的冗余。在这几种时序数据库中,InfluxDB无疑显的更加专业。接下来笔者将会针对InfluxDB的基本概念、内核实现等进行深入的分析。本篇文章先行介绍一些相关的基本概念。 InfluxDB
企鹅号小编
2018/02/01
1.7K0
时序数据库技术体系(二)–初识InfluxDB
InfluxDB 3.0简介:InfluxDB IOx的演变
InfluxDB 3.0 现在是当前和未来所有 InfluxDB 产品的基础,首次为 InfluxDB 平台带来了高性能、无限基数、SQL 支持和低成本对象存储。InfluxDB 3.0 在 Rust 中作为列式数据库开发,在单个数据存储中引入了对各种时间序列数据(指标、事件和跟踪)的支持,以支持依赖于高基数时间序列数据的可观测性、实时分析和 IoT/IIoT 用例。
gemron的空间
2023/05/02
6.3K0
InfluxDB 3.0简介:InfluxDB IOx的演变
SpringBoot整合InfluxDB:封装方法助力高效时序数据处理
在当今这个信息化飞速发展的时代,数据的增长速度和多样性呈现出爆炸性态势。面对如此庞杂的数据量,如何高效地存储、管理和分析这些数据成为了我们面临的关键问题。InfluxDB作为一种专为时序数据设计的开源数据库,以其卓越的性能和独特的特性,在众多数据库中脱颖而出,成为处理时间序列数据的理想选择。
Front_Yue
2024/10/15
6820
SpringBoot整合InfluxDB:封装方法助力高效时序数据处理
InfluxDB关键概念
前一篇根据InfluxDB的官方开源文档进行了一次实践。这篇来继续看看InfluxDB的关键概念。
Devops海洋的渔夫
2019/06/02
6390
时序数据库 InfluxDB(三)
InfluxDB 是一个无结构模式,这也就是说你无需事先定义好表以及表的数据结构。
凌虚
2020/07/17
2.6K0
「influxDB 原理与实践(二)」详解influxDB的写入与查询
RESTful风格的接口,返回JSON格式的响应数据,并支持身份认证、JWT令牌、丰富的HTTP响应代码等。 influxDB API接口及接口的定义描述如下图所示:
源码之路
2020/09/04
8.3K0
「influxDB 原理与实践(二)」详解influxDB的写入与查询
InfluxDB 学习笔记,从概念优缺点,以及java落地
在Java项目中实现InfluxDB的落地应用,主要包括添加InfluxDB的Java客户端依赖、创建数据库连接、执行数据的增删改查操作等步骤。以下是一个详细的实战指南:
小马哥学JAVA
2024/09/24
5170
wwwhj8828com13O99636600InfluxDB TSM存储引擎之数据写入
之前两篇文章笔者分别从TSM File文件存储格式、倒排索引文件存储格式这两个方面对InfluxDB最基础、最底层也最核心的存储模块进行了介绍,接下来笔者会再用两篇文章在存储文件的基础上分别介绍InfluxDB是如何处理用户的写入(删除)请求和读取请求的。在阅读这两篇文章之前,强烈建议看官先行阅读之前的多篇文章,不然可能会有一定的阅读障碍。
用户3579060
2018/10/12
6780
InfluxDB
另外,InfluxDB也提供了多个可能需要自定义端口的插件,所以的端口映射都可以通过配置文件修改,对于默认安装的InfluxDB,这个配置文件位于/influxdb/influxdb.conf。
框架师
2021/03/05
1.5K0
influxdb 学习
数据点包括time(一个时间戳),measurement(例如cpu_load),至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。
solate
2019/07/22
2.7K0
相关推荐
InfluxDB-InfluxQL基础语法教程--数据说明与基础SELECT语句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验