InfluxDB 學習記錄

InfluxDB 是專門做用於 time series 的資料庫,由 go 語言編寫,擁有對 time series data 操作的強大特性,據統計也是目前最流行的 time series 資料庫,以下記錄我一些學習的心得。

nfluxDB 存儲的數據從邏輯上劃分可以分成以下四部分:

  1. measurement
    可以把 measurement 想成對應到 sql 的資料表,表示整個 time series data。
  2. time
    即表示時間戳記,視為 primary index。
  3. field
    表示一個或多個 <key,value> 的欄位,儲存該時間點所在的屬性與其數值,像是 <temparture, 28.5> 是 InfluxDB 真正儲存資料的地方,不可以省略該欄位,每一個記錄都對應一筆 timestamp。
  4. 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
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
from influxdb import InfluxDBClient

json_body = [
{
"measurement": "electric_power",
"tags": {
"device_id": "BB12IIMSG-1059010201",
"location": "Taipei"
},
"time": "2017-11-10T23:00:00Z",
"fields": {
"W": 50.64
}
},
{
"measurement": "electric_power",
"tags": {
"device_id": "RR72WWBBG-40190123456",
"location": "U.S.A"
},
"time": "2017-11-11T03:00:00Z",
"fields": {
"W": 60.88
}
}
]

接下來連接資料庫與建立資料庫,並寫入資料。沒意外的話這時已經順利新增兩筆 time series 記錄了。

1
2
3
client = InfluxDBClient('localhost', 8086, 'root', 'root', 'example')
client.create_database('example')
client.write_points(json_body)

接下來是查詢資料的部分,influxDB 也有支援類似 SQL 的語法查詢,這時 tag 就派上用場了,tag 可以做為 SQL 語法 where 的查詢條件。例如我們以 device_id 做為查詢條件。

1
2
3
result = client.query("select W from electric_power where device_id='RR72WWBBG-40190123456';")
for point in result.get_points():
logging.info(point)

結果如下,可以看到成功的查到對應的資料。

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:

  1. https://www.influxdata.com/time-series-database/
  2. time series DB 排名