前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >influxdb 学习

influxdb 学习

作者头像
solate
发布2019-07-22 16:20:24
2.7K0
发布2019-07-22 16:20:24
举报
文章被收录于专栏:solate 杂货铺

InfluxDB 学习

安装

代码语言:javascript
复制
brew install influxdb

启动

代码语言:javascript
复制
influxd -config /usr/local/etc/influxdb.conf

入门

代码语言:javascript
复制
$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.2.x
InfluxDB shell 1.2.x
>
  • InfluxDB的HTTP接口默认起在8086上,所以inlux默认也是连的本地的8086端口,你可以通过influx --help来看怎么修改默认值。
  • -precision参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳。

用exit 退出命令行。

创建数据库

代码语言:javascript
复制
CREATE DATABASE <db-name>

例如:

代码语言:javascript
复制
CREATE DATABASE mydb

查看数据库

代码语言:javascript
复制
SHOW DATABASES

系统自带的_internal数据库。

  • _internal数据库是用来存储InfluxDB内部的实时监控数据的。
代码语言:javascript
复制
> show databases
name: databases
name
----
_internal
mydb

查看表

代码语言:javascript
复制
show measurements

使用数据库

代码语言:javascript
复制
USE <db-name>

如:

代码语言:javascript
复制
> USE mydb
Using database mydb

读写数据

现在我们已经有了一个数据库,那么InfluxDB就可以开始接收读写了。

InfluxDB里存储的数据被称为时间序列数据

时序数据有零个或多个数据点,每一个都是一个指标值。

数据点包括time(一个时间戳),measurement(例如cpu_load),至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。

measurement类比于SQL里面的table,其主键索引总是时间戳。tagfield是在table里的其他列,tag是被索引起来的,field没有。

在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。

将数据点写入InfluxDB,只需要遵守如下的行协议:

代码语言:javascript
复制
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

例如

代码语言:javascript
复制
cpu,host=serverA,region=us_west value=0.64

使用CLI插入单条的时间序列数据到InfluxDB中,用INSERT后跟数据点:

代码语言:javascript
复制
INSERT cpu,host=serverA,region=us_west value=0.64

一个measurementcputaghostregionvalue值为0.64的数据点被写入了InfluxDB中。

代码语言:javascript
复制
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time                        host    region  value
----                        ----    ------  -----
2019-04-16T02:14:49.279748Z serverA us_west 0.64

说明:我们在写入的时候没有包含时间戳,当没有带时间戳的时候,InfluxDB会自动添加本地的当前时间作为它的时间戳。

支持golang样式的正则

代码语言:javascript
复制
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9

使用

写入数据

向InfluxDB写数据的方式,包括命令行、客户端还有一些像Graphite有一样数据格式的插件

使用HTTP接口创建数据库

使用POST方式发送到URL的/query路径,参数qCREATE DATABASE <new_database_name>

代码语言:javascript
复制
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
使用HTTP接口写数据

通过HTTP接口POST数据到/write路径是我们往InfluxDB写数据的主要方式

代码语言:javascript
复制
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'

measurement为cpu_load_short,tag的key为host和region,对应tag的value是server01和us-west,field的key是value,对应的数值为0.64,而时间戳是1434055562000000000。

POST的请求体我们称之为Line Protocol,包含了你希望存储的时间序列数据。它的组成部分有measurement,tags,fields和timestamp。measurement是InfluxDB必须的, 严格地说,tags是可选的,但是对于大部分数据都会包含tags用来区分数据的来源,让查询变得容易和高效。 tag的key和value都必须是字符串。fields的key也是必须的,而且是字符串,默认情况下field的value是float类型的。 timestamp在这个请求行的最后,是一个从1/1/1970 UTC开始到现在的一个纳秒级的Unix time,它是可选的,如果不传, InfluxDB会使用服务器的本地的纳米级的timestamp来作为数据的时间戳,注意无论哪种方式,在InfluxDB中的timestamp只能是UTC时间。

同时写入多个点

同时发送多个数据点到多个series(在InfluxDB中measurement加tags组成了一个series),可以用新的行来分开这些数据点。这种批量发送的方式可以获得更高的性能。

代码语言:javascript
复制
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'

写了三个数据点到mydb数据库中。第一个点属于series其measurement为cpu_load_short,tag是host=server02, timestamp是server本地的时间戳;第二个点同样是measurement为cpu_load_short, 但是tag为host=server02,region=us-west,且有明确timestamp为1422568543702900257的series; 第三个数据点和第二个的timestamp是一样的,但是series不一样,其measurement为cpu_load_short, tag为direction=in,host=server01,region=us-west。

写入文件中的数据

可以通过curl的@filename来写入文件中的数据,且这个文件里的数据的格式需要满足InfluxDB那种行的语法。

正确的文件(cpu_data.txt)的例子

代码语言:javascript
复制
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257

把cpu_data.txt里的数据写入mydb数据库

代码语言:javascript
复制
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt

如果你的数据文件的数据点大于5000时,你必须把他们拆分到多个文件再写入InfluxDB。 因为默认的HTTP的timeout的值为5秒,虽然5秒之后,InfluxDB仍然会试图把这批数据写进去,但是会有数据丢失的风险

无模式设计

InfluxDB是一个无模式(schemaless)的数据库,你可以在任意时间添加measurement,tags和fields。注意:如果你试图写入一个和之前的类型不一样的数据(例如,filed字段之前接收的是数字类型,现在写了个字符串进去),那么InfluxDB会拒绝这个数据。

对于REST的一个说明

InfluxDB API并不是RESTful的。InfluxDB也只提供了三个API。

HTTP返回值
  • 2xx:如果你写了数据后收到HTTP 204 No Content,说明写入成功了!
  • 4xx:表示InfluxDB不知道你发的是什么鬼。
  • 5xx:系统过载或是应用受损。

查询数据

使用HTTP接口查询数据

过发送一个GET请求到/query路径,并设置URL的db参数为目标数据库,设置URL参数q为查询语句。

代码语言:javascript
复制
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
多个查询

在一次API调用中发送多个InfluxDB的查询语句,可以简单地使用分号;分隔每个查询,

代码语言:javascript
复制
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
其他可选参数
时间戳格式

在InfluxDB中的所有数据都是存的UTC时间,时间戳默认返回RFC3339格式的纳米级的UTC时间,例如2015-08-04T19:05:14.318570484Z,如果你想要返回Unix格式的时间,可以在请求参数里设置epoch参数,其中epoch可以是[h,m,s,ms,u,ns]之一。例如返回一个秒级的epoch:

代码语言:javascript
复制
curl -G 'http://localhost:8086/query' --data-urlencode "db=mydb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
代码语言:javascript
复制
{"results":[{"statement_id":0,"series":[{"name":"cpu_load_short","columns":["time","value"],"values":[[1422568543,2],[1422568543,0.55]]}]}]}
认证

InfluxDB里面的认证默认是关闭的,

最大行限制

可选参数max-row-limit允许使用者限制返回结果的数目,以保护InfluxDB不会在聚合结果的时候导致的内存耗尽。

在1.2.0和1.2.1版本中,InfluxDB默认会把返回的数目截断为10000条,如果有超过10000条返回,那么返回体里面会包含一个"partial":true的标记。该默认设置可能会导致Grafana面板出现意外行为,如果返回值大于10000时,这个面板就会看到截断/部分数据。

在1.2.2版本中,max-row-limit参数默认被设置为了0,这表示说对于返回值没有限制。

这个最大行的限制仅仅作用于非分块(non-chunked)的请求中,分块(chunked)的请求还是返回无限制的数据。

分块(chunking)

可以设置参数chunked=true开启分块,使返回的数据是流式的batch,而不是单个的返回。返回结果可以按10000数据点被分块,为了改变这个返回最大的分块的大小,可以在查询的时候加上chunk_size参数,例如返回数据点是每20000为一个批次。

代码语言:javascript
复制
curl -G 'http://localhost:8086/query' --data-urlencode "db=deluge" --data-urlencode "chunked=true" --data-urlencode "chunk_size=20000" --data-urlencode "q=SELECT * FROM liters"

采样和数据保留

InfluxDB提供了两个特性——连续查询(Continuous Queries简称CQ)和保留策略(Retention Policies简称RP),分别用来处理数据采样和管理老数据的。

Continuous Query (CQ)是在数据库内部自动周期性跑着的一个InfluxQL的查询,CQs需要在SELECT语句中使用一个函数,并且一定包括一个GROUP BY time()语句。

Retention Policy (RP)是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和你数据的时间戳,并删除比你在RPs里面用DURATION设置的更老的数据。单个数据库中可以有多个RPs但是每个数据的RPs是唯一的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 入门
    • 创建数据库
      • 查看数据库
        • 使用数据库
          • 读写数据
          • 使用
            • 写入数据
              • 使用HTTP接口创建数据库
              • 使用HTTP接口写数据
              • 同时写入多个点
              • 写入文件中的数据
              • 无模式设计
              • 对于REST的一个说明
              • HTTP返回值
            • 查询数据
              • 使用HTTP接口查询数据
              • 多个查询
              • 其他可选参数
            • 采样和数据保留
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档