EMQX+HStreamDB 實現物聯網流資料高效持久化

emqx發表於2023-03-17

1

在 IoT 場景中,通常面臨裝置數量龐大、資料產生速率高、累積資料量巨大等挑戰。因此,如何接入、儲存和處理這些海量裝置資料就成為了一個關鍵的問題。

EMQX 作為一款強大的物聯網 MQTT 訊息伺服器,單個叢集可處理上億裝置連線,同時提供了豐富的資料整合功能。HStreamDB 作為一款分散式流資料庫,不僅可以高效儲存來自 EMQX 的海量裝置資料,而且提供實時處理分析能力。EMQX 與 HStreamDB 都具備高可擴充套件性和可靠性,兩者結合不僅能夠滿足大規模 IoT 應用的效能和穩定性需求,同時能夠提升應用的實時性。

2

近期 EMQX Enterprise 4.4.15 釋出,更新了對 HStreamDB 最新版本的支援,本文將具體介紹如何透過 EMQX 規則引擎將資料持久化到 HStreamDB,實現 MQTT 資料流的儲存與實時處理。

:本文介紹的整合步驟基於 EMQX 4.4.15 和 HStreamDB 0.14.0 以上版本。

連線到 HStreamDB 叢集

在下面的教程中,我們假設有一個正在執行的 EMQX Enterprise 叢集和正在執行的 HStreamDB 叢集。如需部署 EMQX Enterprise 叢集,請參考 EMQX Enterprise docs。如需部署 HStreamDB 叢集,請參考 HStreamDB docs,其中包含關於如何用 Docker 快速部署的說明。

我們可以透過 Docker 來部署 HStreamDB 客戶端並連線到 HStreamDB 叢集:

# 獲取幫助資訊
docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.14.0 hstream --help

我們在此使用 hstream stream 命令建立一個 stream,供接下來的示例使用:

# 使用 hstream stream 命令建立 streams
docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.14.0 hstream stream create basic_condition_info_0 -r 3 -b $(( 7 * 24 * 60 * 60 ))

接下來,連線到 HStreamDB 叢集,啟動互動式 HStream SQL shell:

docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.14.0 hstream sql --service-url "<<YOUR-SERVICE-URL>>"
# 如果要使用安全連線,還需要填寫 --tls-ca, --tls-key, --tls-cert 引數

如果連線成功,將會出現

      __  _________________  _________    __  ___
     / / / / ___/_  __/ __ \/ ____/   |  /  |/  /
    / /_/ /\__ \ / / / /_/ / __/ / /| | / /|_/ /
   / __  /___/ // / / _, _/ /___/ ___ |/ /  / /
  /_/ /_//____//_/ /_/ |_/_____/_/  |_/_/  /_/

Command
  :h                           To show these help info
  :q                           To exit command line interface
  :help [sql_operation]        To show full usage of sql statement

SQL STATEMENTS:
  To create a simplest stream:
    CREATE STREAM stream_name;
  To create a query select all fields from a stream:
    SELECT * FROM stream_name EMIT CHANGES;
  To insert values to a stream:
    INSERT INTO stream_name (field1, field2) VALUES (1, 2);

可以使用 show streams; 來檢視已經建立的 streams 的資訊:

> show streams;
+-------------------------------------------+---------+----------------+-------------+
| Stream Name                               | Replica | Retention Time | Shard Count |
+-------------------------------------------+---------+----------------+-------------+
| basic_condition_info_0                    | 3       | 604800 seconds | 1           |
+-------------------------------------------+---------+----------------+-------------+

建立 HStreamDB 資源

在利用 EMQX 規則引擎將資料持久化到 HStreamDB 之前,需要建立一個 HStreamDB 資源。

為此,請訪問 EMQX Dashboard,單擊 規則引擎 -> 資源建立 ,選擇 HStreamDB 資源,輸入 HStreamDB 地址並填寫必要的選項。可用選項如下表:

3

在選擇開啟 SSL 時,會出現額外的 SSL 配置介面,可以貼上所需配置內容或上傳檔案。

4
5

建立資料持久化到 HStreamDB 的規則

點選 規則引擎 -> 規則 -> 建立

6

編輯 SQL 規則並新增操作,您可以在字串模板中使用 SQL 變數。

請注意,本文件中介紹的 SQL 規則僅供演示,實際的 SQL 應根據業務設計進行編寫。

單擊 新增操作,選擇「資料持久化」以將資料儲存到 HStreamDB 中。選擇上一步建立的資源並輸入引數。可用引數如下表:

7
8

點選 確定 來確認新增行為。

9

在 HStream SQL Shell 中獲取實時的資料更新

從 EMQX 規則引擎持久化到 HStreamDB 的資料可以使用 HStream SQL Shell 實時讀出新寫入 stream 的內容。現在,資料已經被寫入 HStreamDB,可以使用任何消費方式來消費訊息。文件使用了一個簡單的消費方法:使用 HStream SQL shell 進行查詢。此外,讀者可以自由選擇使用自己喜歡的程式語言 SDK 編寫消費端。

# docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.14.0 hstream sql
> select * from basic_condition_info_0 emit changes;

當前的 select 查詢沒有結果可供列印出,這是因為還沒有資料透過 EMQX 的規則引擎向 HStreamDB 寫入。一旦有資料寫入,便可以在 HStream SQL shell 觀察到資料的即時更新。目前在 HStreamDB 使用 SQL 對 streams 做查詢,只會列印出建立查詢後的結果。如果在 EMQX 停止向 HStreamDB 寫入後建立查詢,可能觀察不到產生的結果。

向 EMQX 寫入訊息測試規則引擎

可以使用跨平臺的桌面客戶端 MQTT X 來連線到 EMQX 併傳送訊息:

10

從 EMQX Dashboard 獲取規則引擎的執行資料指標

訪問對應的規則引擎介面:

11

如果規則引擎執行資料指標正常,則代表 EMQX 會將資料持久化到 HStreamDB。一旦寫入成功,便可以在前面步驟啟動的 HStream SQL Shell 中看到實時的資料更新。

# docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.14.0 hstream sql
> select * from basic_condition_info_0 emit changes;
{"current-number-of-people":247.0,"device-health":true,"number-of-people-in-line":14.0,"submitter":"admin-07","temperature":27.0}
{"current-number-of-people":220.0,"device-health":true,"number-of-people-in-line":13.0,"submitter":"admin-07","temperature":27.2}
{"current-number-of-people":135.0,"device-health":true,"number-of-people-in-line":2.0,"submitter":"admin-01","temperature":26.9}
{"current-number-of-people":137.0,"device-health":true,"number-of-people-in-line":0.0,"submitter":"admin-01","temperature":26.9}

結語

至此,我們就完成了透過 EMQX 規則引擎將資料持久化到 HStreamDB 的主要流程。

將 EMQX 採集到的資料儲存到 HStreamDB 後,可以對這些資料進行實時處理與分析,為上層 AI、大資料等應用提供支撐,進一步發掘和利用資料價值。作為首個專為流資料設計的雲原生流資料庫,HStreamDB 與 EMQX 結合可以實現一站式儲存和實時處理海量物聯網資料,精簡物聯網應用資料棧,加速企業的物聯網應用開發。

版權宣告: 本文為 EMQ 原創,轉載請註明出處。

原文連結:https://www.emqx.com/zh/blog/integration-practice-of-emqx-and-hstreamdb

相關文章