小 T 導讀:為了(le)(le)實現業務更(geng)好地發(fa)展,我們有時(shi)(shi)必須做(zuo)出(chu)數(shu)據庫(ku)替換(huan)的決定,這(zhe)時(shi)(shi)要特別(bie)慎重。想要真正(zheng)了(le)(le)解一款數(shu)據庫(ku)產品,調(diao)研和測(ce)試必不(bu)可少,需(xu)要耗費大(da)量(liang)時(shi)(shi)間和精力。在本篇文(wen)章中,作者描述了(le)(le)自己與 TDengine Database 從初(chu)識到了(le)(le)解再(zai)到深交的經(jing)歷,將自己從調(diao)研階段到實際應用之后的問題、效(xiao)果等做(zuo)成了(le)(le)經(jing)驗匯總,分享出(chu)來以作參(can)考(kao)。
一、與 TDengine 的開始
實際上,我從事 Java 開發的時間只有三年左右,在這個階段中,因為我所涉及的業務場景和行業都用不到時序數據庫,所(suo)以(yi)我完(wan)全(quan)沒有接觸和了解過這種類型的產品,僅僅是(shi)聽(ting)說過而已。
2021 年 5 月(yue)我換(huan)了(le)一(yi)個(ge)(ge)(ge)行業,從公司的(de)(de)(de)第一(yi)個(ge)(ge)(ge)項(xiang)目(mu)(mu)中(zhong)認識了(le)時(shi)序(xu)型數據(ju)庫(ku)(ku) InfluxDB ,也算是(shi)對這種類型的(de)(de)(de)數據(ju)庫(ku)(ku)有了(le)初(chu)步的(de)(de)(de)了(le)解。與 TDengine Database 的(de)(de)(de)結識還(huan)要從下一(yi)個(ge)(ge)(ge)項(xiang)目(mu)(mu)說(shuo)起,這個(ge)(ge)(ge)項(xiang)目(mu)(mu)是(shi)我全程參與的(de)(de)(de),項(xiang)目(mu)(mu)類型和(he)之前(qian)的(de)(de)(de)類似,但技術選型發生了(le)一(yi)些變(bian)化——要做時(shi)序(xu)數據(ju)庫(ku)(ku)的(de)(de)(de)替(ti)換(huan)。
最(zui)初給我(wo)(wo)的(de)任務(wu)是(shi)(shi)去調研(yan)了(le)解一(yi)(yi)下 TDengine 是(shi)(shi)否(fou)能貼合我(wo)(wo)們(men)的(de)業(ye)務(wu)場景和使用需求(qiu),當時我(wo)(wo)還是(shi)(shi)比較忐忑的(de),因為(wei)最(zui)終調研(yan)的(de)結(jie)(jie)果會直接影響到是(shi)(shi)否(fou)選用 TDengine 、選用結(jie)(jie)果的(de)好壞、后(hou)續代碼編程是(shi)(shi)否(fou)會遇到一(yi)(yi)些(xie)不可(ke)預測的(de)問題。為(wei)了(le)更加了(le)解 TDengine,我(wo)(wo)開(kai)始與濤(tao)思數據(ju)的(de)小伙伴們(men)打起了(le)交道(dao),與 TDengine 的(de)故事也就此拉開(kai)序幕。
二、對 TDengine 進行調研
就個人習慣而言,我首先會通過閱讀官網上的官方文檔來(lai)對一個全新的產(chan)品(pin)進行學習(xi)和了解,并嘗試使用。
但(dan)我出師(shi)不(bu)利(li),剛走到 TDengine 的安裝和(he)啟動時,就遇到了(le)一個麻煩事(下圖所示),這個問題我記在(zai)了(le)使用(yong)筆記上,所以印象比較深刻(ke)。


在此給大家還原下事情的經過,本次操作是在 Linux 環境下,按照文檔的提示,我先下載好 TDengine 的安裝包進行解(jie)壓安(an)裝(zhuang),安(an)裝(zhuang)后點(dian)擊啟(qi)(qi)(qi)動(dong)(dong),輸(shu)入(ru) taos 命令,當時我進行了(le)一(yi)下重(zhong)新啟(qi)(qi)(qi)動(dong)(dong)(現在也想不(bu)清重(zhong)啟(qi)(qi)(qi)的原因了(le)),之后就一(yi)直(zhi)會(hui)出現“啟(qi)(qi)(qi)動(dong)(dong)頻繁(fan)無法啟(qi)(qi)(qi)動(dong)(dong)”的提示,我運用了(le)很多辦法都沒(mei)(mei)能解(jie)決,后面通過官網上(shang)的微信二維(wei)碼(ma)聯(lian)系上(shang)了(le) TDengine 官方(fang)小(xiao)助手(shou),把這些問(wen)題匯報給(gei)了(le)技術人員,但不(bu)知(zhi)道是(shi)不(bu)是(shi)我的電腦虛擬機配置機制有問(wen)題,反正依然沒(mei)(mei)有找(zhao)到合適的解(jie)決方(fang)法,最后我還(huan)是(shi)選擇直(zhi)接重(zhong)置了(le)虛擬機,重(zhong)新安(an)裝(zhuang) TDengine,問(wen)題也就迎刃而解(jie)了(le)。
做出(chu)重置的決定(ding)我(wo)也是下了很大(da)決心的,由此也可以看(kan)出(chu)我(wo)對 TDengine 進行(xing)嘗試使用的堅定(ding)想法。
在 TDengine 的使用過程中,我遇到了第二個問題,起因是我想通過可視化工具對數據庫進行相應的操作,官網文檔提供的是利用 IDEA 進行可(ke)(ke)視化(hua)操(cao)(cao)作(zuo),我(wo)自己本(ben)身也是通過 IDEA 工具進行編(bian)程的(de),按理說應該很順暢,但我(wo)使用 IDEA 有報錯(cuo)信息,無法成(cheng)功進行可(ke)(ke)視化(hua)操(cao)(cao)作(zuo)。其實無法進行可(ke)(ke)視化(hua)操(cao)(cao)作(zuo)倒也不會影(ying)響我(wo)對數據庫的(de)操(cao)(cao)作(zuo),但如果(guo)可(ke)(ke)視化(hua)實現了就(jiu)可(ke)(ke)以更高效地操(cao)(cao)作(zuo)數據庫了。
為了(le)解決(jue)(jue)這(zhe)(zhe)個(ge)問題(ti),我先是進入 TDengine 的(de)(de) GitHub 開(kai)源地址()尋找了(le)下答案(an),尋找無果后通過郵(you)件方式(shi)將這(zhe)(zhe)個(ge)問題(ti)遞交(jiao)給 TDengine 的(de)(de)研發(fa)人員(yuan)進行相(xiang)關咨詢,所幸經過一系列溝通,這(zhe)(zhe)個(ge)問題(ti)得到(dao)了(le)比較好的(de)(de)解決(jue)(jue)。

通過官方人員發給我的可視化工具(現(xian)在我們開發也在經常使用這個(ge)工(gong)具),可(ke)視(shi)化問題得到了解決(jue)。在我將(jiang) TDengine 升(sheng)級為 2.1.0.0 后,就可(ke)以直接(jie)通(tong)過(guo) IDEA 進行(xing)可(ke)視(shi)化操作了,由此可(ke)見,官方確實(shi)是在用心聽取(qu)用戶聲音,進行(xing)產品迭代(dai)。
值得一提的是,TDengine 的 SQL 語法還是很贊的,部分的 SQL 語法跟我經常使用的 MySQL 類似,學習成本比較低,很好上手,這部分都是后面根據實際業務場景編寫的,遇到問題的時候我們就會及時去官網看看語法,或者去咨詢相應的技術人員,不得不說,TDengine 的社區支持力度還是值得稱贊的。在這塊的學習上,就是超級表和普通(tong)表的概念需要我仔細研讀下,目前(qian)也已(yi)經很(hen)好地運用在我們(men)的工業(ye)業(ye)務場景上了(le)。
另外還有一個要解決的問題就是我們自身的 Java 如何和 TDengine 相結合去使用,最終我們是要通過 Java 編程和 TDengine 進行交互的,TDengine 的技術人員很完美的解決了這個問題—— 以 Spring Boot + MyBatis 結合 TDengine 和 JDBC,成功實現了 Demo ,這個在 TDengine 官網上有文檔,大家有需要可(ke)以直接參考。
最后就(jiu)是(shi)性能方面(mian)的考(kao)量(liang),從 TDengine 的官(guan)網上我們(men)(men)獲(huo)得了(le)一(yi)個可以(yi)(yi)創建超多(duo)數(shu)據(ju)的 SQL ,首(shou)先基(ji)于此體驗(yan)了(le)一(yi)下查(cha)詢速度(du),速度(du)確實(shi)是(shi)很快,其(qi)次我們(men)(men)發現存儲如此龐大的數(shu)據(ju)量(liang),占用的磁盤空間卻并不是(shi)非常大,節省了(le)更多(duo)存儲空間。關于性能的體驗(yan),后面(mian)我會輔(fu)以(yi)(yi)實(shi)際案例再詳細說明(ming)一(yi)下。
三、最終的選擇
在進行(xing)這么多了解和嘗試后,我們也跟 InfluxDB 做了一(yi)個對比,綜(zong)合考量下來,就決(jue)定選擇(ze) TDengine 了。
首先,超級(ji)表(biao)(biao)普通(tong)表(biao)(biao)的(de)(de)概念非常契合(he)本(ben)次項(xiang)目的(de)(de)業務(wu)場景。此前我們的(de)(de)項(xiang)目是一個站(zhan)點(dian)一個單元對(dui)(dui)應(ying)多個測(ce)點(dian),現在是多站(zhan)點(dian)多單元下(xia)面對(dui)(dui)應(ying)多個測(ce)點(dian),利用超級(ji)表(biao)(biao)普通(tong)表(biao)(biao)就可以(yi)做到超級(ji)表(biao)(biao)對(dui)(dui)應(ying)某(mou)個站(zhan)點(dian)某(mou)個單元,下(xia)面跟著 n 個普通(tong)表(biao)(biao),普通(tong)表(biao)(biao)就是此站(zhan)點(dian)此單元下(xia)對(dui)(dui)應(ying)的(de)(de)測(ce)點(dian),業務(wu)在創建表(biao)(biao)時會更加(jia)便利。
其次,它可以很好地跟(gen) Java 進行結合,通過 JDBC 連接(jie),跟(gen)之(zhi)前操作其他(ta)類型的數據庫類似,不需(xu)要學(xue)習太多(duo)就可以上手,讓沒有很深入了解過 TDengine 的人上手也比較快,學(xue)習成(cheng)本顯著降(jiang)低。
第三,搭建集群的成本更低(di)廉。眾(zhong)所周知,InfluxDB 集(ji)(ji)群(qun)功能(neng)是閉源的,如果(guo)后續業務發展需要(yao)用(yong)(yong)到集(ji)(ji)群(qun)時(shi)會(hui)帶來很(hen)大的不便,然而(er) TDengine 的集(ji)(ji)群(qun)功能(neng)是開源的,可(ke)以顯著降低(di)集(ji)(ji)群(qun)的使用(yong)(yong)成本,從而(er)減少項目上的使用(yong)(yong)成本。
第(di)四,從更大的(de)角(jiao)度(du)說(shuo),我(wo)們應該(gai)響應政策號召多支(zhi)(zhi)持國產開(kai)(kai)源(yuan),而且從技術(shu)支(zhi)(zhi)持的(de)角(jiao)度(du)來說(shuo),選用國外的(de)數據庫會讓我(wo)們非(fei)常被(bei)動,但(dan)是(shi)國內的(de)開(kai)(kai)源(yuan)數據庫是(shi)由國人開(kai)(kai)發和維護(hu)的(de),遇到(dao)問題時(shi)就可以直接通過(guo)微信/郵箱(xiang)等工具進(jin)行交流,溝通上更加有效(xiao)方(fang)便。
第五,性(xing)能(neng)表(biao)現(xian)突出,從之(zhi)前的(de)(de)項(xiang)(xiang)目和(he)現(xian)在(zai)的(de)(de)項(xiang)(xiang)目對(dui)比來看,部分(fen)使用能(neng)感受到(dao)明顯差異,此處表(biao)現(xian)放在(zai)后面(mian)的(de)(de)章節上(shang)詳說,整體上(shang)性(xing)能(neng)表(biao)現(xian)上(shang)是良好的(de)(de)。
四、項目使用上的感受
1. 我們有(you)一個歷史(shi)(shi)數據的(de)查看(kan)功(gong)能,會(hui)(hui)直接(jie)(jie)在頁面展示一個歷史(shi)(shi)曲線。之前使(shi)用(yong) InfluxDB 的(de)時(shi)候,如果你的(de)時(shi)間(jian)段和時(shi)間(jian)間(jian)隔(ge)選擇很(hen)龐大或者間(jian)隔(ge)非(fei)(fei)常細膩的(de)時(shi)候,查詢(xun)數據會(hui)(hui)變得(de)非(fei)(fei)常緩(huan)慢,更(geng)直接(jie)(jie)的(de)表現就是(shi)會(hui)(hui)直接(jie)(jie)造成頁面的(de)卡(ka)死,需要重新打開(kai)相應的(de)瀏(liu)覽器。但是(shi)用(yong)了(le) TDengine 之后(hou),目前的(de)使(shi)用(yong)過程(cheng)中暫時(shi)沒有(you)發生過這樣的(de)現象,并且(qie)查詢(xun)所需要花(hua)費的(de)時(shi)間(jian)非(fei)(fei)常非(fei)(fei)常的(de)短(duan),很(hen)好地(di)保證了(le)接(jie)(jie)口的(de)響應速度(du)。

2. TDengine 能(neng)夠(gou)與 MyBatis 很好(hao)地(di)結合(he)(he),開(kai)發結合(he)(he)起來非常(chang)方便,我們也是寫了非常(chang)多的(de)工具(ju)類的(de)方法實現 TDengine 創建表、獲(huo)取數據等(deng)的(de)便利性(xing),超級表和普通表讓(rang)(rang)我們在創建表時,設計上變得更加簡單,也能(neng)讓(rang)(rang)測點之(zhi)間更好(hao)地(di)做出區分。
3. 我們的(de)(de)業務(wu)場景會(hui)(hui)涉(she)及到(dao)對測點數(shu)據(ju)進行每(mei)秒數(shu)據(ju)新增和插入的(de)(de)觀察,只要(yao)通訊在(zai),每(mei)秒都會(hui)(hui)有(you)很多(duo)條數(shu)據(ju)的(de)(de)新增,以目前的(de)(de)表現(xian)看 TDengine 性能是 OK 的(de)(de),后續還要(yao)看一下在(zai)實際(ji)的(de)(de)工作站運行是什么表現(xian)。
五、不負彼此的努力
目前我們(men)的(de)(de)(de)(de)項(xiang)目已經(jing)接(jie)近尾聲,后面本項(xiang)目會在(zai)實際工地進(jin)行部署使用(yong),實際的(de)(de)(de)(de)效果需要(yao)(yao)實踐(jian)去證明。未來(lai)可能還(huan)有許(xu)多事情要(yao)(yao)做,比如是否需要(yao)(yao)搭建集(ji)群等。總的(de)(de)(de)(de)來(lai)說,因為(wei)選擇了 TDengine Database,我們(men)的(de)(de)(de)(de)項(xiang)目很平(ping)穩地度過了測(ce)試階段,在(zai) TDengine 的(de)(de)(de)(de)使用(yong)上(shang)也沒有遇到特別大(da)的(de)(de)(de)(de)瓶頸,我相信在(zai)后面的(de)(de)(de)(de)合作中(zhong),我們(men)對 TDengine 的(de)(de)(de)(de)了解也會更加(jia)深入。
整個(ge)過程是酸甜(tian)苦(ku)辣并存的,在(zai)這(zhe)里非常感謝“羅格濤思”和“小 T ”的技術(shu)幫助和耐(nai)心解(jie)答,正是因為有他們的幫助,才(cai)讓我在(zai)此次調(diao)研過程中遇到問題(ti)能夠不慌不忙,最終(zhong)這(zhe)些(xie)問題(ti)也實現(xian)了(le)較好地解(jie)決,衷心的感謝!
我們(men)與(yu) TDengine 的故事(shi)還在繼續(xu),敬請(qing)期(qi)待。


























