這集是介紹時序資料庫 InfluxDB 在 WSL 安裝的過程,照慣例先介紹兩位主角。

時序資料庫 InfluxDB

什麼是「時序資料」?

時序資料的重點具體表現在名稱上,「時間」就是時間戳、「序列」表示資料是連續的,具備這兩種特性的資料就可稱為時序資料。

什麼樣的資料是時序資料呢?本集封面的心電圖就是很好的例子,但心電圖的資料量並不大,大概不需要特別的資料庫來優化它的儲存和查詢效能。

那一台收銀機的收銀紀錄是時序資料嗎?以一般的尺度來看它不是,雖然發票的確是照著時間一張張開出,但每張發票的金額卻並不連續,而是獨立的單點,小臻買了五百塊,後面大猩猩又結了六百塊,當然如果把尺度 zoom out 到百萬為單位,那的確可以視之為時序資料,但也要有這種尺度下合理的應用才是,視角或維度的不同決定了資料的性質,就像光既是粒子也是波,實際上幾乎所有的信號都能以波的形式看待,如果其中一個軸是時間,那皆可以時序資料視之。

時序資料之所以要有專門的資料庫來對付它,因為它還有另外兩個性質:肥大又需要長時間保存,因此放在傳統的資料庫水土不服,效率不彰,以一個取樣頻率為 0.1 秒的感測器來說,一天就會有 864,000 筆紀錄,連續跑幾個禮拜很快就會破千萬,所以時序資料庫也就應運而生了。

InfluxDB 是時序資料庫領域最著名的選擇之一,它有幾個特色:

  • 高效能,專門為時序資料而生。
  • 有豐富的客戶端套件,Go、C#、Java、Kotlin、PHP、Ruby、Scala、Swift、JS、Node.js、Python、R 等等,後端、Web、iOS、Android 全方位覆蓋。
  • 查詢語法近似 SQL,稱為 InfluxQL(限 InfluxDB 1.x)。
  • 可自動把舊資料降採樣,釋放儲存空間。
  • 生態成熟,有商業模式,也有周邊的工具練,當然我等免費仔今日用的是 InfluxDB OSS 版。

要注意的是其中最香的 InfluxQL 只在 InfluxDB 1.x 原生提供,InfluxDB 2.0 後 InfluxQL 被另一種查詢語言 Flux 取代,InfluxQL 剩下半殘的功能被打入冷宮,這也是 InfluxDB 最惱人的點,很愛砍掉重練,目前 InfluxDB 有三大版併行:

  • InfluxDB 1.x:有 InfluxQL。
  • InfluxDB 2.x:改用 Flux。
  • Influx IOx:徹底砍掉重練用 Rust 重寫,目前還在開發中,Flux 看似會沿用,目標是無痛轉換。

因為 InfluxQL 實在太香了,而且 InfluxDB 1.x 依然在維護週期內,所以本文選用 InfluxDB 1.8。

Windows 與 WSL

我們選用 WSL 2,Ubuntu 20.04。

要控制篇幅,這部份就不展開了。

安裝 InfluxDB。

起手式下載:

$ wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb

安裝:

$ sudo dpkg -i ./influxdb_1.8.10_amd64.deb

InfluxDB 服務跑起來

因為是 WSL,所以要手動啟動服務:

$ sudo influxd

跑起來會看到一些訊息,下面是比較重要的幾條:

...
2022-05-05T01:18:23.709472Z     info    Using data dir  {"log_id": "0aGSaLR0000", "service": "store", "path": "/var/lib/influxdb/data"}
...
2022-05-05T01:18:23.709807Z     info    Starting HTTP service   {"log_id": "0aGSaLR0000", "service": "httpd", "authentication": false}
2022-05-05T01:18:23.709835Z     info    opened HTTP access log  {"log_id": "0aGSaLR0000", "service": "httpd", "path": "stderr"}
...
2022-05-05T01:18:23.709903Z     info    Listening on HTTP       {"log_id": "0aGSaLR0000", "service": "httpd", "addr": "[::]:8086", "https": false}
  • 資料的真身在 /var/lib/influxdb/data
  • 有在 8086 埠監聽 HTTP
  • HTTP log 會輸出到 stderr

試著在 Ubuntu 內連連看:

$ influx

應該會進入 InfluxDB 的 shell:

Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
>

試著在 Windows 連連看,最簡單的測試方式就是拿瀏覽器開看會不會通,測試下面兩個網址:

  • http://localhost:8086/
  • http://127.0.0.1:8086/

如果有通的話應該會出現 404 訊息,這 404 不重要,它本來就不是跑網頁的,證明有通就好。

在 WSL 2 測 http://127.0.0.1:8086/ 可能會出現拒絕連線錯誤,因為 WSL 2 本質上是一台 Hyper-V 虛擬機,它有自己的 IP,而那 127.0.0.1 則是指向 Windows 自己,如果 Windows 沒有監聽 8086 埠的服務,那就會出現拒絕連線。

總之,所以,要用 Ubuntu 自己的 IP 來測,我們用下面指令顯示出 IP:

ip addr

當然還有更多花式打法,在此不展開。

話說回來,為什麼在 Windows 開 http://localhost:8086/ 卻可以呢?因為 Windows 很貼心的開啟了 WSL 2 的轉送機制,所有往 localhost 的請求都會轉給 Ubuntu,反之亦然。

因為 localhost 和 127.0.0.1 的通與不通,讓本人花了一個下午,直到發現 WSL 2 原來真身是台虛擬機,僅以本篇紀念此事。

InfluxDB 配置

配置檔在 /etc/influxdb/influxdb.conf。

項目相當多,但初期只要關注 HTTP 區塊的幾個項目:

[http]

  # Determines whether HTTP endpoint is enabled.
  # enabled = true

  # The bind address used by the HTTP service.
  # bind-address = ":8086"

  # Determines whether user authentication is enabled over HTTP/HTTPS.
  # auth-enabled = false

應該可以望文生義吧,沒有要改的話默默離開即可。

InfluxQL

InfluxQL 和 SQL 有八成像。

建帳號:

CREATE USER "roy" WITH PASSWORD "sonofbitch" WITH ALL PRIVILEGES

建 DB:

CREATE DATABASE "isgdb"

大概是這樣,其他 InfluxSQL 特有的時序資料查詢未來有碰到再說吧!

參考資料