時序數據庫 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()

浙公網安備 33010602011771號