学习influxDB的安装和使用
influxDB的使用场景
nfluxDB 是一种时序数据库,时序数据库通常被用在监控场景,用来收集各个节点采集到的监控指标,以及监控指标产生的时间点.比如我们收集的主机的监控数据,可以通过查询语句,统计查询过去30分钟内cpu的平均使用率是多少.
相比关系型数据库与时序数据库差距:
- 写入性能,关系数据库也有可以基于时间戳进行查询,但是数据库通常采用B+树的数据结构,在数据写入时候可能会触发叶裂变,从而产生对磁盘的随机读写,降低了读写速度,而且关系型数据库对于通过时间范围进行检索的性能支持并不是有很高的性能.一般情况下我们是不建议直接从关系型数据库中通过时间索引进行范围时间段的查询,会消耗较多的资源,而时序数据库是通过采用LSM Tree的变种,用顺序写来增强数据写入的能力.
- 数据冷热区别: 相比较时序常用语监控数据存储收集场景,这个场景有明显的特点,就是对于冷热数据的差别,我们对于监控时间段的查询和检索需求是有一个明确的范围,比如今天或者近7天,而在往前较为久远的数据基本上是不会进行检索使用.所以这部分热数据则是应当加载在内存中方便快速查询,而其他冷数据则应当压缩存储释放空间.
- 数据只写不改特点: 通过监控系统的特点就可以判断出,通过时序数据库收集到的数据,基本都是写入场景,一般不会涉及到更新的场景.
influxDB的安装和简单使用
linux上安装influxDB: 通过二进制包下载安装
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.4.0-linux-amd64.tar.gz
其他版本下载可以查看:https://www.influxdata.com/downloads/
执行命令下载,然后进行解压:
tar -zxvf influxdb2-2.4.0-linux-amd64.tar.gz
解压之后又三个文件:influxDB通过go语言开发的项目一般来说会打包成单独的二机制可执行文件,可以直接跑在系统上.
[root@win-local-17 influxdb2_linux_amd64]# ll
总用量 146664
-rwxr-xr-x. 1 1000 1000 150164784 8月 19 2022 influxd
-rw-rw-r--. 1 1000 1000 1067 8月 19 2022 LICENSE
-rw-rw-r--. 1 1000 1000 9830 8月 19 2022 README.md# influxd 通过这个二进制文件进行启动
进入安装目录后,执行命令:
./influxd
也可以通过yum安装(centos7):
配置yum源:
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install -y --nogpgcheck influxdb
sudo systemctl start influxdb
cli操作
注: 使用上面通过yum安装的数据库,不支持直接使用web端,仅用cli来进行操作.需要web需要另外配置
-- ## 进入命令行(通过yum安装的会自带influx这个客户端工具,如果二进制安装没有这个工具需要另外安装)
[root@win-local-17 ~]# influx
Connected to http://localhost:8086 version v1.11.8
InfluxDB shell version: v1.11.8
>
整体的操作语法类似于sql命令,通过这里的sql命令查询之后,就很好理解influxdb中数据存储方式与关系型数据库的对比
-- ## 查询当前也有数据库
> show databases;
name: databases
name
----
_internal(系统自带,_internal数据库是用来存储InfluxDB内部的实时监控数据的)## 新建一个库
>CREATE DATABASE mydb
-- 在输入上面的语句之后,并没有看到任何信息,这在CLI里,表示语句被执行并且没有错误,如果有错误信息展示,那一定是哪里出问题了,这就是所谓的没有消息就是好消息
> show databases;
name: databases
name
----
_internal
mydb
-- 进入数据库,以下的操作则都是在mydb这个数据库上
> use mydb
Using database mydb
写入数据:
这里简单介绍下influxdb存储的时间序列数据的格式,后面会详细介绍
在时序数据库中存储数据一般包含以下部分:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
# measurement(必填字段): 指标名称(类似表名),逻辑上分组相关数据
# tag-key=tag-value 标签键值对(索引字段),用于高效过滤和分组
# field-key=field-value (必填):字段键值对(实际存储的数值/字符串/布尔值),支持多种数据类型
# timestamp :时间戳(Unix纳秒精度),未指定则自动填充为系统时间
在概念上,你可以将measurement类比sql中table,起主键索引是时间戳,InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储
其中Measurement,Tag Keys,Timestamp都具有索引,方便进行高效和范围查询.
一些数据写入InfluxDB的格式示例:
cpu,host=192.168.44.17,region=bj value=0.64
mem,host=192.168.44.17,region=bj value=0.40
所以我们想上面创建的库中写入测试数据:
> INSERT cpu,host=192.168.44.17,region=bj value=0.64
> INSERT mem,host=192.168.44.17,region=bj value=0.40
-- 进行查询数据,因为我们插入了两个不同Measurement字段的信息,所以查询的时候也需要指定Measurement
> SELECT * FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
1745898086522868887 192.168.44.17 bj 0.64
> SELECT * FROM "mem"
name: mem
time host region value
---- ---- ------ -----
1745898091087905773 192.168.44.17 bj 0.4
通过cli的命令行查询到库中的数据的时候,时序数据库的各个字段与关系型库表的类比关系也是非常直观了.
当然cli命令还有一些其他的用法:
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
其他的cli命令可以参考: https://jasper-zhang1.gitbooks.io/influxdb/content/Query_language/data_exploration.html
web端配置
初始化配置
-
创建用户和初始化存储桶
配置完成用户之后,进入首页页面,就可以使用用户进行交互.
创建简单指标收集 -
创建一个来收集电脑性能指标数据,进入到创建的bucket中
-
进行数据添加,这里选择influxDB提供的Telegraf 代理工具进行数据收集,想当于agent
-
然后进行Telegraf的安装,点击页面上提供的下载地址:https://portal.influxdata.com/downloads/
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.34.2_linux_amd64.tar.gz
tar -xzvf telegraf-1.34.2_linux_amd64.tar.gz
-
解压安装
-
安装目录和文件
然后执行上面配置Telegraf代理的命令(修改为您的命令提示):
export INFLUX_TOKEN=VjELw7YBuDBizmMcLOJK7yuOndwmoTtUdRIGSClAm2-3TXO11LFCGdBRXe8Zbhi3G0T_RkQQ3smYmkRmNX2k_Q==
./usr/bin/telegraf --config http://192.168.44.17:8086/api/v2/telegrafs/0ec988678cbc2000
执行之后,发现没有明显报错之后,可以在web页面在添加一个看板,检查数据是否采集到.
然后就可以在这个面板中选择对应指标信息,展示在上面的图中
从这里进去也会提供一个默认的看板展示,也可以在这里手动创建看板
至此就完成了一个简单的Telegraf代理数据收集和写入influxDB中.
Python调用api写入数据到influxDB简单示例
这里我链接的influxDB为V2.4.0版本的,在pycharm中安装客户端执行命令:
pip install influxdb-client
完整脚本如下:
# -*- coding: utf-8 -*-
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
from influxdb_client.client.exceptions import InfluxDBError
from typing import List, Dict, Optional
import timeclass InfluxDBConnector:"""InfluxDB 2.0 操作封装类"""def __init__(self, url: str, token: str, org: str, bucket: str):"""初始化InfluxDB客户端:param url: InfluxDB地址 (e.g. "http://localhost:8086"):param token: API Token:param org: 组织名称:param bucket: 存储桶名称"""self.url = urlself.token = tokenself.org = orgself.bucket = bucketself.client = InfluxDBClient(url=url, token=token, org=org)self.write_api = self.client.write_api(write_options=SYNCHRONOUS)self.query_api = self.client.query_api()def write_point(self,measurement: str,fields: Dict[str, float],tags: Optional[Dict[str, str]] = None,timestamp: Optional[int] = None) -> bool:"""写入单条数据点:param measurement: 指标名称 (e.g. "cpu_usage"):param fields: 字段键值对 (e.g. {"value": 75.5}):param tags: 标签键值对 (e.g. {"host": "server1"}):param timestamp: 可选时间戳(纳秒级Unix时间戳):return: 是否成功"""try:point = Point(measurement)# 添加标签if tags:for key, value in tags.items():point.tag(key, str(value))# 添加字段for key, value in fields.items():point.field(key, value)# 设置时间戳if timestamp:point.time(timestamp)self.write_api.write(bucket=self.bucket, record=point)print('写入成功')return Trueexcept InfluxDBError as e:print(f"写入失败: {e}")return Falsedef query_data(self, flux_query: str) -> Optional[List[Dict]]:"""执行Flux查询:param flux_query: Flux查询语句:return: 查询结果列表(字典格式)或None"""try:result = self.query_api.query(flux_query)formatted_result = []for table in result:for row in table.records:formatted_result.append({"time": row.get_time(),"measurement": row.get_measurement(),"fields": row.values})return formatted_resultexcept InfluxDBError as e:print(f"查询失败: {e}")return Nonedef close(self):"""关闭连接"""self.client.close()def __enter__(self):"""支持with上下文管理"""return selfdef __exit__(self, exc_type, exc_val, exc_tb):"""退出上下文时自动关闭连接"""self.close()# ------------------- 使用示例 -------------------
if __name__ == "__main__":# 配置参数(替换为实际值)config = {"url": "http://192.168.44.17:8086/","token": "*****", ## 可以在web端,api管理里面看到"org": "test","bucket": "test_influxdb"}# 示例1:使用with自动管理连接with InfluxDBConnector(**config) as db: # 可以在这里调用业务函数db.write_point(measurement="cpu_usage",fields={"value": 42.3, "load": 1.2},tags={"host": "server1", "region": "east"})# # 查询最近1小时数据# results = db.query_data(# f'from(bucket:"{config["bucket"]}") '# '|> range(start: -1h) '# '|> filter(fn: (r) => r._measurement == "cpu_usage")'# )# print("查询结果:", results)#
参考文档:
https://www.cnblogs.com/yance-dev/p/10500209.html
https://jasper-zhang1.gitbooks.io/influxdb/content/Query_language/data_exploration.html