时序数据库,全称时间序列数据库(Time Series Database,TSDB),用于存储大量基于时间的数据,时序数据(Time Series Data)指的是一系列基于时间的数据,例如 CPU 利用率,北京的房价变化趋势,某一地区的温度变化等。
时序数据库支持时序数据的快速写入、持久化,多维度查询、聚合等操作,同时可以记录所有的历史数据,查询时将时间作为数据的过滤条件。
时序数据的使用场景广泛,包括 DevOps 监控,应用程序指标,IoT 传感器数据,实时动态数据分析等场景。
InfluxDB 是时序数据库中应用比较广泛的一种,在 DB-Engines TSDB rank 中位居首位,可见 InfluxDB 在互联网的受欢迎程度是非常高的。下图是截止到 2021 年 8 月时序数据库的排名情况。
它是 go 语言开发的数据库,InfluxDB 自发布至今,已经有两个版本,InfluxDB1.x 系列提供一种类似 SQL 的查询语言 InfluxQL,用于数据交互。2019 年 1 月新推出的 influxDB2.0 alpha 版本,主推全新的查询语言 Flux,支持 TICK 架构。在 2020 年底推出 InfluxDB 2.0 正式版本,该版本又分为 InfluxDB Cloud 和 InfluxDB OSS 两个系列。
时序数据库与我们熟悉的关系型数据库有所不同,首先需要了解一下 InfluxDB 中字段的含义,如下图所示:
TICK 架构 是 InfluxData 平台的组件的集合首字母缩写,该集合包括 Telegraf、InfluxDB、Chronograf 和 Kapacitor。TICK 架构以及各组件分工情况如图所示:
除了上图可视化管理工具 Chronograf 外,还有一种可视化工具 Grafana,它也是用于大规模指标数据的可视化展示,提供包括折线图,饼图,仪表盘等多种监控数据可视化 UI,若应用过程中考虑到扩展性问题,也会使用 Grafana 代替 Chronograf。
● 数据写入:
①.高并发高吞吐,可持续的数据写入。
②.写多读少,时序数据 95% 以上都是写操作,例如在监控系统数据的时候,监控数据特别多,但是通常只会关注几个关键指标。
③.数据实时写入,不支持数据更新,但是可以人为更新修改。
● 数据分析与查询:
①.数据查询是按照时间段读取,例如 1 小时,1 分钟,给出具体时间范围。
②.最近的数据读取率高,越旧的数据读取率越低。
③.多种精度查询和多种维度分析。
● 数据存储:
①.存储数据规模大的数据,监控数据的数据大多数情况下都是 TB 或者 PB 级。
②.数据存放具有时效性,InfluxDB 提供了保存策略,可以认为是数据的保质期,超过周期范围,就可以认为数据失效,需要回收。节约存储成本,清理低价值的数据。
InfluxDB 的存储结构树是时间结构合并树(Time-Structured Merge Tree,TSM),它是由日志结构化合并树(Log-Structured Merge Tree,LSM),根据实际需求变化而来的。
①.LSM 树
LSM 树包含三部分:Memtable,Immutable 和 SSTable。MemTable 是内存中的数据结构,用于保存最近产生的数据,并按照 Key 有序地组织数据。内存并不是可靠存储,若断电就会丢失数据,因此通常会使用预写式日志 (Write-ahead logging,WAL) 的方式来保证数据的可靠性。
②.TSM 存储引擎
TSM 存储引擎主要包括四部分:Cache,WAL,TSM File,Compactor。下图中 shard 与 TSM 引擎主要部分放在一起,但其实 shard 在是 TSM 存储引擎之上的一个概念。在 InfluxDB 中按照数据产生的时间范围,会创建不同的 shard 分组,每个 shard 都有本身的 cache、wal、tsm file 以及 compactor。
安装虚拟机,创建 Ubuntu 环境,安装 Jmeter5.4 版本。
1.1 安装 influxdb2.0
①.解压 influxdb2.0 安装包
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.7-amd64.deb
②.安装 influxdb2.0
sudo dpkg -i influxdb2-2.0.7-amd64.deb
③.启动 influxdb 服务
sudo service influxdb start
④.关闭 influxdb 服务
sudo service influxdb stop
⑤.查看 influxdb 状态
sudo service influxdb status
⑥.卸载 influxdb
sudo dbkg –r influxdb2
1.2 安装 telegraf
①.解压 telegraf 安装包
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.19.0~rc1-1_amd64.deb
②.安装 telegraf
sudo dpkg -i telegraf_1.19.0~rc1-1_amd64.deb
③.启动 telegraf
systemctl start telegraf
④.查看 telegraf 启动状态
systemctl status telegraf
2.1 Telegraf+InfluxDB2.x 系统可视化监控
Influxdb2.0 已经集成了图形界面,简单的可视化监控可以无需使用 Grafana,本文例子暂时没有使用 Grafana。
①.访问 influxdb2
首先在终端键入启动 influxdb 服务的指令,然后在虚拟机的火狐浏览器地址栏输入 http://localhost:8086influxDB 浏览器访问首页。首次登录会设置用户名,密码,点击 sign,点击回车键进入 in 完成登录。
②.创建 bucket,存储数据
依次点击 Data → Bucket → Create Bucket,在弹框中输入 bucket 名字,然后点击创建,完成 bucket 的创建,此处创建了一个 name 为 demo_bucket 的 bucket。
③.创建一个 telegraf 收集数据
依次点击 Data → Telegraf → Create Configuration → continue。在 Bucket 选择刚才创建的 “demo_bucket“ ,监控目标选择系统 System,然后点击 continue。
点击 continue 之后,可以知道要系统数据包括哪些,Telegraf Configuration name 需要填充,此处填写为 system_data,然后点击 create and verity,完成这一操作。
④.使用 Telegraf 搜集数据
点击 create and verity 之后,并不能马上实现数据搜集,需要在当前页面获取 API Token 和 Telegraf 的启动指令,依次复制,并在终端执行指令。
⑤.系统数据可视化呈现与保存
点击 Export,在 From 这里选择刚才创建的 bucket:demo_bucket,在第一个 filter 那里会在选择 bucket 之后,默认出现_measurement,选择 cpu,相当于关系型数据库中的表,在第 2 个 Filter 处选择可视化的字段。例子选择的是 usage_system(系统用量百分比),相关的 Filter 选定之后,点击 submit,就会呈现出可视化的结果,这里默认的是 Graph,出现如图所示的曲线图。在图中黄色线框部分可以选择动态页面刷新时间,在绿色线框部分可以选择数据开始的时间。
点击 Save 会保存刚才的图,在选择 target dashboard,可以选择已经存在的 system ,这里将可视化图命名为 usage_system_graph。
2.2 Jmeter+InfluxDB2.0 搭建性能监控环境
Jmeter 相对于 InfluxDB 来说,属于外部系统,所以需要在 InfluxDB 中生成一个 token 用于外部时序数据写入数据库。
在 InfluxDB 中选择 Data → Tokens, 点击 Generate → Read/Write Token ,完成 token 创建。
通过双击 jmeter.bat 进入 Jmeter 工作界面,创建一个线程组 (Thread Group),在线程组中点选 Loop Count Infinite,然后依次添加 Java 请求(Java Request),查看结果树(View Results Tree),汇总报告(Summary Report),后端监听器(BackendListener)。主要是在后端监听器填写相关参数,influxdbUrl 要修改 host,填写创建的组织 org 和 bucket,influxdbToken 就是上面创建的 Jmeter_Token 复制进去。若可以在 influxdb 中看到 Java 请求的数据结果,说明 Jmeter 与 InfluxDB 连接成功。
2.3 Flux 在 python3 中的查询应用
Flux 查询语言是 InfluxDB2.0 主推的查询语言,提供 FluxTable,CSV,DataFrame 和 Raw Data 四种查询 API,但是在时间和日期上,较 InfluxQL 相对局限,仅支持 RFC3339 格式,默认值是当天零点。
下图中红色框图则是曲线图的 Flux 查询语句,from 表示数据源所在的 bucket,|>表示管道连接符,range 表示所查询数据所在的时间范围,其中 v.timeRangeStart 和 v.timeRangeStop 代表时间区间下拉框选中的时间段,filter 是对 range 范围内的数据进行过滤,filter 中的参数 fn,是基于列和属性过滤数据逻辑的匿名函数,yield 只在同一个 Flux 中出现多查询的时候才会出现,yield 函数将过滤后的表作为 Flux 查询结果输出。
①.Flux 语言实现系统数据的查询
首先通过 InfluxDBClient 连接 InfluxDB 数据库,InfluxDBClient 中需要提供 url,token 的作用是保证外部系统可以访问数据,不同的 bucket 有不同的 token,org 是数据存储所在的组织,在首次登录的时候完成创建。
编辑 Flux 查询语句之后,调用 query_data_frame 函数完成查询,则查询结果是 DataFrame 格式,由于使用结果包含太多列,这里选择几列数据并展示前 5 条。
import pandas as pd
from influxdb_client import InfluxDBClient
# 设置
my_token = "PePwz1xFzM_edpm6NB0DyR2B04XWqDNQEFPmp9i8hxVW8DmlTTSzywrTyh_p5uv_k1h0Qdxy3U99J2S7TV9X7A=="
client = InfluxDBClient(url='http://192.168.79.147:8086', token=my_token, org='org_demo')
query_api = client.query_api()
# Flux查询语句
mem_query = '''
from(bucket: "demo_bucket")
|> range(start: -5w, stop: now())
|> filter(fn: (r) => r["_measurement"] == "mem")
|> filter(fn: (r) => r["_field"] == "available")
|> filter(fn: (r) => r["host"] == "ubuntu")
|> yield(name: "mean")
'''
table = query_api.query_data_frame(mem_query, "org_demo")
# 提取查询结果的部分字段值
mem_example = pd.DataFrame(table, columns=['_start', '_value', '_field', 'host'])
print(mem_example.head(5))
client.close()
查询结果取前 5 条数据
②.Flux 语言实现数据插入
数据插入的时候也需要 token,通过 InfluxDBClient 连接数据库,然后将准备好的数据通过 write 写入到数据库中
from influxdb_client import InfluxDBClient, Point, Dialect
from influxdb_client.client.write_api import SYNCHRONOUS
my_token="ENL3dUfGzTBFGcHzJ8iCIfbKF0fF7C7-P5PDkGpDWLzvvHuP2v9tKVgeZAFqV3y8sLXJt8alK0e-jicHVDgOEg=="
client = InfluxDBClient(url='http://192.168.79.147:8086', token=my_token, org='org_demo')
write_api = client.write_api(write_options=SYNCHRONOUS)
"""
数据准备
"""
_point1 = Point("_measurement").tag("location", "Beijing").field("temperature", 36.0)
_point2 = Point("_measurement").tag("location", "Shanghai").field("temperature", 32.0)
write_api.write(bucket="python_bucket", record=[_point1, _point2])
结果:
三、总结
从 DB-Engines 数据库趋势排行榜中可以看出,时序型数据库是数据库市场中份额增长最快的部分,尤其是在大数据的背景下,随时都在产生海量的时序数据,现在更多的企业会通过时序数据存储和数据分析来获得预测能力和实时决策能力,为客户提供更好的使用体验。