时序数据库 influxdb
ubuntu安装:
https://www.oryoy.com/news/ubuntu-xi-tong-xia-qing-song-bu-shu-influxdb-ru-men-jiao-cheng-yu-shi-zhan-an-li.html
# 安装influxdb 时序数据库 sudo apt-get install influxdb # 安装influxdb 客户端 sudo apt-get install influx # 使用 nohup 在后台运行influxdb并输出日志 nohup influxd --http-bind-address :8086 > /var/log/influxdb.log 2>&1 & # influxdb客户端指定连接 influxdb influx --host localhost --port 8086
influx指令:
create database “db_name” 创建数据库 drop database “db_name” 删除数据库 show databases; 查询几个数据库 use database_name; 使用数据库 show measurements; 显示该数据库中的表 创建表,直接在插入数据的时候指定表名(weather就是表名) insert weather,altitude=1000,area=北 temperature=11,humidity=-4 drop measurement “measurement_name” 删除表 建立保留策略(retention policy) create retention policy rp_collectd on collectd duration 1w replication 1 default duration: 1h, 90m, 12h, 7d, 4w, INF 最小1h, 最大INF 通过http添加数据 curl -i -XPOST ‘http://localhost:8086/write?db=testDB’ –data-binary ‘weather,altitude=1000,area=北 temperature=11,humidity=-4’ -- 查看所有的数据库 show databases; -- 使用特定的数据库 use database_name; -- 查看所有的measurement show measurements; -- 查询10条数据 select * from measurement_name limit 10; -- 数据中的时间字段默认显示的是一个纳秒时间戳,改成可读格式 precision rfc3339; -- 之后再查询,时间就是rfc3339标准格式 -- 或可以在连接数据库的时候,直接带该参数 influx -precision rfc3339 -- 查看一个measurement中所有的tag key show tag keys -- 查看一个measurement中所有的field key show field keys -- 查看一个measurement中所有的保存策略(可以有多个,一个标识为default) show retention policies;
-- 创建数据库
create database "example_db"
-- 使用数据库
use example_db
-- 插入数据并创建表
insert cpu_load,host=server01 value=0.64
-- 查看表
show measurements
-- 删除表
drop measurement "cpu_load"
-- 查询表
select * from cpu_load
特性 | Tag(标签) | Field(字段) |
---|---|---|
索引 | 有索引,查询过滤快 | 无索引,查询过滤慢(全扫描) |
数据类型 | 只能是字符串 | Float, Integer, String, Boolean |
是否必需 | 可选 | 必需(至少一个) |
主要用途 | 元数据,用于过滤、分组、查询 | 实际数据,用于存储和聚合计算(如平均值、求和) |
性能影响 | 高基数的 Tag 会导致序列爆炸,影响性能 | 对序列数量无影响 |
在 SQL 类比中 | 带索引的 WHERE /GROUP BY 列 |
需要被 SELECT SUM/MEAN(...) 的数值列 |
在设计 Schema 时,遵循以下原则:
-
需要用它来
WHERE
(过滤)或GROUP BY
(分组)-
是 -> 优先考虑设为 Tag。(例如:
host
,device_id
,status_code
) -
否 -> 设为 Field。
-
-
值的可能取值(基数)非常多
-
是,非常多(例如:唯一的用户ID、全局唯一的请求ID)-> 必须设为 Field,否则会造成序列爆炸。
-
否,是可枚举的有限集合(例如:国家、省份、状态、机器型号)-> 设为 Tag 以获得最佳查询性能。
-
-
值是要进行数学运算(如
SUM
,MEAN
,MAX
)的实际指标-
是 -> 设为 Field。(例如:温度、销售额、响应延迟)
-
否 -> 设为 Tag。
-
INSERT <measurement>,<tag_key>=<tag_value> <field_key>=<field_value> <timestamp> # 用逗号隔开的是tag 用空格隔开的是field INSERT cpu_usage,host=server01,region=us-west value=64.5
-- 查询最近1小时的数据 SELECT * FROM cpu_usage WHERE time > now() - 1h -- 查询今天的数据 SELECT * FROM cpu_usage WHERE time >= now() - 1d -- 查询最近30分钟的数据 SELECT * FROM cpu_usage WHERE time > now() - 30m -- 查询特定开始时间之后的数据 SELECT * FROM cpu_usage WHERE time > '2023-10-01 00:00:00' -- 查询精确时间范围 SELECT * FROM cpu_usage WHERE time >= '2023-10-01 00:00:00' AND time <= '2023-10-01 23:59:59' -- 使用 BETWEEN(包含边界) SELECT * FROM cpu_usage WHERE time BETWEEN '2023-10-01 00:00:00' AND '2023-10-01 23:59:59' -- RFC3339 格式(推荐) SELECT * FROM cpu_usage WHERE time >= '2023-10-01T00:00:00Z' -- 日期时间格式 SELECT * FROM cpu_usage WHERE time >= '2023-10-01 00:00:00' -- 仅日期(默认为该日期的 00:00:00) SELECT * FROM cpu_usage WHERE time >= '2023-10-01' -- 纳秒时间戳 SELECT * FROM cpu_usage WHERE time >= 1696118400000000000 -- 按1小时间隔分组,计算每小时的均值 SELECT MEAN("value") FROM "cpu_usage" WHERE time > now() - 24h GROUP BY time(1h) -- 按5分钟分组,计算最大值 SELECT MAX("value") FROM "cpu_usage" WHERE time >= '2023-10-01' AND time < '2023-10-02' GROUP BY time(5m) -- 按天分组,计算总和 SELECT SUM("value") FROM "sales" WHERE time >= '2023-10-01' AND time < '2023-10-31' GROUP BY time(1d)
from influxdb import InfluxDBClient # 基本连接 client = InfluxDBClient( host='127.0.0.1', # InfluxDB服务器地址 port=60000, # 端口号 database='test' # 数据库名称 ) # 或者使用URL连接 # client = InfluxDBClient.from_dsn('http://username:password@localhost:8086/mydb') # 测试连接 try: client.ping() print("连接成功!") except Exception as e: print(f"连接失败: {e}") # 创建数据库 client.create_database('mydb') # 写入数据 json_body = [ { "measurement": "cpu_status", "tags": { "host": "server01", "region": "us-west" }, "time": "2024-01-01T00:00:00Z", "fields": { "value": 0.64 } } ] client.write_points(json_body) # 查询数据 result = client.query('SELECT * FROM cpu_status') print(f"查询结果: {list(result.get_points())}") # 关闭连接 client.close()