小 T 導讀:在北京智能建(jian)(jian)筑邊(bian)緣側(ce)采集數據(ju)(ju)(ju)存儲(chu)的方案中,面臨(lin)著在有限的計算資源下,如何實現(xian)最高(gao)效的數據(ju)(ju)(ju)存儲(chu)、分析和計算的問題(ti)。經過調研與測試(shi),最終選(xuan)擇了(le)由 TDengine Database 處理時(shi)序數據(ju)(ju)(ju),SQLite 處理關系(xi)數據(ju)(ju)(ju),以此更好(hao)地實現(xian)邊(bian)緣側(ce)的數據(ju)(ju)(ju)自(zi)治。本文講述了(le)他們的選(xuan)型和建(jian)(jian)模思(si)路以及落地后的效果展示(shi),作為經驗參(can)考分享給有需要(yao)的讀者。
公司簡介
北京(jing)(jing)智(zhi)能建(jian)筑(zhu)科技有限公(gong)司作為(wei)北京(jing)(jing)市在智(zhi)能建(jian)筑(zhu)和智(zhi)慧城市領域的創新平(ping)臺(tai),是冬(dong)奧(ao)科技平(ping)臺(tai)公(gong)司、智(zhi)慧冬(dong)奧(ao)國家重(zhong)點項目(mu)設計單(dan)位和核心實(shi)施單(dan)位,同時(shi),北智(zhi)建(jian)作為(wei)國家高新技術企業,致力于打造中國最大(da)的智(zhi)能建(jian)筑(zhu) AIoT 平(ping)臺(tai)。

在云計算模式中(zhong),采(cai)集(ji)的(de)數據必須要傳到云上進(jin)(jin)行集(ji)中(zhong)式的(de)存儲(chu)、歸檔及分(fen)析,依托云端(duan)計算資源進(jin)(jin)行復(fu)雜(za)的(de)計算,再將所得到的(de)指導性(xing)結論通過網絡下(xia)發給(gei)終端(duan)。而對(dui)于(yu)邊(bian)(bian)緣計算,即(ji)(ji)把一部分(fen)的(de)存儲(chu)和計算的(de)能力下(xia)沉到邊(bian)(bian)緣側(ce)(即(ji)(ji)設備(bei)側(ce)),由于(yu)終端(duan)設備(bei)可以(yi)較獨立地(di)進(jin)(jin)行數據存儲(chu)、計算、決(jue)策(ce)和應用,因此(ci)邊(bian)(bian)緣側(ce)會更加智能,對(dui)云端(duan)依賴更小,數據處理的(de)時效(xiao)性(xing)也更高,且不(bu)再受網絡影響(xiang)。
一般來(lai)說,邊緣側往(wang)往(wang)是一些能(neng)(neng)夠大量鋪設(she)的(de)小型智能(neng)(neng)終端,出于成(cheng)本考慮,其配置的(de)內存、CPU 等(deng)硬(ying)件(jian)資源和(he)計算能(neng)(neng)力(li)都很有(you)限(xian)。邊緣計算的(de)難點就在(zai)于能(neng)(neng)否在(zai)有(you)限(xian)的(de)計算資源下,實現最(zui)高效的(de)數據(ju)存儲、分析(xi)和(he)計算。總結下來(lai),邊緣計算對數據(ju)庫能(neng)(neng)力(li)的(de)要求主要反(fan)映在(zai)以下幾(ji)個方面,這(zhe)也是我們在(zai)選擇數據(ju)庫時的(de)重點考量維度(du):
- 超高讀寫性能
- 低硬件開銷
- 通用接口,適配邊緣側多樣計算需求
- 實時數據的緩存能力、流式計算能力
- 歷史數據持久化存儲、高效壓縮能力
- 歷史數據回溯能力、按時間窗口的統計聚合能力
一、技術選型
整體而言,時序數據庫(Time-Series Database)具備(bei)上述各項能力(li),也是邊緣側采集數據(ju)(ju)存儲的最佳選(xuan)擇。但(dan)市(shi)面(mian)上時(shi)序數據(ju)(ju)庫(ku)產(chan)品眾多,如何篩(shai)選(xuan)也是一個難點。
如(ru) OpenTSDB(底(di)層基(ji)于(yu) HBase 改造)、InfluxDB 等一(yi)(yi)類的(de)時序數(shu)(shu)據庫(ku),其(qi)運(yun)行起來(lai)的(de)硬(ying)件資(zi)源開(kai)(kai)銷過(guo)高(gao)(gao),對于(yu)邊(bian)緣側來(lai)說還(huan)是(shi)太(tai)重(zhong)了。后(hou)來(lai)我們觀察到了一(yi)(yi)個極輕量化(hua)的(de)開(kai)(kai)源時序數(shu)(shu)據庫(ku) —— TDengine,當(dang)時它的(de)整個安裝(zhuang)包只有 2 MB 多,使用 C 語言完全自主研發,核(he)心功能就是(shi)一(yi)(yi)個高(gao)(gao)性能分布式時序數(shu)(shu)據庫(ku)。具(ju)體優勢匯總如(ru)下:
- TDengine 社區已經發布了支持 ARM64 處理器的版本,可以順暢地運行在樹莓派等主流的邊緣側硬件上,同時提供對實時數據的緩存、歷史數據的回溯、按時間段進行聚合計算等多種能力。
- TDengine ARM 版本支持的接口也有很多種,與正常集群版幾乎沒有區別。同時,它還提供了一個 taos shell 客戶端,讓調試人員可以方便地去查看 TDengine 的運行狀態。
- 支持包括 C/C++、JAVA、Python、RESTful、Go 在內的多種語言,學習成本低
- 安裝超級簡單,無任何依賴

- 使用便捷
SQLite VS TDengine
另(ling)外(wai)提起邊緣側、嵌入式設備中的(de)數(shu)據(ju)(ju)存儲,那(nei)就不(bu)得不(bu)提 SQLite。SQLite 是一個不(bu)需要后臺(tai)的(de)超輕量級數(shu)據(ju)(ju)庫,即(ji)插(cha)即(ji)用的(de)特點也讓它成為世(shi)界(jie)上裝機量最高(gao)的(de)數(shu)據(ju)(ju)庫。SQLite甚至(zhi)(zhi)在官網上將自身定位與 fopen() 對標(biao),而不(bu)再是作為一款數(shu)據(ju)(ju)庫。SQLite 提供的(de)一系列 API 都是對標(biao)關系型數(shu)據(ju)(ju)庫的(de),它甚至(zhi)(zhi)還支持了事務,因(yin)此業界(jie)常常把(ba)它用作嵌入式關系型數(shu)據(ju)(ju)庫。其與 TDengine 的(de)各項對比(bi)如下(xia):

從上面(mian)的比較中(zhong)我們可以看到,TDengine 和 SQLite 要(yao)處理(li)(li)的問題(ti)側重點(dian)不同,各有所長。從我們自身(shen)業(ye)務的切實需求(qiu)出發,兩(liang)者并(bing)非必須(xu)要(yao)進行(xing)取舍,而是可以根(gen)據(ju)(ju)業(ye)務需求(qiu)靈活(huo)搭配使用(yong)——由 TDengine 處理(li)(li)時序(xu)數(shu)據(ju)(ju),由 SQLite 處理(li)(li)關系數(shu)據(ju)(ju),以此(ci)更好(hao)地實現邊緣側的數(shu)據(ju)(ju)自治。基于(yu)此(ci),在(zai)存(cun)儲方面(mian)我們決定采用(yong) TDengine + SQLite 的組(zu)合(he)形式。

二、架構與具體實現
技術架構
- 物理視圖

- 邏輯視圖

在邊緣端日志功能(為邊緣端的設備提供日志上報)的設計上,我們采用 TDengine 對日志進行存儲,該功能的(de)(de)設計(ji)是為(wei)出現異(yi)常狀況的(de)(de)設備提供溯源(yuan)依據(ju),在與告警功能配(pei)合(he)下(xia)可以讓開(kai)發人員快速定位到問題,及時進行(xing)解決(jue)。此外在邊(bian)緣端(duan)進行(xing)日(ri)志處理(li),就(jiu)能利用邊(bian)緣端(duan)的(de)(de)算(suan)力(li)減輕(qing)中臺的(de)(de)壓力(li),還可以支撐 2 萬設備異(yi)常情況下(xia)的(de)(de)日(ri)志并發寫入。
對于設備的采集值,我們同樣采用 TDengine 進行存儲和檢索。以往采用關系型數(shu)據(ju)庫進行存儲(chu)時,在(zai)設備比較多、數(shu)據(ju)量龐大(da)的情(qing)況下,查(cha)詢會非常的慢,體(ti)驗(yan)感極差。反觀(guan) TDengine 高壓縮(suo)算法能提(ti)升 10 到 20 倍的壓縮(suo)性(xing)能,降低存儲(chu)壓力的同(tong)時也解決了數(shu)據(ju)存儲(chu)成本高的問題,還達到了降低硬件成本的效果(guo)。
建表建庫思路
- 直接輸入 taos 進入 TDengine 界面
- SHOW DATABASES 查看數據庫
- USE db_name; 選擇數據庫
- SHOW TABLES; 查看表
- CREATE DATABASE 創建庫
- CREATE TABLE 創建表
- INSERT INTO 插入數據
- SELECT 查詢數據


三、落地效果
在產(chan)品(pin)開(kai)發初期階(jie)段,我(wo)們也嘗試(shi)過其他類型的(de)數據(ju)庫(ku)解決方案,但都(dou)因為各種問(wen)題(ti)而擱置了。因為研發團(tuan)隊精力人力有限,我(wo)們沒有考慮(lv)過自己搭(da)建一套(tao)大數據(ju)處理平臺,畢竟(jing)要(yao)充分(fen)整合 Kafka、HBase、Hadoop、Spark 這一系列開(kai)源框(kuang)架不(bu)(bu)僅意味要(yao)花費大量人力,還需要(yao)更多的(de)時間去調(diao)試(shi)開(kai)源框(kuang)架本身的(de)問(wen)題(ti),融合及聯調(diao)不(bu)(bu)同框(kuang)架也存在著很多數據(ju)一致(zhi)性的(de)問(wen)題(ti),同時也意味著后(hou)期運(yun)維成本的(de)大幅度增(zeng)加,穩定性也是(shi)個不(bu)(bu)小的(de)未知數。
所幸遇到了 TDengine,它幫助我們在邊緣側解決了一個很大的問題,即邊緣存儲的問題。因為很多時候邊緣是布署在資源比較少的機器上面,甚至是 ARM 的工業盒子上面,在資源使用上非常的苛刻,而現在得益于 TDengine 超強的壓縮算法,我們使用非常小的存儲空間就存儲了幾千萬數據,壓縮率遠超 1/20,在單機上面布署一個 TDengine 服務器就可以輕輕松松地存儲上億的數據。
此外它還擁有超強的計算能力,占用的資源也非常小,在我們的業務中千萬級數據檢索時間達到了毫秒級,從用戶角度來說產品體驗非常好。在運維層(ceng)面,TDengine 提供標準(zhun)的(de)(de) SQL 語法,有(you)過 SQL 使用(yong)經驗的(de)(de)同學基本(ben)上很快(kuai)就能上手,學習成(cheng)本(ben)接近(jin)于零。
四、寫在最后
事實上,TDengine 這款 Database 我(wo)(wo)已經關(guan)注很久(jiu)了,我(wo)(wo)也和(he)濤思(si)的(de)(de)同學們(men)提(ti)出過(guo)一些(xie)在使用過(guo)程(cheng)中發(fa)現的(de)(de) Bug,從最(zui)初的(de)(de)版本到(dao)現在的(de)(de)產(chan)品(pin),TDengine 變得更(geng)加(jia)強(qiang)大和(he)成(cheng)熟。作為它的(de)(de)“老(lao)朋(peng)友”,我(wo)(wo)在此也提(ti)出兩個改(gai)進優化建議,以(yi)便幫助(zhu)它更(geng)好(hao)的(de)(de)成(cheng)長:
- 現在安裝 TDengine Server 時要向下兼容 TaosClient,如果在升級 Server 時,我不需要再在自己的服務器上面同時升級 TaosClient,可以減少一些部署步驟。
- 如果我們用 kubernetes 進行部署,POD 刪掉重啟后服務就無法啟動了,還需要在掛載的數據文件夾里面手動去修改配置,非常地不靈活。
我們(men)與 TDengine 的(de)(de)合作(zuo)不會止于(yu)此(ci),未來等到 TDengine 更加(jia)成熟穩定后(hou),不僅我們(men)的(de)(de)邊緣(yuan)計(ji)算存儲要使用(yong)它,甚至我們(men)的(de)(de)中臺數據也要遷移到上(shang)面(mian)。


























