InfluxDB

简介

InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。类似的数据库有Elasticsearch、Graphite等。

安装

  • MacOS
1
$ brew install influxdb

基本概念

名词

InfluxDB 名词对应的数据库概念
database数据库
measurement
points表中一行数据

Point

point 由时间戳(time)、数据(field)、标签(tags)组成。

point属性传统数据库概念
time每个数据记录时间,是数据库中的主索引(会自动生成)
fields各种记录值(没有索引的属性)也就是记录的值:温度, 湿度
tags各种有索引的属性:地区,海拔

Series

所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。

1
2
$ show series from measurement_name
$ show tag keys from measurement_name

入门操作

  • 连接远程数据库

    1
    $ influx -host 192.168.9.4 -port 7076

    连接本地数据库时先启用influxd 进程,之后执行influx进入本地数据库 ;

  • 查看命令

    1
    2
    3
    4
    5
    6
    7
    $ show databases // 查看数据库
    $ use database_name //使用数据库
    $ show measurements // 查看表
    $ show field keys // 查看表中列名及其属性
    $ show tag keys // 查看关键key值
    $ select * from table_name limit 5 //查看表中数据
    $ show retention policies // 查看数据保留策略
  • 删除命令

    1
    2
    drop measurement measurement_name //删除表
    DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>] // 删除数据

备份与恢复

1
2
3
4
influxd backup -portable /home/influxdb_backup
influxd restore -portable /home/influxdb_backup

docker exec -it 10000-influxdb influxd restore -db aiops_ -datadir /var/lib/influxdb/data -metadir /var/lib/influxdb/meta /var/lib/influxdb/influx

导出/导入数据

方法一

1
influx -database 'telegraf' -host 'localhost' -username 'admin'  -password '123456789' -execute 'select * from mem' -format 'csv' -precision 's' > mem-export.csv

导出的数据格式如下,📢 导出的表格数据结构不易导入其它数据库;

数据示例

方法二

influx_inspect -export 导出 line protocol 格式直接导入其它数据库;

1
2
3
4
5
6
7
influx_inspect export 
-datadir "/data/influxdb/data" # influxdb 默认的数据存储位置,可以省略
-waldir "/data/influxdb/wal" # influxdb 默认的数据交换位置,可以省略
-out samples # 导出数据文件的文件名
-database quoridor # 指定要导出数据的数据库
-start 2019-07-21T08:00:01Z # 数据的起始时间(RFC3339 format)
-end 2019-08-21T08:00:01Z # 数据的终止时间(RFC3339 format)

对应的导入数据:

1
2
3
4
influx 
-import
-path=samples # 指定导入数据的文件
-precision=ns # 指定导入数据的时间精度

其它操作

  • 网页查询:[http://10.0.80.167:8086/query?db=aiops_quoridor&q=](http://10.0.80.167:8086/query?db=aiops_quoridor&q=) {query}

Python API

参考文档: InfluxDB 5.3.0 documentation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
data_periods = pd.date_range(start='2014-11-16 10:30:00', periods=60, freq='T') # freq (T or combined pattern)

from influxdb import DataFrameClient
host = 'localhost'
port = '8086'
user = 'root'
password = 'root'
dbname = 'aiops_quoridor'
protocol = 'line'

client = DataFrameClient(host, port, user, password, dbname)
df = pd.DataFrame(np.transpose(np.array([index1, index2, index3])), index=data_periods, columns=['succ_rate', 'count', 'src', 'dst'])
df = df.astype({
'time': float, 'avg_latency': float, 'cnt': float,
'dst': str, 'resp_cnt': float, 'resp_rate': float, 'src': str,
'succ_cnt': float, 'succ_rate': float, 'unresp_cnt': float, 'unsucc_cnt': float
})
client.write_points(df,
'edges',
tag_columns=['src', 'dst'], # tag keys
field_columns=['succ_rate', 'count'],
protocol=protocol)

常见问题

  1. 查询报错:“ERR: error parsing query”?

    原因:查询语句中包含特殊字符且没有添加双引号,例如‘-,.’等。

    解决方法:查询字段添加双引号!

  2. 字符串查询:“查不到结果”?

    字符串使用单引号''

  3. 查看 influx-proxy log

1
docker logs --tail 100 10000-influxproxy