
小 T 導讀:興(xing)盛(sheng)優選需要通過實時產生(sheng)的(de)數(shu)據來判斷(duan)設備是(shi)否工(gong)作、檢測通訊是(shi)否延(yan)時、觀(guan)測 SNMP OID 流量(liang)是(shi)否正常等,從而保(bao)障運維與網絡人員(yuan)及時發(fa)現問題(ti)并修復。為高(gao)效處理各(ge)類時序(xu)數(shu)據,保(bao)障服(fu)務的(de)穩(wen)定運行(xing),在對比了 Elasticsearch、InfluxDB 和 TDengine 三(san)款(kuan)產品之后,他們選擇并落地了 TDengine。
企業介紹
湖南興盛(sheng)(sheng)優選(xuan)電子(zi)商務有限公司(簡(jian)稱興盛(sheng)(sheng)優選(xuan)),總部位于湖南長沙,是(shi)一家關注民生的(de)(de)互聯網(wang)“新零售”平臺,主(zhu)要定位是(shi)解決家庭消費者的(de)(de)日常需求,提供(gong)包括(kuo)蔬菜水果、肉禽水產、米面糧油、日用百貨等全品(pin)類精選(xuan)商品(pin)。興盛(sheng)(sheng)優選(xuan)依托社區實體(ti)便利店,通過“預售+自提”的(de)(de)模式為用戶提供(gong)服務,是(shi)社區電商中唯(wei)一一家估值超(chao)過 150 億美(mei)金的(de)(de)“獨角獸”。
業務背景
為了保證互聯網服(fu)(fu)(fu)務(wu)的高(gao)效和穩定,我們需(xu)要(yao)監控公司所有(you)的節點服(fu)(fu)(fu)務(wu)器(包括云服(fu)(fu)(fu)務(wu)器)、交換機及(ji)路由(you)器。我們需(xu)要(yao)通(tong)過(guo)實(shi)時(shi)產生的數據來(lai)判斷(duan)設(she)備是否(fou)工作、檢(jian)測通(tong)訊是否(fou)延時(shi)、觀測 SNMP OID 流量(liang)是否(fou)正常(chang)等(deng),從而保障運維與網絡(luo)人員及(ji)時(shi)發現問題并(bing)修復(fu)。

這類數據是非常典型的時序數據,應該如何高效地處理呢?現在市面上有幾款非常流行的時序數據庫(Time Series Database)產品。應該(gai)如何評估(gu)并選(xuan)擇適合(he)我們業務場景的技術平臺呢?
產品調研
針對該業(ye)務(wu)場景,我們調研了如下幾個產品(pin):Elasticsearch、InfluxDB 和 TDengine。具體對比如下。
Elasticsearch
- 優點:可以分布式部署,可以無障礙插入,支持任意的字段類型,查詢速度快。
- 缺點:只適合記錄日志且并發數據量不大的情況,對于海量設備的時序數據寫入有性能問題。
InfluxDB
- 優點:支持無模式(Schemaless 寫入),限制較少。
- 缺點:當面對大批量的數據同時插入或讀取時,內存容易被占滿,導致死機。尤其是其中的輪詢機制,在檢驗過期數據時,內存占用特別大。此外,在讀取數據時,讀出來的是列表,可讀性差,解析比較麻煩。
TDengine
- 優點:列式存儲以及“一個設備一張表”的模型與我們業務場景十分契合。此外,還可以兼容我們以前使用 InfluxDB 時所習慣的插入方式,代碼可讀性強,支持強綁定參數。在執行海量數據的查詢時,響應速度比 InfluxDB 更快。
- 缺點:Schemeless 的支持還在持續完善之中。
由(you)于該項目(mu)未來需要(yao)監控(kong)我們(men)公司的所有服務器(qi),平(ping)均(jun)每(mei)臺對應的 OID 會有幾(ji)百(bai)個(ge),如(ru)果(guo)每(mei) 1-5 秒采集存儲一(yi)次,并發(fa)數據量會非常大。因此,我們(men)從候選中淘汰了 Elasticsearch。
接下來我(wo)們又繼續(xu)對比了(le)(le)(le) InfluxDB 和 TDengine。InfluxDB 單節點(dian)性(xing)能不足,集群閉源且(qie)性(xing)能未知。反觀 TDengine,其(qi)集群功能是開源的(de)(de),且(qie)保留(liu)了(le)(le)(le)企業(ye)版的(de)(de)部分(fen)核心功能。這(zhe)讓(rang)我(wo)們可以直(zhi)接非(fei)常深入地了(le)(le)(le)解 TDengine 的(de)(de)優劣。從(cong)這(zhe)方面(mian)考慮,我(wo)們選(xuan)擇(ze)了(le)(le)(le) TDengine。而且(qie)在實際使用中,我(wo)們又發現了(le)(le)(le) TDengine 的(de)(de)一大優勢,其(qi)“一個(ge)設(she)備(bei)一張表”的(de)(de)模(mo)型(xing)十分(fen)契合(he)我(wo)們的(de)(de)實際場景(jing)。
系統架構
在(zai)引入 TDengine 之(zhi)后,我(wo)們的系統(tong)架構(gou)如(ru)下圖(tu)所(suo)示。

在該架構下(xia),前端(duan)制定好規(gui)(gui)則(ze)下(xia)發(例如:流量閾(yu)值,延時閾(yu)值),后(hou)端(duan)看(kan)是否(fou)需要存儲規(gui)(gui)則(ze),或檢查規(gui)(gui)則(ze)是否(fou)發生變(bian)化,然后(hou)把規(gui)(gui)則(ze)下(xia)發給 ETCD 來做定時任(ren)務(wu)調度。我們共有三個程序任(ren)務(wu),通(tong)過(guo) ETCD 管(guan)理,定時和各類設備通(tong)信,根據不同規(gui)(gui)則(ze)分別抓取各自需要的數據:
- SNMP 引擎通過 OID 監控網絡設備各項指標
- TCPing 引擎用于監控服務器 TCP 端口狀態
- ICMP 引擎重點采集接收或返回數據的時間
這三大類(lei)數據采集之(zhi)后,會經過(guo)統一(yi)處理(li),再寫(xie)入 TDengine。
我(wo)們使用 5 個節點搭建了一套(tao) TDengine 集群:

我們選擇了無模式寫入,在寫入時自動建表,具體寫入方式可參考官網。這樣一來,每一臺服務器對應的類型都是一張超級表,我們選擇盡量地分表 ,提升查詢速度。
對于 SNMP 類型的超級表(biao)來說,每一個子(zi)表(biao)就是(shi)一個 OID。
對(dui)于 TCPing 類型,我們(men)按(an)照 TCP 端口來區分子表。
對于 ICMP 類型的超(chao)級表,我們以(yi) task_id 和 task_type 作為區分子表的依據:

目前(qian)我們已(yi)經(jing)存儲(chu)了 500 萬張子表(biao),平(ping)均算下來設備(bei)上報頻(pin)率大(da)概(gai)為 3 秒 1 行,總數據量(liang)(liang)達到了百億級別,而(er)占用的(de)存儲(chu)空間(jian)只(zhi)有 70GB 左右。這(zhe)應該(gai)得益于 TDengine 針對性地(di)使用了列式壓(ya)縮(suo),存儲(chu)資源占用很(hen)小,壓(ya)縮(suo)率大(da)概(gai)為 8% 左右。TDengine 可以(yi)很(hen)好地(di)頂住(zhu)寫(xie)入和(he)存儲(chu)壓(ya)力。而(er)查詢方面,我們會批量(liang)(liang)查詢部(bu)分表(biao)的(de)特定時間(jian)的(de)值,大(da)部(bu)分數據用于實時的(de)監控報警。

經驗總結
在使用過程中,花時間相對較多的(de)大概(gai)是無模式插入(ru)的(de)摸索(suo)吧。
對(dui)于從(cong) InfluxDB 切換過來(lai)的(de)用戶(hu),初期可能會(hui)有一些不適應。因為 TDengine 最初并不是按照(zhao) Schemaless 來(lai)設計的(de),這個功能是后期加入的(de),系統最終還是會(hui)把無模式轉化成 SQL 再進(jin)行寫入,只是簡化了用戶(hu)的(de)操作。不過 TDengine 一直(zhi)在完善相關的(de)生態適配,比如對(dui)于大小寫的(de)特殊(shu)字符(fu)的(de)存儲(chu),完善元數據(ju)管理,收納各(ge)種形式的(de)數據(ju)類型,也在逐步向 InfluxDB 的(de)自(zi)由式寫入靠(kao)近(jin)。
除此(ci)之外,我(wo)(wo)們(men)也遇(yu)到過(guo)一(yi)個問題,目前 Go 連接器的查詢 API 暫時不支持將多條 SQL 拼接在(zai)一(yi)起(qi)統一(yi)執(zhi)行。因此(ci)我(wo)(wo)們(men)采取了(le)并發(fa)讀取,但(dan)性能(neng)可(ke)能(neng)會(hui)受(shou)到一(yi)點影響,期(qi)待后續的版本能(neng)夠解決。
最后,TDengine 的支持團隊(dui)相當負責,配合積極,讓我(wo)們(men)(men)快(kuai)速(su)上手了(le)這款輕便易用、性能超(chao)高的時序數據庫(ku)。目前我(wo)們(men)(men)只接(jie)入了(le)一(yi)部(bu)分服(fu)務器(qi)(qi)及設(she)(she)備(bei),后續我(wo)們(men)(men)計劃(hua)把(ba)公司全國范圍內所有的服(fu)務器(qi)(qi)都接(jie)入進(jin)來,也(ye)會推薦公司更多部(bu)門(men)使用。一(yi)切順利的話,我(wo)們(men)(men)也(ye)會考慮包括倉庫(ku)運貨機器(qi)(qi)人,物流線設(she)(she)備(bei)等更多應用場景(jing)。


























