参考https://docs.influxdata.com/influxdb/v0.13/, 当前版本0.13, 这是一个简化版的文档,摘录文档中我认为比较重要的概念内容, influxdb目前更新很快,不同版本之间概念差异很大,阅读时请注意当前最新版本。
- 1. 概要
- 2. 指南
- 2.1. 写数据
- 2.1.1. 使用HTTP API创建数据库
- 2.1.2. 使用HTTP API写入数据
- 2.1.3. 写多个点数据
- 2.1.4. 从文件中写入点
- 2.1.5. Schemaless Design
- 2.1.6. 关于REST…
- 2.1.7. HTTP响应概要
- 2.2. 查询数据
- 2.2.1. 使用 HTTP API查询数据
- 2.2.2. 多个查询
- 2.2.3. 查询数据的其他选项
- 2.3. 缩减采样和数据保留(Downsampling and Data Retention)
- 2.3.1. 保留策略retention policies
- 2.3.2. 连续查询
- 2.3.3. 结合 RPs and CQs - 一个案例研究
- 2.4. 硬件指南
- 2.1. 写数据
- 3. 概念
1. 概要
1.1. 简介
InfluxDB是一个时间序列数据库,支持高效的写入和查询。 InfluxDB被设计来存储开发监控,应用指标,物联网传感数据,实时分析等产生的大量的时间序列数据。
为什么选择InfluxDB?
- 为高性能数据存储的时间序列数据而编写。使用TSM引擎支持高存取速度和数据压缩。
- go语言编写,无外部依赖。
- 简单高效的HTTP(S)的API。
- 支持Graphite,collectd和OpenTSDB插件。
- 高可用性设置(基于Relay)。
- 类SQL的查询语言,轻松查询汇总数据。
- tags支持建立索引,以便快速,高效的查询。
- 保留策略(Retention policies)有效地自动清理过期数据。
- 连续查询(Continuous queries)自动汇总数据以提高查询效率。
- 内置Web管理界面。
1.2. 下载和安装
略
1.3. 入门
本节使用命令行界面 influx
(CLI)作为演示,它已经包含在InfluxDB安装包中了,是与数据库交互的轻量级,简单的方式。 CLI中默认情况通过InfluxDB HTTP API使用端口8086
与InfluxDB通信。
1.3.1. 创建数据库
执行influx
命令启动CLI并自动连接到本地InfluxDB实例(假设你已经使用service influxdb start或者直接运行influxd启动了influxdbserver)。输出应该是这样的:
$ influx
Connected to http://localhost:8086 version 0.13.x
InfluxDB shell 0.13.x
>
注:InfluxDB HTTP API默认在端口8086运行。因此,influx会默认连接端口
8086
和localhost
。如果您需要更改这些默认设置,运行influx –help。
现在你可以使用Influx查询语句了(a.k.a InfluxQL)。要退出InfluxQL shell,键入exit
并回车。
新安装的InfluxDB有没有数据库(除了系统的_internal
),所以创建先一个。使用CREATE DATABASE <db-name>
语句创建数据库,其中
> CREATE DATABASE mydb
>
注:按下回车键后,出现一个新的提示符,这意味着该语句执行完成,没有任何错误显示。
> SHOW DATABASES
name: databases
---------------
name
_internal
mydb
>
注意:_internal数据库是InfluxDB自动创建并使用来存储内部运行指标的数据库。有兴趣可以看看它了解Influx内部是怎么运行的。
不同于SHOW DATABASES
,大部分的InfluxQL语句必须针对特定的数据库执行。你可以每次查询的时候都指定数据库,CLI提供了一个方便的语句,USE <db-name>
,
它会自动为之后的所有请求设置使用的数据库。例如:
> USE mydb
Using database mydb
>
这之后的命令只会使用mydb数据库运行。
1.3.2. 读写数据
现在,我们有数据库了,InfluxDB可以接受查询和写入请求了。
首先,简介一下datastore。在InfluxDB数据由“时间序列”(time series)组织,它包含一个测量值,例如“cpu_load”或“temperature”。时间序列有0到多个点,
一个点对应于一个测量数据。点包括time
(时间戳),measurement
(如“cpu_load”),至少一个键值字段field
(测量值本身,例如,“value= 0.64”,或“temperature= 21.2”),以及一个或者多个键值标签tags
,tags是value的元数据(例如,“host= SERVER01”,“region= EMEA”,
“DC =Frankfurt”)。
从概念上讲,你可以认为measurement
是一个SQL表,其主索引始终是时间。tags
和field
都表中的列。tags
有索引,field
没有。
不同的是,使用InfluxDB,你可以存储上百万的测量值,而不必提前定义schemas,并且null values 没有被存储。
Points 被使用Line Protocol
写入InfluxDB,遵循以下格式:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
以下是可以写入InfluxDB的有效例子:
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
使用INSERT
命令插入一个时间序列点数据
> INSERT cpu,host=serverA,region=us_west value=0.64
>
一个名称为name,tag 为host,值为value:0.64的数据被插入Db中了,现在可以查询我们刚刚插入的数据:
> SELECT host, region, value FROM cpu
name: cpu
---------
time host region value
2015-10-21T19:28:07.580664347Z serverA us_west 0.64
>
注:我们写数据的时候并没有提供一个timestamp。当没有提供timestamp的时候,InfluxDB会自动分配本地当前时间戳。这意味着和你的本地时间戳可能会有所不同。
存储另一种数据,这个数据有两个fields
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
>
使用*运算符查询所有数据:
> SELECT * FROM temperature
name: temperature
-----------------
time external internal machine type
2015-10-21T19:28:08.385013942Z 25 37 unit42 assembly
>
InfluxQL还有有许多功能和关键字,这里没有覆盖,包括GO风格正则表达式的支持。例如:
> SELECT * FROM /.*/限制1
-
> SELECT * FROM cpu_load_short
-
> SELECT * FROM cpu_load_short WHERE值> 0.9
2. 指南
2.1. 写数据
可以使用包括命令行界面,客户端库和插件等多种方式向InfluxDB 写入数据。在这里,我们将向你展示如何使用数据库内置的HTTP API来创建数据库和写入数据。
2.1.1. 使用HTTP API创建数据库
发送POST
请求到/query
,并设置URL参数q
为CREATE DATABASE
创建数据库<new_database_name>
:
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
2.1.2. 使用HTTP API写入数据
HTTP API是将数据放入InfluxDB的主要手段。发送POST
请求到/write
。下面的例子写一个单点mydb数据库。数据为 measurement cpu_load_short,
tag keys: host, region; tag values : server01, us-west, field key value: value -> 0.64, timestamp : 1434055562000000000
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
写点数据必须指定db参数。这个POST请求的BODY - 我们称之为线路协议- 包含您要保存的时间序列数据。它们由一个测量,标记,字段和时间戳 (measurement, tags, fields, and a timestamp) 组成。 InfluxDB需要一个测量名称(measurement name.)。严格地说,标签是可选的,常使用来区分数据源,并使进行查询既简单又高效。 标签键和标签值都是字符串。fields是必需的,始终是字符串,在默认情况下,字段值是floats。时间戳是可选的。如果不指定时间戳InfluxDB使用服务器的本地Unix纪元纳秒时间戳。 InfluxDB相关的时间都是UTC。
2.1.3. 写多个点数据
通过换行符分隔多个序列的多个点,这种形式的Batching points可以提高性能。 下面的示例将写三个点到mydb数据库。 第一个点属于cpu_load_short, tag set host=server02, 使用 server’s local timestamp。 第二个点是属于cpu_load_short, tag set host=server02,region=us-west,使用指定的时间戳1422568543702900257。 第三个点具属于cpu_load_short, tag set direction=in,host=server01,region=us-west, 使用指定的时间戳1422568543702900257。
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'
2.1.4. 从文件中写入点
通过@filename向curl传入文件内容。该文件中的数据应该遵循InfluxDB的 line protocol syntax的语法。正确格式的文件(cpu_data.txt)的例子:
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数据库:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt
2.1.5. Schemaless Design
InfluxDB是一个Schemaless的数据库。您可以随时添加measurements, tags, 和 fields。但需要注意的是,如果你试图写入不同的数据类型到之前用过的数据库 (例如,写一个字符串到以前接受整型的字段,InfluxDB将拒绝这些数据。
2.1.6. 关于REST…
InfluxDB使用HTTP仅作为一种方便和广泛支持的数据传输协议。InfluxDB API并没有试图成为RESTful的。
2.1.7. HTTP响应概要
- 2XX:如果
HTTP 204 No Content
,请求成功了!如果它是HTTP 200 OK,InfluxDB理解了请求,但不能完成它。响应的BODEY会包含其他错误信息。 - 4XX:InfluxDB无法理解的请求。
- 5XX:系统超载有严重错误。
错误响应示例: - 写入float到以前接受bool的字段:
curl -i -XPOST 'http://localhost:8086/write?db=hamlet' --data-binary 'tobeornottobe booleanonly=true'
curl -i -XPOST 'http://localhost:8086/write?db=hamlet' --data-binary 'tobeornottobe booleanonly=5'
返回:
HTTP/1.1 400 Bad Request
[...]
write failed: field type conflict: input field "booleanonly" on measurement "tobeornottobe" is type float64, already exists as type boolean
写入一个不存在的数据库
curl -i -XPOST 'http://localhost:8086/write?db=atlantis' --data-binary 'liters value=10'
返回
HTTP/1.1 404 Not Found
[...]
database not found: "atlantis"
2.2. 查询数据
2.2.1. 使用 HTTP API查询数据
HTTP API是查询InfluxDB数据的主要方式(参见command line interface 和 client libraries 等替代方式来查询数据库)。
要执行一个查询,发送GET
请求到/query
,设置URL参数db作为目标数据库,并设置URL参数q作为查询。下面的示例使用HTTP API来查询您在上一节写入的数据。
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT value FROM cpu_load_short WHERE region='us-west'"
InfluxDB返回JSON。查询的结果显示在“results”数组中。如果发生错误,会有一个“error”字段来解释错误原因。
{
"results": [
{
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-01-29T21:55:43.702900257Z",
23422
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
}
]
}
> 注:追加pretty=true添加到URL能够漂亮的打印JSON输出。虽然这对调试很有用,不建议在生产中使用,因为它消耗了不必要的网络带宽。
2.2.2. 多个查询
可以在一个API调用种发送多个查询。只需用分号分割每个查询语句:
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'"
返回
{
"results": [
{
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-01-29T21:55:43.702900257Z",
23422
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
},
{
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"count"
],
"values": [
[
"1970-01-01T00:00:00Z",
3
]
]
}
]
}
]
}
2.2.3. 查询数据的其他选项
时间戳格式Timestamp Format
在InfluxDB所有东西都被存为UTC格式。默认情况下,时间戳以RFC3339 UTC格式返回并提供纳秒级的精度,例如2015-08-04T19:05:14.318570484Z
。
如果你需要 Unix epoch format可以设置查询字符串参数epoch = [H,M,S,MS,U,NS]
。例如,获取秒单位时间戳:
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'"
鉴权Authentication
Authentication in InfluxDB is disabled by default. See Authentication and Authorization for how to enable and set up authentication.
最大行数Maximum Row Limit
最大行限制InfluxDB返回的结果的最大数量。默认设置为10,000,并且可以通过在配置文件的HTTP部分修改。 最大行限制仅适用于非分块查询。分块查询可以返回点的数量不受限制。
分片Chunking
通过设置chunked=true
来使用分块组块,用于返回streamed batches形式的结果,而不是单个resposne返回所有数据。
resposne将被按照series 或每10000个point分片。设置chunk_size
来改变最大块大小为不同的值
,例如:
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"
2.3. 缩减采样和数据保留(Downsampling and Data Retention)
InfluxDB每秒能够处理成千上万的数据点。长时间运行将会消耗大量存储空间。一个自然的解决方案是:缩减采样数据; 只在有限的时间内保持高精度的原始数据,更长时间的数据则存储精度较低,汇总数据。 本节说明了如何结合两个InfluxDB功能 - 保留策略和连续查询(retention policies and continuous queries) - 来自动缩减采样和淘汰数据。
2.3.1. 保留策略retention policies
定义
保留策略retention policy(RP)是InfluxDB的一种数据结构,用于描述InfluxDB保留数据多久(持续时间)和有多少数据副本存储在集群中(复制因子 replication factor)。一个数据库可以有多个RP,RP在每个数据库唯一。
目的
一般来说InfluxDB不是为删除数据设计的。一个基本假设是,删除不频繁并且不必有高性能。然而,InfluxDB意识到清理过期数据 的必要性 — 这就是RPs的目的。
使用RPs
当您创建一个数据库的时候,InfluxDB自动创建一个名为default
的具有无限持续时间,并设置复制因子为1的RP,并且把它作为
默认DEFAULT
PR。当你写数据的时候没有提供一个明确的RP,数据会被设置为DEFAULT RP。
InfluxDB自动查询并写入到DEFAULT RP的数据库。要查询或写入到不同的RP,你必使用<database_name>."<retention_policy>".<measurement_name>
来完整的限定 database,retention policy 和 measurement name。
2.3.2. 连续查询
定义
连续查询continuous query(CQ)是一个数据库中自动定期运行的InfluxQL查询。CQs需要一个SELECT
子句带有GROUP BY time()
。 InfluxDB存储CQ的结果在一个的特定的measurement里。
目的
CQs是定期缩减采样数据的最佳方案 - 一旦你执行CQ,InfluxDB运行定期的执行查询,不同于一个简单地返回结果的正常的查询, InfluxDB把CQ的结果存储下来用于未来使用。
使用CQs
See Continuous Queries for a detailed discussion on how to create and manage CQs.
2.3.3. 结合 RPs and CQs - 一个案例研究
我们有通过电话,并通过网站以10秒间隔追踪食品订单到餐馆数量的实时数据。从长远来看,我们只关心30分钟时间间隔的数据。 在接下来的步骤中,我们使用RP和CQ,使InfluxDB: - 自动删除两个小时以前的10秒级原始数据 - 自动汇总10秒数据到30分钟级数据 - 永久保留30分钟级数据
处理的数据格式 - db=food_data - measurement=orders - fields=phone, website
准备数据库
在插入数据之前进行下面的两步,因为只有InfluxDB新数据进行CQ,也就是创建CQ之后产生的数据,
创建DEFAULT
RP
我们希望DEFAULT RP是一个两小时的策略,而不是默认的default
策略:
> CREATE RETENTION POLICY two_hours ON food_data DURATION 2h REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON food_data
name duration replicaN default
default 0 1 false
two_hours 2h0m0s 1 true
创建CQ
现在我们创建自动的缩减采样10秒级数据到30分钟级别的CQ
> CREATE CONTINUOUS QUERY cq_30m ON food_data BEGIN SELECT mean(website) AS mean_website,mean(phone)\
AS mean_phone INTO food_data."default".downsampled_orders FROM orders GROUP BY time(30m) END
注意指明了使用default RP,而不是two_hours RP
写入数据,查看结果
写入数据到food_data一段时间后我们可以看到两个measurements:orders 和 downsampled_orders
orders中的是10秒级别的two_hours RP下的原始数据:
> SELECT * FROM orders LIMIT 5
name: orders
-----------------
time phone website
2015-12-04T20:00:11Z 1 6
2015-12-04T20:00:20Z 9 10
2015-12-04T20:00:30Z 2 17
2015-12-04T20:00:40Z 3 10
2015-12-04T20:00:50Z 1 15
我们在12/04/2015 at 22:08:19 UTC提交这个查询 - 发现最早的数据是不超过大约两小时前的时间戳。
注:默认情况下,InfluxDB每隔30分钟检查执行RP。这是一个可配置的设置,请参阅数据库配置。
downsampled_orders中的是default RP下的历史30分钟级别数据:
> SELECT * FROM food_data."default".downsampled_orders LIMIT 5
name: downsampled_orders
------------------------
time mean_phone mean_website
2015-12-03T22:30:00Z 4.318181818181818 9.254545454545454
2015-12-03T23:00:00Z 4.266666666666667 9.827777777777778
2015-12-03T23:30:00Z 4.766666666666667 9.677777777777777
2015-12-04T00:00:00Z 4.405555555555556 8.5
2015-12-04T00:30:00Z 4.788888888888889 9.383333333333333
请注意,在downsampled_orders时间戳为30分钟的时间间隔,并且比orders旧的时间戳。
2.4. 硬件指南
略
Share this post
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Email