天天看點

運維監控必看:必懂的 InfluxDB 使用指南,關鍵時刻能用上

作者:LinkSLA智能運維管家

InfluxDB是什麼

InfluxDB 是一個由 InfluxData 開發的開源時序型資料庫。它由 Go 寫成,着力于高性能地查詢與存儲時序型資料。InfluxDB 被廣泛應用于存儲系統的監控資料,IoT 行業的實時資料等場景。技術特點包括:

  • InfluxDB在技術實作上充分利用了Go語言的特性,無需任何外部依賴即可獨立部署[5]。
  • InfluxDB提供了一個類似于SQL的查詢語言并且一系列内置函數友善使用者進行資料查詢。
  • InfluxDB存儲的資料從邏輯上由 Measurement, tag組以及field 組以及一個時間戳組成的:
    • Measurement:由一個字元串表示該條記錄對應的含義。比如它可以是監控資料cpu_load,也可以是測量資料average_temperature
    • tag組:由一組鍵值對組成,表示的是該條記錄的一系列屬性資訊。同樣的 measurement 資料所擁有的 tag 組不一定相同,它是無模式的(Schema-free)。tag 資訊是預設被索引的。
    • field組:也是由一組鍵值對組成,表示的是該條記錄具體的value資訊(有名稱)。field組中可定義的value類型包括:64位整型,64位浮點型,字元串以及布爾型。Field資訊是無法被索引的。
    • 時間戳:就是該條記錄的時間屬性。如果插入資料時沒有明确指定時間戳,則預設存儲在資料庫中的時間戳則為該條記錄的入庫時間。
    • InfluxDB 支援基于 HTTP 的資料插入與查詢。同時也接受直接基于TCP或UDP協定的連接配接。
    • InfluxDB 允許使用者定義資料儲存政策(Retention Policies)來實作對存儲超過指定時間的資料進行删除或者降采樣。

增删改查操作

進入influxDB指令行

influx -precision rfc3339            

InfluxDB資料庫操作

  • 顯示資料庫
show databases           
  • 建立資料庫
create database shhnwangjian           
  • 删除資料庫
drop database shhnwangjian           
  • 使用指定資料庫
use shhnwangjian           

InfluxDB資料表操作

在 InfluxDB 當中,并沒有表(table)這個概念,取而代之的是 MEASUREMENTS,MEASUREMENTS 的功能與傳統資料庫中的表一緻,是以我們也可以将 MEASUREMENTS 稱為 InfluxDB 中的表。

• 顯示所有表

SHOW MEASUREMENTS           

• 建立表

InfluxDB中沒有顯式的建立表的語句,隻能通過insert資料的方式來建立新表。

insert disk_free,hostname=server01 value=442221834240i
insert cpu_virtual_used_num,host=1 value=4  1556593150           

其中 disk_free 就是表名,hostname是索引(tag),value=xx是記錄值(field),記錄值可以有多個,系統自帶追加時間戳

或者添加資料時,自己寫入時間戳

insert disk_free,hostname=server01 value=442221834240i 1435362189575692182           

• 删除表

drop measurement disk_free           

資料儲存政策(Retention Policies)

influxDB是沒有提供直接删除資料記錄的方法,但是提供資料儲存政策,主要用于指定資料保留時間,超過指定時間,就删除這部分資料。

  • 檢視目前資料庫 Retention Policies
show retention policies on "db_name"
show retention policies on cdhnm           
  • 建立新的 Retention Policies
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
create retention policy test on cdhnm duration 1h replication 1 default           

rp_name:政策名;

db_name:具體的資料庫名;

3w:儲存3周,3周之前的資料将被删除,influxdb具有各種事件參數,比如:h(小時),d(天),w(星期);replication 1:副本個數,一般為1就可以了;

default:設定為預設政策

  • 修改 Retention Policies
alter retention policy “rp_name” on “db_name” duration 30d default
alter retention policy autogen on cdhnm duration 1h default           
  • 修改資料政策
alter retention policy autogen on cdhnm duration 0h replication 1 default           
  • 删除 Retention Policies
drop retention policy “rp_name” on “db_name"
drop retention policy test on cdhnm           

查詢資料

select * from  cpu_virtual_used_num           

插入資料

插入資料同時建立表

insert disk_free,hostname=server01 value=442221834240i
insert cpu_virtual_used_num,host=470b14f0-e869-43ed-a8e6-fd634258271f,hostname=server01 value=0.3 1557023160            

删除資料

influxDB是沒有提供直接删除資料記錄的方法,但是提供資料儲存政策,主要用于指定資料保留時間,超過指定時間,就删除這部分資料。建立新的 資料庫過期政策至少一個小時

Retention Policies
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
retention policy duration must be at least 1h0m0s influxdb           

查詢表字段

查詢tag:show tag keys from cluster_metric

查詢field:show field keys from cluster_metric

時區問題

在使用 InfluxDB 時,發現由于 InfluxDB 使用的是 UTC 時間,在查詢時經常會遇到時區的問題

1、時間格式

InfluxDB 除了支 epoch_time外,還支援rfc3339_date_time_string和rfc3339_like_date_time_string。

epoch_time

理論一些的解釋是從協調世界時(Thursday, 1 January 1970)開始至今過去的時間。比如我們在 java 程式中使用System.currentTimeMillis()得到的就是這個時間。一般情況下為毫秒級(ms)精度,即13位Long類型。而在InfluxDB中,時間戳的精度可以達到納秒級(ns)即19位Long類型。

rfc3339_date_time_string

rfc3339時間格式是ietf協會定義的一種時間格式,這個名字是因為它被定義在rfc3339中。感興趣的同學可以自己檢視上面的連接配接。InfluxDB中rfc3339的時間格式是這樣的:

‘YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ’           

其中nnnnnnnnn是可選的,如果不寫則會被設定為000000000。注意,如果使用這種時間格式,需要使用單括号(’)将時間括起來。

rfc3339_like_date_time_string

因為rfc3339_date_time_string的格式确實比較反人類,是以InfluxDB也支援這種人類閱讀更友好的格式:

‘YYYY-MM-DD HH:MM:SS.nnnnnnnnn’           

其中HH:MM:SS.nnnnnnnnn是可選的,如果不填寫會被設定為00:00:00.000000000。是以查詢時可以設定到天、小時、分鐘、秒等不同精度。這種時間格式同樣要求被單括号括起來。

2、調整時間戳精度

InfluxDB預設東時間是納秒(ns),即19位時間戳。但是一般情況下時間精度不會這麼高。是以如果使用秒級精度查詢:

select * from cpu_virtual_used_num where time >= 1435333209s and time <= 1542964713s           

如果使用毫秒級精度查詢:

select * from cpu_virtual_used_num where time >= 1435333209000ms and time <= 1542964714000ms           

3、調整時區

如果需要使用中原標準時間(東八區),可以在SQL中使用tc關鍵字:

select * from cpu_virtual_used_num where time >= '2018-11-23 14:30:39' and time <= '2019-11-23 14:32:32' tz('Asia/Shanghai')           

4、UTC時間與Beijing時間轉換

Timestamp時間列

既然是時間序列資料庫,influxdb 的資料都有一列名為 time 的列,裡面存儲 UTC 時間戳。

Influxdb 時間轉成中原標準時間:UTC time + 8 hours = Beijing time

sql語句

influx -precision rfc3339 
show retention policies on cdhnm
alter retention policy autogen on cdhnm duration 1h default
create retention policy test on cdhnm duration 1h replication 1 default
drop retention policy test on cdhnm 
insert cpu_virtual_used_num,host=470b14f0-e869-43ed-a8e6-fd634258271f,hostname=server01 value=0.9 1557045292000000000
select * from cpu_virtual_used_num where time >= '2018-11-23 14:30:39' and time <= '2019-11-23 14:32:32' tz('Asia/Shanghai')
delete from cpu_virtual_used_num           

啟動服務

切換到root使用者
指令:su
輸入密碼:123456           

啟動:

sudo service influxdb start           

重新開機:

service influxdb restart           

切換到普通使用者:

指令:exit

繼續閱讀