InfluxDB是一个时间序列数据库,SQL数据库可以提供时序的功能,但严格说时序不是其目的。简而言之,InfluxDB用于存储大量的时间序列数据,并对这些数据进行快速的实时分析。
概念:什么是InfluxDB?跟其他数据库比有哪些优势? — 韩健 腾讯 2020
InfluxDB是一个时间序列数据库,SQL数据库可以提供时序的功能,但严格说时序不是其目的。简而言之,InfluxDB用于存储大量的时间序列数据,并对这些数据进行快速的实时分析。
时序数据
时序数据以时间作为主要的查询纬度,通常会将连续的多个时序数据绘制成线,制作基于时间的多纬度报表,用于揭示数据背后的趋势、规律、异常,进行实时在线预测和预警,时序数据普遍存在于IT基础设施、运维监控系统和物联网中。
时序数据主要有如下3个特点:
- 抵达的数据几乎总是作为新条目被记录,无更新操作。
- 数据通常按照时间顺序抵达。
- 时间是一个主坐标轴。
特点
- 无系统环境依赖,部署方便。
- 无模式(schema-less)的数据模型,灵活强大。
- 原生HTTP管理接口,免插件配置和免第三方依赖。
- 强大的类SQL查询语句,学习成本低,上手快。
- 丰富的权限管理功能:精细到“表”级别。
- 丰富的时效管理功能:自动删除过期数据,自定义删除指标数据。
- 低成本存储,采样时序数据,压缩存储。
- 丰富的聚合函数,支持AVG、SUM、MAX、MIN等聚合函数。
名词
- 数据分片 — 数据库分片(Database Sharding)详解 — 知乎 2019
- 数据量达到一定程度,“垂直扩展(vertical scaling)”性能受到限制,考虑“水平扩展(horizontal scaling)”,将表按行分区的方式。
- 聚合查询 — 聚合函数 COUNT、SUM、AVG、MIN、MAX
- 无模式数据存储 — 无结构定义
与 SQL 的区别
- 时序数据库:InfluxDB是一个时间序列数据库,SQL数据库可以提供时序的功能,但严格说时序不是其目的。简而言之,InfluxDB用于存储大量的时间序列数据,并对这些数据进行快速的实时分析。
- 时间为主键:在InfluxDB中,timestamp标识了在任何给定数据series中的单个点。这就像一个SQL数据库表,其中主键是由系统预先设置的,并且始终是时间。
- tag、field 区分是否有索引
- series
- 数据通常一次写入,很少更新。由于优先考虑create和read数据的性能而不是update和delete,InfluxDB不是一个完整的CRUD数据库,更像是一个CR-ud。
Schema 设计
关键概念
database | field key | field set |
---|---|---|
field value | measurement | point |
retention policy | series | tag key |
tag set | tag value | timestamp |
measurement 相当于 sql 数据库的表
tag 相当于带有索引的列
field 相当于不带有索引的列
retention policy = 数据留存时间(DURATION)+ 副本数量(REPLICATION)
series = same(measurement、retention policy、tag set)
不同时序 即不同 series,以 measurement、retention policy、tag set 区分。
任意series编号 | retention policy | measurement | tag set |
---|---|---|---|
series 1 | autogen |
census |
location = 1,scientist = langstroth |
series 2 | autogen |
census |
location = 2,scientist = langstroth |
series 3 | autogen |
census |
location = 1,scientist = perpetua |
series 4 | autogen |
census |
location = 2,scientist = perpetua |
influxdb、grafana 安装和脚本使用
vi restart_granfana.sh 重启 改密 数据持久化
注意缩进和空格
1 | !/bin/bash |
vi restart_influxdb.sh
1 | !/bin/bash |
查询语句中加入 tz(‘America/Chicago’) 可以显示所设置的时区格式
InfluxDB
开启服务
1 | ./restart_influxdb.sh |
进入 influxdb shell
1 | (base) ➜ ~ docker exec -it influxdb bash |
InfluxDB使用HTTP的API编写数据
1 | 新建数据库 |
注意:附加
pretty=true
到URL可以启用漂亮的JSON输出。虽然这对于调试或直接使用类似工具查询很有用curl,但不建议将其用于生产,因为它会消耗不必要的网络带宽。可以从上面的返回结果看出,两个查询语句的结果都会合并到result数组中返回。
该
max-row-limit
配置选项允许用户限制返回结果的最大数量,以防止InfluxDB运行内存溢出。默认情况下,max-row-limit
配置选项设置为0
。该默认设置允许每个请求返回无限数量的行。
1 | API查询语句 |
telegraf
安装
添加库
1 | cat <<EOF | sudo tee /etc/apt/sources.list.d/influxdata.list |
导入 apt key
1 | sudo curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add - |
更新 apt
1 | sudo apt-get update |
安装 telegraf
1 | apt-get -y install telegraf |
启动 telegraf 服务并设置开机自启
1 | sudo systemctl enable --now telegraf |
查看 telegraf 状态
1 | systemctl status telegraf |
看到 telegraf 配置文件在 /etc/telegraf/telegraf.conf
(可以修改telegraf 导出的 influxdb 端口和数据库):
1 | (base) ➜ ~ systemctl status telegraf |
遇到报错就修改 telegraf 配置文件(找到 outputs.influxdb,修改 influxdb 端口和数据库)并重启 telegraf 服务
1 | vi /etc/telegraf/telegraf.conf |
telegraf 添加网络监控
1 | (base) ➜ ~ vi /etc/telegraf/telegraf.conf |
查看数据库下的 measurements
1 | curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=telegraf" --data-urlencode "q=show measurements" |
返回面板确认数据的展示效果
具体怎么添加 telegraf 插件,参考 Telegraf+InfluxDB+Grafana 增加input配置项说明 — 简书 海洋的渔夫 2019
grafana 添加 influxdb 数据源
防火墙放行8086端口
1 | ufw allow 8086 |
url需配置成正确的宿主机ip和端口(防火墙需放行8086),若不想暴露数据库端口,可换成influxdb容器的ip地址(需自行进入容器查看,容器重启后可能会发生变化)避免数据库暴露至公网。
添加数据源
导入模板
官方看板模板库:https://grafana.com/dashboards
查看模板id
按照 id 导入到自己的 grafana 模板库
模板展示
模板 https://grafana.com/grafana/dashboards/10581
模板 https://grafana.com/grafana/dashboards/10581
nmon2influxdb
json: cannot unmarshal number into Go value of type grafanaclient.DataSourcePlugin
可能要改一下 /root/.nmon2influxdb.cfg
再重试几次。
influxdb 常用操作
数据保留策略
InfluxDB 设置数据保留策略,验证保留的数据存储大小 — 简书 海洋的渔夫 2019
状态码
Downsample and retain data
influxdb 可以在一秒内处理成千上万个数据点,长期保存和使用这么大的数据,久而久之会有存储上的忧虑。一个很自然的应对方法是对数据做采样(downsample),即仅在一段有限的时间内保持数据的高精度,而在更长的时间上保存低精度和概括性的数据。接下来将介绍如何用 influxQL 自动化地实现数据采样和删除过期数据。
名词定义
- Continuous query(CQ)是数据库的一个自动化和定期执行任务的 InfluxQL query,它必须包含一个至少有一个函数的 select 从句,和一个 GROUP BY time() 从句。
- Retention Policy(RP)
InfluxDB-Python
API Documentation — readthedocs
时序数据探索(3)——数据导入InfluxDB方法之直接导入 CSDN 2018
InfluxDBClient
class
influxdb.InfluxDBClient
(host=u’localhost’**, port=8086, username=u’root’, password=u’root’, database=None, ssl=False, verify_ssl=False, timeout=None, retries=3, use_udp=False, udp_port=4444, proxies=None, pool_size=10, path=u’’, cert=None, gzip=False, session=None, headers=None)**
- 热备冷备
- csv json
- influxDB-python
向 influxdb 导入数据
方法
使用 pandas 和 influxdb 行协议导入
使用 influxdb v2 的 CLI 命令导入
1
2
3
4
5
6influx write \
-b bucketName \
-o orgName \
-p ns \
--format=lp
-f /path/to/myLineProtocolData.txt使用Telegraf文件输入插件从CSV中写入数据
1 | import pandas as pd |
1 | # DDL |
1 | influx -import -path=yourfilepath -precision=ns |
json 法
1 | body = [ |
client.write_points()
报错:
1 | UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 0: invalid start byte |
1 | df = pd.read_csv("便签__com.oneplus.note.csv", encoding='GBK') |
C:\Windows\System32\wsl.exe
1 | btc = { |
生成json 格式文件,写入前要先把json格式转成字符串
读取json文件时再把字符串转成json格式
json.loads json.dumps
类型冲突
InfulxDB 导入数据的方法
数据量 pkg_status
50290 条; process_status
56724 条。
- 通过 influx CLI 导入存有 line protocol 格式数据的文件
- 读取 csv 文件,通过 InfluxDBClient.write_points() 以 line protocol 格式导入
- 读取 json 文件,通过 InfluxDBClient.write_points() 以 json 格式导入
- requests 读取
具体实现
1 | file(line) -> line -> influxdb requests 10s # 实现 |
小工具
csv2json():csv 转 json(influxdb 可用格式)
clock():程序执行时间计算
结果
存在一个大表里,用CLI读取
requests 读取
1 | file(line) -> line -> influxdb requests 10s |
崩了
计算不可靠,消耗性能且服务容易奔溃。