InfluxDB 學習記錄
InfluxDB 是專門做用於 time series 的資料庫,由 go 語言編寫,擁有對 time series data 操作的強大特性,據統計也是目前最流行的 time series 資料庫,以下記錄我一些學習的心得。
nfluxDB 存儲的數據從邏輯上劃分可以分成以下四部分:
- measurement
可以把 measurement 想成對應到 sql 的資料表,表示整個 time series data。 - time
即表示時間戳記,視為 primary index。 - field
表示一個或多個<key,value>
的欄位,儲存該時間點所在的屬性與其數值,像是<temparture, 28.5>
是 InfluxDB 真正儲存資料的地方,不可以省略該欄位,每一個記錄都對應一筆 timestamp。 - tag
也表示一個或多個<key,value>
的欄位,但型態皆是字串,與 field 不同。用來描述該筆時間點記錄的其他性質。會有這個 tag 欄位屬性主要是因為 time series data 除了每筆記錄都有 timestamp 外,往往還伴隨著其他屬性,像是 IOT 感測器的 device_id 金融資料的 acount_id 等。這個欄位也是 optional 的,用來輔助 query 資料用。
以上的四部分所組成的一筆記錄就視為 time series 中的一個資料點,以下為一筆記錄的表示形式:
1 | measurement-name tag-set field-set timestamp |
對應實際的例子如下:
1 | cpu host=serverA,region=uswest idle=23,user=42,system=12 1464623548s |
接下來介紹如何用程式來操作。InfluxDB 有提供 python 的 client library,以下就使用此 library 來進行 demo。首先,載入模組以及準備要新增的資料。可以看出這就是 measurement、tags、time、fields 標準格式。
1 | from influxdb import InfluxDBClient |
接下來連接資料庫與建立資料庫,並寫入資料。沒意外的話這時已經順利新增兩筆 time series 記錄了。
1 | client = InfluxDBClient('localhost', 8086, 'root', 'root', 'example') |
接下來是查詢資料的部分,influxDB 也有支援類似 SQL 的語法查詢,這時 tag 就派上用場了,tag 可以做為 SQL 語法 where 的查詢條件。例如我們以 device_id 做為查詢條件。
1 | result = client.query("select W from electric_power where device_id='RR72WWBBG-40190123456';") |
結果如下,可以看到成功的查到對應的資料。
1 | {'time': '2017-11-11T03:00:00Z', 'W': 60.88} |
還有要注意的是 influxDB 查詢時的 SQL 欄位是一定要有 field 欄位在裡面的,如果只有 tag 欄位則無法查到任何記錄。例如以下的查詢少了 fields 欄位 W,則此查詢不成立。
1 | client.query("select device_id from electric_power where location='Taipei';") |
試用 InfluxDB 的感想就是使用上簡單又直覺,完全針對 time series data 去做設計,真的比用關聯式資料庫還要事先定義 schema 去存方便多了。
以下也附上我程式的執行範例
https://github.com/Mark1002/influxdb-survey/tree/master
reference: