數(shù)據(jù)庫(kù)發(fā)展新趨勢(shì)!新鮮開源的流數(shù)據(jù)庫(kù)了解一下
引言
HStreamDB 是一款專為流式數(shù)據(jù)設(shè)計(jì)的, 針對(duì)大規(guī)模實(shí)時(shí)數(shù)據(jù)流的接入、存儲(chǔ)、處理、分發(fā)等環(huán)節(jié)進(jìn)行全生命周期管理的流數(shù)據(jù)庫(kù)。它使用標(biāo)準(zhǔn) SQL (及其流式拓展)作為主要接口語(yǔ)言,以實(shí)時(shí)性作為主要特征,旨在簡(jiǎn)化數(shù)據(jù)流的運(yùn)維管理以及實(shí)時(shí)應(yīng)用的開發(fā)。
HStreamDB 的整體架構(gòu)如下圖所示,單個(gè) HStreamDB 節(jié)點(diǎn)主要由 HStream Server (HSQL) 和 HStream Storage (HStore) 兩個(gè)核心部件組成,一個(gè) HStream 集群由若干個(gè)對(duì)等的 HStreamDB 節(jié)點(diǎn)組成, 客戶端可連接至集群中任意一個(gè) HStreamDB 節(jié)點(diǎn), 并通過(guò)熟悉的 SQL 語(yǔ)言來(lái)完成各種從簡(jiǎn)單到復(fù)雜的流處理和分析任務(wù)。

HStreamDB 整體架構(gòu)
HStream Server (HSQL) 作為 HStreamDB 的核心計(jì)算組件,其本身被設(shè)計(jì)為無(wú)狀態(tài)的。它主要負(fù)責(zé)客戶端的連接管理,安全認(rèn)證,SQL 解析,SQL 優(yōu)化,以及流計(jì)算任務(wù)的創(chuàng)建、調(diào)度、執(zhí)行和管理等。
HStream Server (HSQL) 自頂向下可具體分為以下幾層結(jié)構(gòu):
接入層。主要負(fù)責(zé)客戶端請(qǐng)求的協(xié)議處理、連接管理、以及安全認(rèn)證和訪問(wèn)控制。
SQL 層。客戶端主要通過(guò) SQL 語(yǔ)句與 HStreamDB 交互,來(lái)完成大部分流處理和實(shí)時(shí)分析的任務(wù)。該層主要負(fù)責(zé)將用戶提交的 SQL 語(yǔ)句編譯成邏輯數(shù)據(jù)流圖。與經(jīng)典的數(shù)據(jù)庫(kù)系統(tǒng)一樣,這里包含兩個(gè)核心的子組件:SQL 解析器 和 SQL 優(yōu)化器。SQL 解析器負(fù)責(zé)負(fù)責(zé)完成詞法分析、語(yǔ)法分析,將 SQL 語(yǔ)句編譯到對(duì)應(yīng)的關(guān)系代數(shù)表達(dá)式;SQL 優(yōu)化器負(fù)責(zé)根據(jù)各種規(guī)則和 Context 信息對(duì)生成的執(zhí)行計(jì)劃進(jìn)行優(yōu)化。
Stream 層。該層包含各種常見的流處理算子的實(shí)現(xiàn),以及表達(dá)數(shù)據(jù)流圖的數(shù)據(jù)結(jié)構(gòu)和 DSL,還支持用戶自定義函數(shù)作為處理算子。主要負(fù)責(zé)為 SQL 層傳遞下來(lái)的邏輯數(shù)據(jù)流圖選擇對(duì)應(yīng)的算子實(shí)現(xiàn)和優(yōu)化,生成可執(zhí)行的數(shù)據(jù)流圖。
Runtime 層。該層負(fù)責(zé)實(shí)際執(zhí)行數(shù)據(jù)流圖的計(jì)算任務(wù)并返回結(jié)果。主要包含任務(wù)調(diào)度器、狀態(tài)管理器以及執(zhí)行優(yōu)化器等組件。其中調(diào)度器負(fù)責(zé)計(jì)算任務(wù)在可用計(jì)算資源之間的調(diào)度,可能是在單個(gè)處理的多線程之間調(diào)度,也可能是在單機(jī)的多處理器之間調(diào)度,或者是在分布式集群的多臺(tái)機(jī)器或容器之間調(diào)度。狀態(tài)管理器負(fù)責(zé)協(xié)調(diào)流處理算子的狀態(tài)維護(hù)和容錯(cuò)。執(zhí)行優(yōu)化器可以通過(guò)自動(dòng)化并行等手段加速數(shù)據(jù)流圖的執(zhí)行。
HStream Storage (HStore) 作為 HStreamDB 的核心存儲(chǔ)組件,它是專門為流式數(shù)據(jù)設(shè)計(jì)的低延時(shí)存儲(chǔ)組件,不但能夠分布式持久化存儲(chǔ)大規(guī)模實(shí)時(shí)數(shù)據(jù),而且能夠通過(guò) Auto-Tiering 機(jī)制,無(wú)縫對(duì)接 S3 之類的大容量二級(jí)存儲(chǔ),實(shí)現(xiàn)歷史數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)的統(tǒng)一存儲(chǔ)。
HStream Storage (HStore) 的核心存儲(chǔ)模型是非常貼合流式數(shù)據(jù)的日志模型,數(shù)據(jù)流本身可以看作是一個(gè)無(wú)限增長(zhǎng)的日志,它支持的典型操作包括追加寫和區(qū)間讀,同時(shí)數(shù)據(jù)流是不可變的,一般不支持更新操作。
HStream Storage (HStore) 可分為以下幾個(gè)層次:
Streaming Data API 層。該層提供核心的數(shù)據(jù)流管理和讀寫操作,包括數(shù)據(jù)流的創(chuàng)建、刪除,以及向數(shù)據(jù)流中寫入數(shù)據(jù)和消費(fèi)數(shù)據(jù)流中的數(shù)據(jù)。在 HStore 對(duì)創(chuàng)建的數(shù)據(jù)流的數(shù)量沒(méi)有限制,同時(shí)能支持大量數(shù)據(jù)流的并發(fā)寫入,在大量數(shù)據(jù)流并發(fā)寫入的時(shí)候依然能夠保持穩(wěn)定的低延遲,HStore 的存儲(chǔ)設(shè)計(jì)中并沒(méi)有按照數(shù)據(jù)流來(lái)做存儲(chǔ), 因此數(shù)據(jù)流的創(chuàng)建是非常輕量的操作。針對(duì)數(shù)據(jù)流的特點(diǎn),HStore 提供了 append 操作支持?jǐn)?shù)據(jù)快速寫入,同時(shí)在讀取流數(shù)據(jù)方面,提供了基于訂閱語(yǔ)義的 read 操作,數(shù)據(jù)流中新寫入的數(shù)據(jù)會(huì)被實(shí)時(shí)推送給數(shù)據(jù)消費(fèi)者。
復(fù)制層。該層主要基于優(yōu)化的 Flexible Paxos 共識(shí)引擎實(shí)現(xiàn)了流數(shù)據(jù)的強(qiáng)一致復(fù)制,保證數(shù)據(jù)的容錯(cuò)和可高可用性。同時(shí)通過(guò)非確定性的數(shù)據(jù)分布策略,最大化了集群數(shù)據(jù)的可用性。而且支持復(fù)制組在線重配置,實(shí)現(xiàn)了無(wú)縫的集群數(shù)據(jù)均衡和水平擴(kuò)展。
本地存儲(chǔ)層。該層主要負(fù)責(zé)數(shù)據(jù)的本地持久化存儲(chǔ),實(shí)現(xiàn)上基于優(yōu)化的 RocksDB 存儲(chǔ)引擎 封裝了流數(shù)據(jù)的存取接口,可支持大量數(shù)據(jù)低延遲的寫入和讀取。
二級(jí)存儲(chǔ)層。該層為多種長(zhǎng)期存儲(chǔ)系統(tǒng)提供了統(tǒng)一的接口封裝,比如 HDFS, AWS S3 等,支持將歷史數(shù)據(jù)自動(dòng)卸載到這些二級(jí)存儲(chǔ)系統(tǒng)上,同時(shí)也可以通過(guò)統(tǒng)一的 Streaming Data 接口來(lái)訪問(wèn)。
注:以下功能特性為到 HStreamDB 1.0 版本為止的全部規(guī)劃,部分功能正在持續(xù)開發(fā)中,當(dāng)前版本暫未實(shí)現(xiàn),敬請(qǐng)期待。
HStreamDB 功能架構(gòu)
基于 SQL 的數(shù)據(jù)流處理
HStreamDB 設(shè)計(jì)了完整的基于事件時(shí)間的狀態(tài)化處理方案,不僅支持基本的過(guò)濾、轉(zhuǎn)換操作,還支持按 key 做聚合計(jì)算,基于多種時(shí)間窗口的計(jì)算,以及數(shù)據(jù)流之間 join 的能力,同時(shí)也支持亂序和晚到的消息的特殊處理,保證計(jì)算結(jié)果的準(zhǔn)確性。用戶只需要通過(guò) SQL 語(yǔ)句就能完成上述所有的處理功能,無(wú)需學(xué)習(xí)任何三方 API。同時(shí),HStream 的流處理具備豐富的擴(kuò)展能力,用戶可以針對(duì)自己的業(yè)務(wù)自行擴(kuò)展。
數(shù)據(jù)流的物化查詢
HStreamDB 提供物化視圖功能,支持在持續(xù)更新的數(shù)據(jù)流上進(jìn)行復(fù)雜的查詢和分析操作。HStreamDB 內(nèi)部的增量計(jì)算引擎會(huì)根據(jù)數(shù)據(jù)流的變化實(shí)時(shí)更新物化視圖,用戶可通過(guò) SQL 語(yǔ)句查詢物化視圖獲得實(shí)時(shí)的數(shù)據(jù)洞察。
數(shù)據(jù)流管理
HStreamDB 支持創(chuàng)建和管理大量的數(shù)據(jù)流, 數(shù)據(jù)流的創(chuàng)建在 HStreamDB 是非常輕量的操作, 同時(shí)基于優(yōu)化的存儲(chǔ)設(shè)計(jì), 在大量數(shù)據(jù)流并發(fā)讀寫的情況下仍然能夠保持穩(wěn)定的讀寫延遲。
數(shù)據(jù)流的持久化存儲(chǔ)
HStreamDB 提供低延時(shí)的可靠的數(shù)據(jù)流存儲(chǔ),保證寫入的數(shù)據(jù)消息不丟失,并且能夠重復(fù)消費(fèi)。HStreamDB 會(huì)將寫入的數(shù)據(jù)消息復(fù)制到多個(gè)存儲(chǔ)節(jié)點(diǎn),提供高可用和容錯(cuò)能力,同時(shí)支持將冷數(shù)據(jù)轉(zhuǎn)儲(chǔ)到成本更低的存儲(chǔ)服務(wù)上,比如對(duì)象存儲(chǔ)、分布式文件存儲(chǔ)等,存儲(chǔ)的容量可無(wú)限擴(kuò)展,能夠?qū)崿F(xiàn)數(shù)據(jù)的永久存儲(chǔ)。
數(shù)據(jù)流的 Schema 管理
HStreamDB 強(qiáng)調(diào)彈性的 Schema 支持,數(shù)據(jù)流可以是無(wú) Schema 的,也可以通過(guò) Json、 Avro、Protobuf 等多種格式來(lái)制定 Schema, 同時(shí)也支持 Schema 的演化,自動(dòng)管理多版本 Schema 之間的兼容性。
數(shù)據(jù)流的接入和分發(fā)
HStreamDB 數(shù)據(jù)的接入和分發(fā)由 Connector 完成,它與包括 MQTT Broker、MySQL、ElasticSearch、Redis 等在內(nèi)的多種數(shù)據(jù)系統(tǒng)相連接,方便用戶和外部數(shù)據(jù)系統(tǒng)進(jìn)行集成。
安全機(jī)制
HStreamDB 的安全性將由 TLS 加密傳輸、基于 OAuth 和 JWT 等的身份認(rèn)證以及授權(quán)機(jī)制保證,同時(shí)預(yù)留安全插件接口,用戶可根據(jù)需要對(duì)默認(rèn)的安全機(jī)制進(jìn)行擴(kuò)展。
監(jiān)控和運(yùn)維工具
HStreamDB 設(shè)置了基于 Web 的控制臺(tái),包含大量的系統(tǒng)儀表盤和可視化圖表, 能夠?qū)簷C(jī)器狀態(tài),系統(tǒng)關(guān)鍵指標(biāo)等進(jìn)行詳細(xì)的監(jiān)控,方便運(yùn)維人員對(duì)集群進(jìn)行管理。
實(shí)時(shí)數(shù)據(jù)分析
傳統(tǒng)的數(shù)據(jù)分析通常基于批處理技術(shù), 批處理一般是在預(yù)先收集好的有限的數(shù)據(jù)集上運(yùn)行,因此分析的結(jié)果往往不包含最新的數(shù)據(jù),有較高的時(shí)延。HStreamDB 能夠?qū)?shí)時(shí)的數(shù)據(jù)流進(jìn)行分析,并隨著數(shù)據(jù)流的變化及時(shí)地更新結(jié)果,這能夠更好的支持諸如網(wǎng)站用戶活動(dòng)實(shí)時(shí)預(yù)測(cè)、物聯(lián)網(wǎng)傳感器數(shù)據(jù)實(shí)時(shí)分析等應(yīng)用。相比批處理,不但能提供更實(shí)時(shí)的數(shù)據(jù)洞察, 而且避免了周期性調(diào)度批處理任務(wù)的易出錯(cuò)和復(fù)雜性。
事件驅(qū)動(dòng)應(yīng)用
事件驅(qū)動(dòng)應(yīng)用通常是根據(jù)到來(lái)的事件實(shí)時(shí)觸發(fā)對(duì)應(yīng)的動(dòng)作或行為, 它可以是無(wú)狀態(tài)的或者帶狀態(tài)的,比如:金融交易中的實(shí)時(shí)欺詐檢測(cè),業(yè)務(wù)流程監(jiān)控預(yù)警物聯(lián)網(wǎng)規(guī)則引擎等。基于 HStreamDB,實(shí)現(xiàn)這些復(fù)雜的事件驅(qū)動(dòng)應(yīng)用可能僅需要寥寥幾條僅僅需要幾條 SQL 語(yǔ)句,大大降低了開發(fā)和維護(hù)這些應(yīng)用的成本。
實(shí)時(shí)數(shù)據(jù)管道
企業(yè)內(nèi)部往往需要在多個(gè)數(shù)據(jù)系統(tǒng)之間進(jìn)行數(shù)據(jù)同步和遷移, 比如將在線的事務(wù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)拷貝到離線的數(shù)據(jù)倉(cāng)庫(kù)進(jìn)行分析,這個(gè)過(guò)程通常是由一整套 ETL 系統(tǒng)完成的, 這類 ETL 系統(tǒng)的開發(fā)和維護(hù)成本都比較高, 而且它的數(shù)據(jù)同步往往不是實(shí)時(shí)的, 擴(kuò)展性也比較差。HStreamDB 集成了多種外部系統(tǒng)的連接器, 能夠非常方便地搭建實(shí)時(shí)的數(shù)據(jù)管道, 實(shí)現(xiàn)實(shí)時(shí)構(gòu)建索引,實(shí)時(shí)構(gòu)建緩存等數(shù)據(jù)同步任務(wù)。
在線機(jī)器學(xué)習(xí)
如今機(jī)器學(xué)習(xí)系統(tǒng)在業(yè)務(wù)系統(tǒng)中起著越來(lái)越重要的作用, 包括搜索、推薦、風(fēng)控等事件背后都廣泛依賴機(jī)器學(xué)習(xí)系統(tǒng)。然而隨著在線業(yè)務(wù)及相關(guān)應(yīng)用場(chǎng)景的井噴式發(fā)展, 常規(guī)的離線系統(tǒng)及離線機(jī)器學(xué)習(xí)平臺(tái)已無(wú)法滿足業(yè)務(wù)發(fā)展要求。HStreamDB 的實(shí)時(shí)計(jì)算引擎能夠助力機(jī)器學(xué)習(xí)系統(tǒng)的實(shí)時(shí)化, 實(shí)現(xiàn)在線特征提取,實(shí)時(shí)推薦等應(yīng)用。
下面我們將基于 docker 快速上手使用 HStreamDB。
拉取 docker 鏡像
docker pull hstreamdb/logdevicedocker pull hstreamdb/hstream
在 docker 中啟動(dòng)一個(gè)本地的 HStream Server
創(chuàng)建一個(gè)目錄用于存儲(chǔ)數(shù)據(jù)
mkdir ./dbdata啟動(dòng) HStream Storage
docker run -td --rm --name some-hstream-store -v dbdata:/data/store --network host hstreamdb/logdevice ld-dev-cluster --root /data/store --use-tcp啟動(dòng) HStreamDB Server
docker run -it --rm --name some-hstream-server -v dbdata:/data/store --network host hstreamdb/hstream hstream-server --port 6570 -l /data/store/logdevice.conf啟動(dòng) HStreamDB CLI
docker run -it --rm --name some-hstream-cli -v dbdata:/data/store --network host hstreamdb/hstream hstream-client --port 6570如果一切正常的話,進(jìn)入 CLI 后你會(huì)看到類似下面的信息:
Start HStream-Cli!Command:h help command:q quit clishow queries list all queriesterminate query <taskid> terminate query by idterminate query all terminate all queries<sql> run sql>
創(chuàng)建數(shù)據(jù)流
下面我們將用 CREATE STREAM 語(yǔ)句創(chuàng)建一個(gè)新的數(shù)據(jù)流,
CREATE STREAM demo WITH (FORMAT = "JSON");在 CLI 中執(zhí)行上述語(yǔ)句后,你會(huì)看到類似下面的信息,表示執(zhí)行成功。
Right( CreateTopic{ taskid = 0, tasksql = "CREATE STREAM demo WITH (FORMAT = "JSON");", taskStream = "demo", taskState = Finished, createTime = 2021 - 02 - 04 09 : 07 : 25.639197201 UTC})
執(zhí)行一個(gè)持續(xù)查詢
我們使用 SELECT 語(yǔ)句來(lái)對(duì)數(shù)據(jù)流進(jìn)行實(shí)時(shí)處理和分析。在 CLI 中執(zhí)行以下語(yǔ)句,
SELECT * FROM demo WHERE humidity > 70 EMIT CHANGES;執(zhí)行完成后會(huì)發(fā)現(xiàn)并沒(méi)有產(chǎn)生任何結(jié)果,這是正常的, 因?yàn)楝F(xiàn)在數(shù)據(jù)流中還沒(méi)有任何數(shù)據(jù), 接下來(lái)我們將向數(shù)據(jù)流中寫入一些數(shù)據(jù)并觀察結(jié)果。另外,請(qǐng)注意這個(gè) SELECT 語(yǔ)句不同于普通數(shù)據(jù)庫(kù)的SELECT 在一次執(zhí)行完畢后返回, 相反它會(huì)一直執(zhí)行下去, 除非你顯式的終止它。
開啟一個(gè)新的 CLI 會(huì)話
docker exec -it some-hstream-cli hstream-client --port 6570向數(shù)據(jù)流中插入數(shù)據(jù)
執(zhí)行以下 INSERT 語(yǔ)句向數(shù)據(jù)流中寫入數(shù)據(jù),
INSERT INTO demo (temperature, humidity) VALUES (22, 80);INSERT INTO demo (temperature, humidity) VALUES (15, 20);INSERT INTO demo (temperature, humidity) VALUES (31, 76);INSERT INTO demo (temperature, humidity) VALUES ( 5, 45);INSERT INTO demo (temperature, humidity) VALUES (27, 82);INSERT INTO demo (temperature, humidity) VALUES (28, 86);
如果一切運(yùn)行正常的話, 你將會(huì)在剛才的 CLI 窗口看到以下實(shí)時(shí)的輸出:
{"temperature":22,"humidity":80}{"temperature":31,"humidity":76}{"temperature":27,"humidity":82}{"temperature":28,"humidity":86}
作為一家開源基礎(chǔ)軟件供應(yīng)商,EMQ 始終堅(jiān)信開源的價(jià)值與力量,因此 HStreamDB 從立項(xiàng)之初就完全采用開源的方式在 GitHub 上進(jìn)行開發(fā)。
目前 HStreamDB 項(xiàng)目正在團(tuán)隊(duì)的努力下積極向前推進(jìn)著, 同時(shí)這也正是各位開源社區(qū)的伙伴們一同參與進(jìn)來(lái)的最好時(shí)機(jī)。
誠(chéng)邀大家與我們共同建設(shè) HStreamDB 的開源社區(qū):大家可以通過(guò)訪問(wèn) HStreamDB 的網(wǎng)站 (https://hstream.io/),或者 GitHub 項(xiàng)目地址(https://github.com/hstreamdb/hstream) 來(lái)了解項(xiàng)目相關(guān)信息,也歡迎加入我們的 Slack Channel (https://slack-invite.hstream.io/) 一起參與討論。我們還將定期舉辦 Open Day 活動(dòng),與大家分享項(xiàng)目進(jìn)展,交流技術(shù)心得。
在后續(xù)的規(guī)劃中,HStreamDB 將陸續(xù)支持和完善分布式處理支持、Schema 管理、SQL 優(yōu)化以及監(jiān)控和運(yùn)維等功能。
相信在每一個(gè)熱愛(ài)開源的伙伴的支持下,我們將以 HStreamDB 為標(biāo)桿, 共同創(chuàng)造和見證流數(shù)據(jù)庫(kù)的未來(lái)!
推 薦 閱 讀
點(diǎn)擊"閱讀原文" ,了解更多。
↓↓↓

