小 T 導讀:為(wei)了滿足智能(neng)駕駛業務(wu)的數據(ju)(ju)處理(li)需(xu)求,大(da)疆(jiang)車載試圖從(cong)多家數據(ju)(ju)庫中進行選(xuan)型(xing)調研,幫助智能(neng)駕駛業務(wu)提(ti)升寫入查詢性能(neng)、降低(di)運維成本。本文將分(fen)享(xiang)大(da)疆(jiang)車載在數據(ju)(ju)庫選(xuan)型(xing)、系統搭(da)建和業務(wu)遷移(yi)等方面的經驗(yan)。
根據國家(jia)發(fa)(fa)改委、科(ke)技部(bu)、工信部(bu)等 11 個部(bu)門聯(lian)合(he)印發(fa)(fa)的《智(zhi)(zhi)(zhi)能(neng)(neng)(neng)汽(qi)(qi)車(che)(che)創新發(fa)(fa)展戰略》,到(dao) 2025 年,中(zhong)國標(biao)準(zhun)智(zhi)(zhi)(zhi)能(neng)(neng)(neng)汽(qi)(qi)車(che)(che)的技術(shu)創新、產(chan)業(ye)生態、基(ji)礎設(she)施(shi)、法規標(biao)準(zhun)、產(chan)品監(jian)管和網(wang)絡安全(quan)體系基(ji)本形成。同時(shi),實現有條件(jian)智(zhi)(zhi)(zhi)能(neng)(neng)(neng)駕(jia)駛(shi)(shi)的智(zhi)(zhi)(zhi)能(neng)(neng)(neng)汽(qi)(qi)車(che)(che)達到(dao)規模化生產(chan),實現高度智(zhi)(zhi)(zhi)能(neng)(neng)(neng)駕(jia)駛(shi)(shi)的智(zhi)(zhi)(zhi)能(neng)(neng)(neng)汽(qi)(qi)車(che)(che)在(zai)特(te)定環境下(xia)市場化應用。目前,隨著我國正在(zai)積(ji)極發(fa)(fa)展智(zhi)(zhi)(zhi)能(neng)(neng)(neng)網(wang)聯(lian)汽(qi)(qi)車(che)(che),無(wu)人駕(jia)駛(shi)(shi)技術(shu)進一步(bu)推動,互聯(lian)網(wang)巨頭企業(ye)進入(ru)市場、加大投入(ru)研發(fa)(fa)技術(shu),無(wu)人駕(jia)駛(shi)(shi)市場正處于快速發(fa)(fa)展階段。無(wu)人機頭部(bu)企業(ye)大疆車(che)(che)載也(ye)在(zai)去年 4 月份宣布(bu)進入(ru)智(zhi)(zhi)(zhi)能(neng)(neng)(neng)駕(jia)駛(shi)(shi)領域。
由于當前的智能(neng)駕駛(shi)業務(wu)還(huan)是新的業務(wu)場(chang)景,所以大疆車載在(zai)選型(xing)上的歷(li)史負擔(dan)相對較(jiao)輕(qing)。在(zai) Database 選型(xing)要求上,從(cong)業務(wu)需(xu)(xu)求出發,主要聚(ju)焦(jiao)在(zai)兩點:首(shou)先,結合當下的業務(wu)場(chang)景,需(xu)(xu)要滿(man)足單臺車輛的高頻消息上報頻率;其次,支持在(zai)數據量(liang)大的時(shi)候,通過聚(ju)合函(han)數,或選擇函(han)數來快速篩(shai)選出需(xu)(xu)要的數據。
此外,對數(shu)據(ju)庫(ku)要求支(zhi)持集(ji)群部署的(de)(de)同時,也要求更低的(de)(de)查(cha)詢語句(ju)編寫上(shang)手難(nan)度;而且需支(zhi)持單表千萬(wan)量(liang)級,在海量(liang)數(shu)據(ju)并發場景下(xia),需要有較(jiao)高的(de)(de)統(tong)計報(bao)表能力和(he)較(jiao)好的(de)(de)查(cha)詢 SQL 效率;最后(hou)通(tong)過(guo)數(shu)據(ju)壓縮、運(yun)維(wei)成(cheng)本和(he)并發能力上(shang)的(de)(de)考量(liang),最終選定 TDengine 來存(cun)儲海量(liang)數(shu)據(ju)。
綜合來看,TDengine 滿足需求(qiu)的(de)主(zhu)要(yao)原因(yin)如(ru)下:
- 國產、開源的時序數據庫(Time Series Database)
- 開源版支持分布式集群,方便擴展
- 列式存儲,數據壓縮比率高,讀寫性能優秀
- 一個設備一張表,對應我們一個車輛一張表,模型契合
- 超級表對于分組聚合查詢的強大支持能力
?TDengine 建表思路
作為智能駕駛(shi)領域的創新者之一,大疆車(che)載為汽車(che)主機(ji)廠提供了軟硬一體(ti)的智能駕駛(shi)解(jie)決方(fang)案。其中,車(che)輛(liang)云端(duan)平臺負責對車(che)輛(liang)狀態(tai)信息進行監(jian)控(kong),具體(ti)包括 GPS、速度、轉速、里程(cheng)等,經由 MQTT 流轉到 TDengine 存儲,滿足車(che)輛(liang)歷(li)史軌跡回(hui)放和車(che)輛(liang)實時狀態(tai)監(jian)控(kong)。
車輛消息樣例數據展示(shi)如(ru)下:
{"message_id": "a78b6d9a","device_key": "deviceKey2","ts": "2022-03-01 15:01:59","longitude": 123.9795647512915,"latitude": 21.58338210717887,"altitude": 51.47800064086914,"signal_strength": 12,"satellites_in_view": 21,"speed": 72.798225,"acceleration": 12,"rpm":2190,"gear": "D","direction": -91.32959,"mileage": 10020,"ip": "10.1.2.3","create_time": "2022-03-01 15:02:03",}
落腳到實際業務上,我們搭建的表結構如下:

我們落地使用的(de)是(shi) TDengine 2.2.1.3 單機版 ,按照車(che)輛唯(wei)一(yi)的(de)標識 DeviceKey 來創建子表(biao)(biao),如(ru) device_stat_$deviceKey,一(yi)個車(che)輛的(de)狀態信(xin)息都存在一(yi)張子表(biao)(biao)中。mqtt_msg 超級(ji)表(biao)(biao)也是(shi)一(yi)樣的(de)邏(luo)輯,也是(shi)以(yi) DeviceKey 來創建子表(biao)(biao)。

架構與遷移

除了上(shang)報的(de)(de)(de) GPS、速度等(deng),App 端還會和(he)車(che)輛/設備之間進(jin)行(xing)大量的(de)(de)(de)命令交(jiao)互,如下發車(che)輛指令操作,這些我們(men)也是使(shi)用 TDengine 來進(jin)行(xing)存儲和(he)鏈路追蹤的(de)(de)(de)。具體到(dao)鏈路消(xiao)息(xi)追蹤的(de)(de)(de)使(shi)用上(shang),我們(men)會將(jiang)設備與云端、云端與 App 之間雙向通信的(de)(de)(de) MQTT 消(xiao)息(xi)轉發到(dao) Kafka 消(xiao)息(xi)隊列中(zhong),然(ran)后業務系統進(jin)行(xing)消(xiao)費(fei)解析,得到(dao) TraceID、消(xiao)息(xi) ID、消(xiao)息(xi)版本、消(xiao)息(xi)類型、消(xiao)息(xi)時間戳、消(xiao)息(xi)內(nei)容等(deng)不同字段(duan)的(de)(de)(de)數(shu)據,然(ran)后將(jiang)其寫入 TDengine 的(de)(de)(de) mqtt_msg 超級表當中(zhong)。
除(chu)了寫入(ru)以外(wai),我們(men)也有一定量的查(cha)詢(xun)操(cao)作(zuo),但(dan)是(shi)(shi)整體(ti)上還(huan)是(shi)(shi)以寫入(ru)為(wei)主,目前 TDengine 的性能完全(quan)可以滿足我們(men)的需(xu)求。不過文本類的檢索并不是(shi)(shi) TDengine 最(zui)擅長的場景,于是(shi)(shi)我們(men)接入(ru)了 ES 提供(gong)部(bu)分服務。
由于是項目初期,目前我(wo)們暫時還(huan)在(zai)使用(yong)(yong) TDengine 和 MySQL 雙寫(xie)新數據(ju),把 MySQL 的 SQL 和 TDengine 的 SQL 做了映射關(guan)系,從而實現將(jiang)歷史數據(ju)以日志(zhi)回放的方式遷移到(dao) TDengine 中去(qu)。因(yin)此,目前兩個庫暫時可以互(hu)為備份(fen),后面等業務完全(quan)遷移后,我(wo)們就可以使用(yong)(yong) TDengine 的集(ji)群多副(fu)本功能來完成數據(ju)備份(fen)了。
此外,濤(tao)思數(shu)據的(de)工作(zuo)人員也提供(gong)了(le)另外兩種數(shu)據遷移(yi)方案(an)供(gong)我們參考:一(yi)是利(li)用 csv 文件的(de)導出導入。二則是基于一(yi)款開源的(de)數(shu)據庫遷移(yi)工具 DataX,該工具目前(qian)已(yi)經完(wan)成(cheng)了(le)關系型數(shu)據庫(Relational Database)到 TDengine 的(de)適配(pei),實現了(le) TDengineReader 和 TDengineWriter 兩個插件,遷移(yi)時只要做(zuo)好(hao)相(xiang)應的(de) json 文件配(pei)置(zhi)即(ji)可。

性能展示
在應用(yong) TDengine 之后,車輛的(de)實(shi)時(shi)狀態(tai)查詢變得十分簡(jian)單,具(ju)體展示如下:
1. 查詢單個車輛的上報的最新位置狀態
select last_row(*) from device_stat_deJgTAEzInsZeGLM\G;

2. 多個車輛的最新位置狀態查詢
select last_row(*) from device_stat where device_key in ('mpVOGpaHqAxGiHWo','HEChzTCZeIWSUysB','HgsIdzvJPeFlVDuT','LVaPHOXkEeTGjTpm','PFHnQCkcXCIBnbsC') group by device_key;

對于車輛歷史時間區間內的狀態查詢,也可以極快地返回結果,用以進行前端分析。
select * from device_stat_mpVOGpaHqAxGiHWo where ts >'2022-03-17 00:00:00' and ts < '2022-03-18 00:00:00';

3. 進行 MQTT 消息追蹤時,查詢 MQTT Broker 收發的最新消息
select last_row(*) from mqtt_msg\G;

4. 按照 requestId 進行消息追蹤
select * from mqtt_msg where request_id = 'f90c46d4-22a3-4ab9-b50a-aad8b237fc57'\G;

5. 時間區間內消息查詢
select * from mqtt_msg where ts >'2022-03-18 12:00:00' and ts < '2022-03-18 13:00:00';

通過以上的查詢情況匯總可以看出,TDengine 實現了一些選擇特定數據的查詢和輕量的查詢,全部都是毫秒級返回數據,即便是 30000+ 行數據的查詢,消耗也只在 1.1 秒左右。
寫在最后
在當前的云端平(ping)臺中,TDengine 的應用不僅節(jie)約了(le)存(cun)儲成本和開(kai)發學習(xi)成本,同(tong)時也表現出了(le)很(hen)好(hao)的寫入(ru)讀取性能,滿足了(le)智能駕駛(shi)云端平(ping)臺海量時序數據的處理需求。
未來我(wo)們會對海量時空(kong)數據的(de)應用場景(jing)進行持續探索和挖掘,對于 TDengine 我(wo)們也有更(geng)多(duo)的(de)期許,希望它能(neng):
- 在空間數據的讀寫上有新的特性和更好的支持
- 擁有更加豐富的認證授權機制,提供更細粒度的權限管控
- 系統性地豐富各類日志,協助更快地定位問題
最后(hou),祝(zhu)愿 TDengine 越來越好(hao),能夠在中(zhong)國(guo)龐大的時(shi)序數(shu)據(ju)處(chu)理場景中(zhong)脫(tuo)穎而出,成為國(guo)產(chan)數(shu)據(ju)庫中(zhong)的精品!


























