日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 时序数据库_时序数据库InfluxDB

發布時間:2025/3/13 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 时序数据库_时序数据库InfluxDB 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是InfluxDB?

InfluxDB是一款用Go語言編寫的開源分布式時序、事件和指標數據庫,無需外部依賴。該數據庫現在主要用于存儲涉及大量的時間戳數據,如DevOps監控數據,APP metrics, loT傳感器數據和實時分析數據。

InfluxDB特征:

– 無結構(無模式):可以是任意數量的列(tags)。

– 可以設置metric的保存時間。

– 支持與時間有關的相關函數(如min、max、sum、count、mean、median等),方便統計。

– 支持存儲策略:可以用于數據的刪改(influxDB沒有提供數據的刪除與修改方法)。

– 支持連續查詢:是數據庫中自動定時啟動的一組語句,和存儲策略搭配可以降低InfluxDB的系統占用量。

– 原生的HTTP支持,內置HTTP API。

– 支持類似SQL語法。

– 支持設置數據在集群中的副本數。

– 支持定期采樣數據,寫入另外的measurement,方便分粒度存儲數據。

– 自帶web管理界面,方便使用(登入方式:http://< InfluxDB-IP >:8083)。

– 最關鍵的一點,也是我采用的原因,支持Grafana畫圖展示。

PS:有了InfluxDB+Grafana后,你就可以寫一些簡單的程序了,可以只負責寫后端邏輯部分,數據都可以存入InfluxDB,然后通過Grafana展示出來。

二、InfluxDB基本概念

在具體的講解influxdb的相關操作之前先說說influxdb的一些專有名詞,這些名詞代表什么。先看下面一段Influxdb中的表信息。

1

2

3

4

5

6

>select*from disk;

name:disk

timecount device free hostname used used_percent

-------------------------------------------

15020893061831599781/data80server0110060.33

15020893428794967911/data90server0211068.33

InfluxDB是時序數據庫,所以怎么都繞不開時間,第一縱列time存儲著時間戳,而時間戳是與數據進行關聯,這樣才能將時間和數據進行展示。

InfluxDB名詞

database:數據庫,根關系型數據庫一個概念。

measurement:數據庫中的表,就是關系型數據庫中的表。

points:表里面的一行數據,就是關系型數據庫中的記錄。

InfluxDB中獨有的一些概念

Point由時間戳(time)、標簽(tags)和值(field)組成。

time:每條數據記錄的時間,也是數據庫自動生成的主索引。

tags:各種有索引的屬性。

fields:各種記錄的值。

tag set:tag在InfluxDB中會按照字典序排序,不管是tag-key還是tag-value,只要不一致就分別屬于兩個tag set,例如hostname=server01,device=/data和hostname=server02,device=/data就是兩個不同的tag set。

還有三個重要的名詞:Series、Retention policy和Shard

Series:相當于是InfluxDB中一些數據的集合,在同一個database中,retention policy、measurement、tag sets完全相同的數據同屬于一個series,同一個series的數據在物理上會按照時間順序排列存儲在一起。

Retention policy:存儲策略,用于設置數據保留的時間,每個數據庫剛開始會自動創建一個默認的存儲策略autogen,數據保留時間為永久,之后用戶可以自己設置,例如保留最近2小時的數據。插入和查詢數據時如果不指定存儲策略,則使用默認存儲策略,且默認存儲策略可以修改。InfluxDB會定期清除過期的數據。

Shard:在InfluxDB中是一個比較重要的概念,它和Retention policy相關聯。每一個存儲策略下會存在許多shard,每一個shard存儲一個指定時間段內的數據,并且不重復,例如7點-8點的數據落入shard0中,8點-9點的數據則落入shard1中。每一個shard都對應一個底層的tsm存儲引擎,有獨立的 cache、wal、tsm file。

TSM存儲引擎主要由幾個部分組成:cache、wal、tsm file、compactor。

Cache:相當于是LSM Tree中的memtabl。插入數據時,實際上是同時往cache與wal中寫入數據,可以認為cache是wal文件中的數據在內存中的緩存。當InfluxDB啟動時,會遍歷所有的wal文件,重新構造cache,這樣即使系統出現故障,也不會導致數據的丟失。cache中的數據并不是無限增長的,有一個maxSize參數用于控制當cache中的數據占用多少內存后就會將數據寫入tsm文件。如果不配置的話,默認上限為25MB,每當cache中的數據達到閥值后,會將當前的cache進行一次快照,之后清空當前cache中的內容,再創建一個新的wal文件用于寫入,剩下的wal文件最后會被刪除,快照中的數據會經過排序寫入一個新的tsm文件中。

WAL:WAL文件的內容與內存中的cache相同,其作用就是為了持久化數據,當系統崩潰后可以通過wal文件恢復還沒有寫入到tsm文件中的數據。

TSM File:單個tsm file大小最大為 2GB,用于存放數據。

Compactor:Compactor組件在后臺持續運行,每隔1秒會檢查一次是否有需要壓縮合并的數據。

主要進行兩種操作,一種是cache中的數據大小達到閥值后,進行快照,之后轉存到一個新的tsm文件中。另外一種就是合并當前的tsm文件,將多個小的tsm文件合并成一個,使每一個文件盡量達到單個文件的最大大小,減少文件的數量,并且一些數據的刪除操作也是在這個時候完成。

三、InfluxDB目錄與文件

InfluxDB的數據存儲主要有三個目錄,默認情況下是meta, wal以及data三個目錄。

meta用于存儲數據庫的一些元數據,meta目錄下有一個meta.db文件。

1

2

/var/lib/influxdb/meta/

└──meta.db

wal目錄存放預寫日志文件,以.wal結尾。

1

2

3

4

5

/var/lib/influxdb/wal/

└──test

└──autogen

└──22

└──_00002.wal

data目錄存放實際存儲的數據文件,以.tsm結尾。

1

2

3

4

5

/var/lib/influxdb/data/

└──test

└──autogen

└──22

└──000000001-000000001.tsm

上面幾張圖中,test為數據庫名,autogen為存儲策略名稱,再下一層目錄中的以數字命名的目錄是shard的ID值。

存儲策略下有一個shard,ID為22,shard存儲了某一個時間段范圍內的數據。再下一級的目錄則為具體的文件,分別是.wal和.tsm結尾的文件。

四、InfluxDB安裝配置

1)安裝配置

1

2

3

4

5

6

7

8

# 安裝influxdb;

$yum install influxdb

# 啟動influxdb;

$systemctl start influxdb

# 連接influxdb;

$influx-database'test'-host'localhost'-port'8086'

2)相關文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

$rpm-ql influxdb

# 配置文件;

/etc/influxdb/influxdb.conf

# 日志輪轉;

/etc/logrotate.d/influxdb

# 命令行客戶端;

/usr/bin/influx

# 查看工具;

/usr/bin/influx_inspect

# 壓力測試工具;

/usr/bin/influx_stress

# 數據庫轉換工具(將數據庫從b1或bz1格式轉換為tsm1格式);

/usr/bin/influx_tsm

# 服務端;

/usr/bin/influxd

# Systemctl服務管理;

/usr/lib/influxdb/scripts/influxdb.service

/usr/lib/influxdb/scripts/init.sh

................

# 數據目錄;

/var/lib/influxdb

# 日志目錄;

/var/log/influxdb

3)開啟Web

influxdb提供的簡單web管理頁面,可以用來操作influxdb,默認沒有開啟,如果想開啟需要修改配置文件中[admin]部分,如下:

1

2

3

4

5

6

[admin]

# Determines whether the admin service is enabled.

enabled=true

# The default bind address used by the admin service.

bind-address=":8083"

4)配置文件

[meta] – meta相關配置

dir:meta數據存放目錄,默認值:/var/lib/influxdb/meta。

retention-autocreate:用于控制默認存儲策略,數據庫創建時,會自動生成autogen的存儲策略,默認值:true。

logging-enabled:是否開啟meta日志,默認值:true。

[data] – tsm1引擎配置

dir:最終數據(TSM文件)存儲目錄,默認值:/var/lib/influxdb/data。

wal-dir:預寫日志存儲目錄,默認值:/var/lib/influxdb/wal。

query-log-enabled:是否開啟tsm引擎查詢日志,默認值:true。

cache-max-memory-size:用于限定shard最大值,大于該值時會拒絕寫入,默認值:DefaultCacheMaxMemorySize = 1024 * 1024 * 1024 // 1GB。

cache-snapshot-memory-size:用于設置快照大小,大于該值時數據會刷新到tsm文件,默認值:DefaultCacheSnapshotMemorySize = 25 * 1024 * 1024 // 25MB。

cache-snapshot-write-cold-duration:tsm1引擎snapshot寫盤延遲,默認值:DefaultCacheSnapshotWriteColdDuration = time.Duration(10 * time.Minute)。

compact-full-write-cold-duration:tsm文件在壓縮前可以存儲的最大時間,默認值:DefaultCompactFullWriteColdDuration = time.Duration(4 * time.Hour)。

max-series-per-database:限制數據庫的級數,該值為0時取消限制,默認值:DefaultMaxSeriesPerDatabase = 1000000,measurement, tag set, retention policy相同的數據集合算做一個serie,級數算法示例如下:假設monitor1這個measurement有兩個tags:id 和 name id 的數量為10,name的數量為 100,則 series 基數為 10 * 100 = 1000。

max-values-per-tag:一個tag最大的value數,0取消限制,默認值:DefaultMaxValuesPerTag = 100000。

trace-logging-enabled:是否開啟trace日志,默認值:false。

[coordinator] – 查詢管理的配置選項

write-timeout:寫操作超時時間,默認值: 10s。

max-concurrent-queries:最大并發查詢數,0無限制,默認值: 0。

query-timeout:查詢操作超時時間,0無限制,默認值:0s。

log-queries-after:慢查詢超時時間,0無限制,默認值:0s。

max-select-point = 0:SELECT語句可以處理的最大點數(points),0無限制,默認值:0。

max-select-series = 0:SELECT語句可以處理的最大級數(series),0無限制,默認值:0。

max-select-buckets = 0:SELECT語句可以處理的最大”GROUP BY time()”的時間周期,0無限制,默認值:0。

[retention] – 舊數據的保留策略

enabled:是否啟用該模塊,默認值 :true。

check-interval:檢查時間間隔,默認值 :”30m0s”。

[shard-precreation] – 分區預創建

enabled:是否啟用該模塊,默認值 : true。

check-interval:檢查時間間隔,默認值 :”10m0s”。

advance-period:預創建分區的最大提前時間,默認值 :”30m0s”。

[admin] – influxdb提供的簡單web管理頁面

enabled:是否啟用該模塊,默認值:false。

bind-address:綁定地址,默認值:”:8083″。

https-enabled:是否開啟https ,默認值:false。

https-certificate:https證書路徑,默認值:”/etc/ssl/influxdb.pem”。

[monitor] – 這一部分控制InfluxDB自有的監控系統。 默認情況下,InfluxDB把這些數據寫入_internal數據庫,如果這個庫不存在則自動創建。 _internal 庫默認的retention策略是7天,如果你想使用一個自己的retention策略,需要自己創建。

store-enabled:是否啟用該模塊,默認值 :true。

store-database:默認數據庫:”_internal”。

store-interval:統計間隔,默認值:”10s”。

[subscriber] – 控制Kapacitor接受數據的配置

enabled:是否啟用該模塊,默認值 :true。

http-timeout:http超時時間,默認值:”30s”。

insecure-skip-verify:是否允許不安全的證書,當測試自己簽發的證書時比較有用。默認值:false。

ca-certs:設置CA證書,無默認值。

write-concurrency:設置并發數目,默認值:40。

write-buffer-size:設置buffer大小,默認值:1000。

[http] – influxdb的http接口配置

enabled:是否啟用該模塊,默認值 :true。

bind-address:綁定地址,默認值:”:8086″。

auth-enabled:是否開啟認證,默認值:false。

log-enabled:是否開啟日志,默認值:true。

write-tracing:是否開啟寫操作日志,如果置成true,每一次寫操作都會打日志,默認值:false。

pprof-enabled:是否開啟pprof,默認值:true。

https-enabled:是否開啟https,默認值:false。

https-certificate:設置https證書路徑,默認值:”/etc/ssl/influxdb.pem”。

https-private-key:設置https私鑰,無默認值。

max-row-limit:配置查詢返回最大行數,默認值:10000。

max-connection-limit:配置最大連接數,0無限制,默認值:0。

shared-secret:用于JWT簽名的共享密鑰,無默認值。

realm:配置JWT realm,默認值: “InfluxDB”。

unix-socket-enabled:是否使用unix-socket,默認值:false。

bind-socket:unix-socket路徑,默認值:”/var/run/influxdb.sock”。

[[graphite]] – graphite相關配置,具體參考:https://github.com/influxdata/influxdb/blob/master/services/graphite/README.md

enabled:是否啟用該模塊,默認值 :false。

bind-address:綁定地址,默認值:”:2003″。

database:數據庫名稱,默認值:”graphite”。

retention-policy:存儲策略,無默認值。

protocol:協議,默認值:”tcp”。

batch-size:批量size,默認值:5000。

batch-pending:配置在內存中等待的batch數,默認值:10。

batch-timeout:超時時間,默認值:”1s”。

consistency-level:一致性級別,默認值:”one”。

separator:多個measurement間的連接符,默認值: “.”。

udp-read-buffer = 0:udp讀取buffer的大小,0表示使用操作系統提供的值,如果超過操作系統的默認配置則會出錯。 該配置的默認值:0。

[[collectd]] – collectd相關配置,具體參考:https://github.com/influxdata/influxdb/tree/master/services/collectd

enabled:是否啟用該模塊,默認值 :false。

bind-address:綁定地址,默認值: “:25826″。

database:數據庫名稱,默認值:”collectd”。

retention-policy = “”:存儲策略,無默認值。

batch-size:默認值:5000。

batch-pending:默認值:10。

batch-timeout:默認值:”10s”。

read-buffer:udp讀取buffer的大小,0表示使用操作系統提供的值,如果超過操作系統的默認配置則會出錯。默認值:0。

typesdb:路徑,默認值:”/usr/share/collectd/types.db”。

[[opentsdb]] – opentsdb配置

enabled:是否啟用該模塊,默認值:false。

bind-address:綁定地址,默認值:”:4242″。

database:默認數據庫:”opentsdb”。

retention-policy:存儲策略,無默認值。

consistency-level:一致性級別,默認值:”one”。

tls-enabled = false:是否開啟tls,默認值:false。

certificate:證書路徑,默認值:”/etc/ssl/influxdb.pem”。

batch-size:默認值:1000。

batch-pending:默認值:5。

batch-timeout:超時時間,默認值:”1s”。

log-point-errors:出錯時是否記錄日志,默認值:true。

[[udp]] – udp配置

enabled:是否啟用該模塊,默認值:false。

bind-address:綁定地址,默認值:”:8089″。

database:數據庫名稱,默認值:”udp”。

retention-policy:存儲策略,無默認值。

batch-size:默認值:5000。

batch-pending:默認值:10。

read-buffer:udp讀取buffer的大小,0表示使用操作系統提供的值,如果超過操作系統的默認配置則會出錯。 該配置的默認值:0。

batch-timeout:超時時間,默認值:”1s”。

precision:時間精度,無默認值。

[continuous_queries]

log-enabled:是否開啟日志,默認值:true。

enabled:是否開啟CQs,默認值:true。

run-interval:時間間隔,默認值:”1s”。

五、InfluxDB基本操作

1)用戶管理

可以直接在web管理頁面做操作,也可以命令行。

1

2

3

4

5

6

7

8

9

10

11

# 顯示用戶;

show users

# 創建用戶;

create user"username"with password'password'

# 創建管理員權限用戶;

create user"username"with password'password'with all privileges

# 刪除用戶;

drop user"username"

3)數據庫與表的操作

可以直接在web管理頁面做操作,當然也可以命令行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# 創建數據庫;

create database"db_name"

# 顯示所有的數據庫;

show databases

# 刪除數據庫;

drop database"db_name"

# 使用數據庫;

usedb_name

# 顯示該數據庫中所有的表;

show measurements

# 創建表,直接在插入數據的時候指定表名(key-value);

insert disk,hostname=server02,device=/data free=90,used=110,used_percent=98.33,count=1

# 刪除表;

drop measurement"measurement_name"

4)普通查詢

那么話說,InfluxDB的查詢語法是很給力的,很像SQL語句。下面一一介紹下,常用的InfluxDB里面常用的SQL語句。 話說InfluxDB給與的搜索條件還是很豐富的,有時間分析下他落地在leveldb的數據結構。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

# 表名都可以正則;

select*from/.*/limit1

# 輸出Json格式;

$influx-database'test'-execute'select * from disk'-format'json'-pretty

# 查詢數據大于200的;

select*from disk where free>80

# 查詢數據里面含有下面字符串的;

select*from user_events where url_base=‘friends#show’

# 約等于;

select line from log_lines where line=~/paul@influx.com/

# 按照30m分鐘進行聚合,時間范圍是大于昨天的主機名是server1的;

select mean(value)from cpu_idle group by time(30m)where time>now()–1dandhostName='server1'

select column_one??from foo??where time>now()–1hlimit1000;

select reqtime,url from web9999.httpdwhere reqtime>2.5;

select reqtime,url from web9999.httpdwhere time>now()–1hlimit1000;

# url搜索里面含有login的字眼,還以login開頭;

select reqtime,url from web9999.httpdwhere url=~/^\/login\//;

# 數據的merge;

select reqtime,url from web9999.httpdmerge web0001.httpd;

下面再說下數據的匯聚,聚合啥的。

1

2

3

4

5

6

7

8

9

10

11

# count();

SELECT COUNT(column_name)FROM series_name group by time(10m)…

# min();

SELECT MIN(column_name)FROM series_name group by time(10m)…

# MAX();

SELECT MAX(column_name)FROM series_name group by time(10m)…

# mean();

SELECT MEAN(column_name)FROM series_name group by time(10m)…

5)連續查詢(Continuous Queries)

InfluxDB的連續查詢是在數據庫中自動定時啟動的一組語句,語句中必須包含SELECT關鍵詞和GROUP BY time()關鍵詞。

InfluxDB會將查詢結果放在指定的數據表中。目的:使用連續查詢是最優的降低采樣率的方式,連續查詢和存儲策略搭配使用將會大大降低InfluxDB的系統占用量。而且使用連續查詢后,數據會存放到指定的數據表中,這樣就為以后統計不同精度的數據提供了方便。

新建連續查詢

1

2

3

4

5

CREATE CONTINUOUS QUERYON

[RESAMPLE[EVERY][FOR]]

BEGIN SELECT()[,()]INTO

FROM[WHERE]GROUP BY time()[,]

END

樣例:

1

2

3

CREATE CONTINUOUS QUERY redis_30m ON testBEGIN

SELECT mean(connected_clients),MEDIAN(connected_clients),MAX(connected_clients),MIN(connected_clients)

INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m)END

在test庫中新建了一個名為redis_30m的連續查詢,每三十分鐘取一個connected_clients字段的平均值、中位值、最大值、最小值redis_clients_30m表中。使用的數據保留策略都是default。

顯示或刪除所有已存在的連續查詢

1

2

SHOW CONTINUOUS QUERIES

DROP CONTINUOUS QUERYON

6)數據保存策略(Retention Policies)

InfluxDB是沒有提供直接刪除數據記錄的方法,但是提供數據保存策略,主要用于指定數據保留時間,超過指定時間,就刪除這部分數據。

6.1 查看當前數據庫Retention Policies

1

show retention policies on"db_name"

6.2 創建新的Retention Policies

1

create retention policy"rp_name"on"db_name"duration3wreplication1default

rp_name:策略名;

db_name:具體的數據庫名;

3w:保存3周,3周之前的數據將被刪除,influxdb具有各種事件參數,比如:h(小時),d(天),w(星期);

replication 1:副本個數,一般為1就可以了;

default:設置為默認策略;

6.3 修改Retention Policies

1

alter retention policy"rp_name"on"db_name"duration30ddefault

6.4 刪除Retention Policies

1

drop retention policy"rp_name"

六、結合Grafana使用

1)安裝配置Grafana

CentOS系列使用YUM安裝

1

2

$wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm

$sudo yum localinstall grafana-4.2.0-1.x86_64.rpm

或者

1

2

$yum install initscripts fontconfig

$rpm-Uvh grafana-3.1.1-1470047149.x86_64.rpm

Systemd方式啟動Grafana

1

2

3

$systemctl daemon-reload

$systemctl start grafana-server

$systemctl status grafana-server

啟動Granfa之后,進程名稱為grafana-server。將會默認使用grafana用戶和組運行Granfa進程。默認會開啟HTTP的3000端口。啟動服務之后直接直接在瀏覽器訪問http://IP:3000就會出現如下界面,默認賬號和用戶名為admin/admin,在/etc/grafana/grafana.ini配置文件中可修改。

2)InfluxDB添加用戶

1

create user"admin"with password'admin'with all privileges

3)InfluxDB插入數據

1

2

>usetest;

>insert disk,hostname=server01,device=/data free=80,used=100,used_percent=98.33,count=1

4)Grafana添加IfluxDB為數據源

然后就可以開始畫圖了。

InfluxDB中的tags可以作為條件,如hostname或device,而field可以作為value。

七、Python操作InfluxDB

1)安裝infludb驅動

1

2

$yum install python-pip

$pip install influxdb

2)基本操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#! /usr/bin/env python

#-*- coding:utf-8 -*-

from influxdb import InfluxDBClient

json_body=[

{

"measurement":"disk",

"tags":{

"hostname":"server01",

"device":"/data"

},

"fields":{

"free":89,

"used":100

}

}

]

# 查看數據;

def showDBNames(client):

result=client.query('show measurements;')

print("Result: {0}".format(result))

# 初始化連接(指定要操作的數據庫);

client=InfluxDBClient('localhost',8086,'root','','test')

# 查看表;

showDBNames(client)

# 寫入數據,同時創建表;

client.write_points(json_body)

# 查看表;

showDBNames(client)

# 刪除表;

client.query("drop measurement students")

showDBNames(client)

轉自:?http://www.ywnds.com/?p=10763#comments

總結

以上是生活随笔為你收集整理的python 时序数据库_时序数据库InfluxDB的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。