时序数据库 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

image

 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 时,遵循以下原则:

  1. 需要用它来 WHERE(过滤)或 GROUP BY(分组)

    • 是 -> 优先考虑设为 Tag。(例如:hostdevice_idstatus_code

    • 否 -> 设为 Field。

  2. 值的可能取值(基数)非常多

    • 是,非常多(例如:唯一的用户ID、全局唯一的请求ID)-> 必须设为 Field,否则会造成序列爆炸。

    • 否,是可枚举的有限集合(例如:国家、省份、状态、机器型号)-> 设为 Tag 以获得最佳查询性能。

  3. 值是要进行数学运算(如 SUMMEANMAX)的实际指标

    • 是 -> 设为 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()

 

posted @ 2025-10-16 13:52  wangssd  阅读(6)  评论(0)    收藏  举报