leiiwang

参考https://docs.influxdata.com/influxdb/v0.13/, 当前版本0.13, 这是一个简化版的文档,摘录文档中我认为比较重要的概念内容, influxdb目前更新很快,不同版本之间概念差异很大,阅读时请注意当前最新版本。



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会默认连接端口8086localhost。如果您需要更改这些默认设置,运行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表,其主索引始终是时间。tagsfield都表中的列。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参数qCREATE 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,并且把它作为 默认DEFAULTPR。当你写数据的时候没有提供一个明确的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. 硬件指南

3. 概念

  • Category
  • Db
comments powered by Disqus