EMQX+HStreamDB 實現物聯網流數據高效持久化

1

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

EMQX 作爲一款強大的物聯網 MQTT 消息服務器,單個集羣可處理上億設備連接,同時提供了豐富的數據集成功能。HStreamDB 作爲一款分佈式流數據庫,不僅可以高效存儲來自 EMQX 的海量設備數據,而且提供實時處理分析能力。EMQX 與 HStreamDB 都具備高可擴展性和可靠性,兩者結合不僅能夠滿足大規模 IoT 應用的性能和穩定性需求,同時能夠提升應用的實時性。

近期 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 地址並填寫必要的選項。可用選項如下表:

在選擇開啓 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章