5 年前他的一個設計思路,讓 TDengine 時間壓縮提升近 50 倍
小 T 導讀:作為創始團隊成員之一,廖浩均在 2017 年就正式加入了濤思資料,彼時整個團隊才不過寥寥五個人,TDengine 也才誕生不久。作為一位畢業於中科院計算所的計算機應用技術專業博士,廖浩均為什麼會決定從一家穩定的上市企業轉移陣地到一家資料庫初創公司?在進入濤思資料之後,他又見證和參與了 TDengine 的哪些改變與進步?立足當下展望未來,攜手 TDengine,他會如何走好接下來的路?在對廖浩均的採訪記錄中,這些問題的答案也已經躍然紙上。
創始人“三顧茅廬”,博士“大佬”做出最終抉擇
作為一個學霸,廖浩均的學業生涯是比較順暢的,從北京師範大學資訊管理與資訊系統專業畢業後,他非常順利地就考取了中科院計算所(中科院研究生院)計算機應用技術專業的碩士,接著一路綠燈開掛式地走完了博士學位。在畢業之際,因為自覺並不太擅長科研領域的工作內容,他毅然而然決定進入工業界就業。
但一向雷厲風行的廖浩均卻在接受到濤思資料遞出的橄欖枝時猶豫再三,在 Jeff(濤思資料創始人陶建輝) 的“三顧茅廬”後才終於下定決心。
在正式加入濤思前,廖浩均在一家相對穩定的上市企業中工作,按部就班的工作中沒有多少驚喜也沒有太多的波瀾,久而久之他便生出了換份工作的想法,而恰逢其時,通過讀書時期實驗室師兄的引薦,他結識了正在進行人生中第三次創業的 Jeff。提起來和 Jeff 的初次見面和溝通,廖浩均仍然記憶猶新。
“在和 Jeff 電話簡單聊過後,我打算去望京科技園實地拜訪,當時覺得時序資料庫(Time-Series Database)這個方向還是很有意思的,Jeff 也是一個相當充滿激情的人。但兩次交流後我仍然無法下定決心加入,主要來源於我對自己的顧慮,雖然我之前做過資料庫的相關工作,但是已經有一段時間沒有接觸資料庫技術了,我有些擔心自己無法勝任。”
帶著這種謙虛的態度,廖浩均決定要和 TDengine 這款產品再彼此多瞭解一些。在隨後幾次與 Jeff 更深度的溝通下,他逐漸為這位年近 50 卻仍舊奮鬥在程式碼創作第一線上的創始人的熱情和堅持折服,也為 TDengine 這款時序資料庫所深深吸引,同時也看到了物聯網、時序資料庫領域廣闊的市場機遇,他決定挑戰一下自己,抓住這次轉換賽道的機會。
“在與 Jeff 的面對面交流中,我更加深入地瞭解了 TDengine,也看到了 Jeff 的技術能力——做分散式通訊的專家開始跨界搞資料庫,而且居然使用不帶外掛的 vim 程式設計。此外,我發現當時的濤思資料雖然‘廟小’,但容納的‘大神’卻並不少,不僅有剛畢業的新銳海歸,還有工業資料庫領域的資深專家。總的來說,打動我加入濤思資料的原因有三點:Jeff 是一個很厲害的專家,他的工程能力和產品認知的敏銳性在我認識的人中無出其右;時序資料這個方向也很有前景;我自己應該能夠勝任這個挑戰。”
Jeff 的“窮追猛打”下,廖浩均心中沉寂已久的技術熱情又開始蠢蠢欲動了,最終他決心 All In 時序資料庫,而這個選擇的正確性也在後面幾年時間裡得到了印證。
“其實,在加入濤思之前,我並不是很瞭解時序資料庫這個細分領域中的產品。在2017年,時序資料庫這個概念對國內的諸多使用者來說還是太前沿,但是萬物互聯和物聯網的迅猛發展確實都能切身體會到。一般來說,此前只有公交車、計程車等機動車上安裝有用於上傳車輛狀態和位置資料的專門裝置,後來在智慧穿戴裝置、2017 年最火爆風口‘共享單車’、自動駕駛等方向上都會產生大量的時序資料……毫無疑問,這些場景都在激發著時序資料應用和管理的需求。按照這個趨勢發展下去,時序資料庫的發展勢不可擋,在我看來,這種直觀的感受和體驗最有說服力。”
一個被申請了專利的設計思路,將時間壓縮提升近 50 倍
在加入濤思資料後,廖浩均主要負責查詢處理相關的工作,在讀書時他就接觸過大量空間資料相關的工作,研究領域主要集中在空間資料索引和查詢演算法兩大方向上,因此在處理工作時也相對比較得心應手。“我在入職兩三天後就上手了工作,做的第一件事就是增加 TDengine 的聚合查詢功能。”
廖浩均的一個直觀感受是,在一個全新的設計理念下開展設計以及進行工程開發,沒有其他的任何可借鑑的實踐經驗,真的非常考驗技術人的思考能力和創造性。例如 TDengine 中的多表架構設計,其最開始的形態是採用每個表順序查詢迭代來完成,後來發現這種方法效率太差,百萬級別的表查詢耗時都會達到小時級別。
“在某天下班前,我打算在伺服器上跑一下剛完成的查詢程式碼,結果等了快 10 分鐘還沒有出結果,後來發現查詢跑了 1 個多小時以後程序掛起,最後結果也沒出來。當時就頭大了,這種查詢效率根本沒法使用,可是怎麼改卻沒有現成的思路,只能自己嘗試。後來憋了好幾天,迸發出的靈感也幫助我打造出了全新的處理邏輯,後面我將思路與 Jeff 簡單交流了一下,得到認可後就開始動手調整程式碼。調整後初步測試結果,就將時間壓縮到分鐘級別,提升近 50 多倍。隨著後續又進行了一系列工程優化方法,調整完成以後直接將時間壓縮到秒級。這是我印象中特別深刻的一件事。”
在 TDengine 的發展史中,正是這個設計讓多表互動式查詢處理成為了可能,為 TDengine 能夠高效進行查詢處理服務成功奠基。之後這個設計思路申請了 PCT 全球專利保護,也成為廖浩均職業生涯中的又一個閃光點。
眾所周知,TDengine 還有一個核心技術創新點叫超級表,但其實在超級表的模型問世之前,其已經有一套流程和邏輯了,在超級表模型確定後,廖浩均等人又開始針對 TDengine 的寫入、查詢、資料儲存等多個方面進行調整和適配。
“由於 TDengine 是一款具有一定探索性的產品,其功能的邊界和定義並不是非常清楚明晰,因而在架構設計上也很難面面俱到,並確保足夠的餘量和擴充套件性設計。如果前期沒有做好設計,後面增加功能的時候會面臨非常大的困難。架構設計考慮得不完善,需要重構,但是又不可能大規模調整框架設計。只能採用小步快跑的方式,不停進行程式碼和設計架構的小規模重構和優化工作,還要避免重構工作引入新的 Bug。”
在廖浩均的印象中,針對 TDengine 進行開發和除錯 Bug 時,為了定位處理程式碼中的邏輯錯誤,就需要閱讀和分析大量的日誌,在這一工作中,通過日誌分析定位程式碼中的邏輯錯誤問題是一個非常重要的能力。 “我們最長時間的一次日誌分析斷斷續續花了 1 天半的時間,是分析一個伺服器、客戶端之間的查詢日誌,通過日誌資訊分析還原了 3 個執行緒之間的、對於一個記憶體區的使用+執行緒排程問題處理中出現的 race condition。由於架構設計的原因,需要使用的處理方式和處理技巧相對複雜,後來 Jeff 為 TDengine 增加了物件生命週期管理的模組,才避免了後續繼續在這個問題上掉坑。在增加和完善訊息互動的流程追蹤機制基礎上,從幾十 GB 的日誌中撈出來所需的兩三行確定性關鍵日誌成為了常規操作,同時十幾、二十分鐘就能快速定位出問題,給出錯誤原因並將錯誤場景還原。”
TDengine 從 0.x 到 3.0,他既是見證者也是建設者
作為濤思資料的“元老”之一,回顧 TDengine 的一路成長,廖浩均倍感榮耀和欣慰。
“一些朋友可能不太清楚 TDengine 是怎麼孵化出超級表概念的,其實這一概念是 Jeff 在與網宿科技交流過程中碰撞出來的,當時的資料庫領域中並沒有這樣一種設計,能夠解決需要建立很多表的場景(TDengine 的獨特設計要求每個裝置有一個寫入表),表的模式一致,具體功能上既需要能夠單獨寫入、又需要實現通過一條 SQL 語句就能夠查詢全部相同模式的表。有趣的是,超級表的設計和整體邏輯是 Jeff 提出來的,但名字卻是我取的。”
超級表的問世無疑給 TDengine 注入了滿滿生機和活力,也讓 TDengine 在後續的市場競爭中成功脫穎而出。
據廖浩均回憶,在剛剛加入時,TDengine 的架構還非常簡單,也沒有太複雜的處理邏輯,只能進行簡單的投影查詢。“當時整個系統的基礎架構以及核心元件,包括通訊模組、訊息佇列、事件驅動執行模組、SQL 解析、查詢執行框架、Driver,這些基本上都是 Jeff 自己在幾個月時間內完成的,由於人手和時間的原因,這套服務端查詢處理框架從 0.x 版本一直延用到 1.x 版本,在 2.0 版本中才進行了較大規模的邏輯優化和重構。”
回顧 TDengine 從 0.x 到 2.x 的發展,廖浩均感慨頗多。“得益於 Jeff 對時序資料庫這一細分領域的前瞻性和洞察力,濤思在較早的階段就進入其中,佔領了一定的產品和市場先機,但這距離我們想要把TDengine 打造成物聯網行業首選時序資料庫乃至全球化產品的目標還相距甚遠,所以從 0.x 到 2.x,TDengine 也在不斷進行技術創新和深耕。”
TDengine 0.x 的版本基本上奠定了後續的技術基礎,包括管理節點、資料節點、虛擬節點的設計和功能邊界、程式碼實現,訊息通訊體系,分散式框架和元資料管理架構等關鍵內容,具備了基本的 SQL 操作能力和超級表模型,較完備的高效能資料寫入流程和快取中資料組織機制、以及 WAL 設計,具有優異讀寫效能的檔案組設計,資料生命週期管理機制,以及日誌模組和引數管理模組,還包括同步非同步支援的 Driver 等。
在隨後的 1.x 版本中,TDengine 結合使用者的需求,加入了預計算功能、增加了亂序資料寫入能力,在 SQL 語法上進行增強,修復了系統整體上存在的大量問題並完善各模組的功能,同時從 1.4 版本開始進行開源,將核心程式碼公開於 GitHub 上,在 GitHub 全球趨勢排行榜上多次霸榜,這一舉動也為 TDengine 帶來了更多技術關注。
“敢於開源代表著我們不懼外界的技術質疑,同時開源也有助於我們更加直接快速地獲得使用者對於產品的反饋,加快產品演進和研發速度。隨著開源力度的加大、引擎研發團隊技術人員的增加以及團隊自身經驗的積累,2.x 版本中我們進行了更優異的模組化和重構工作,對幾乎全部的功能元件進行梳理和重構。雖然在使用者層面能看到的功能增強和改善並不多,但是從產品角度來說,2.0 真的是 1.x 版本的一次脫胎換骨式的升級。”
如今,距離 2.0 版本釋出已經過了兩年時間,為了讓使用者在使用體驗上更加順滑,如廖浩均一般的濤思技術人也在加班加點地對 TDengine 進行新一輪的優化和迭代。在他們的努力和一眾使用者的支援下,2022 年下半年,3.0 版本也將如期而至,屆時 TDengine 將迎來進一步升級和蛻變。
展望未來,攜手 TDengine 繼續前進
回顧加入濤思資料的這些年,廖浩均表示最大的收穫就是結識了一群很優秀的同事,大家為著共同的目標而努力,是一件讓人很激動很興奮的事情。而他本人也在這個過程中受益匪淺,通過參與一套基礎軟體系統從 0 到 1 的開發,不僅重塑了個人的知識體系,對於資料庫系統的理解達到了一個新的層次,也極大提升了資料庫相關的工程能力。
談及自身的下一步發展,他希望還能繼續深耕在時序資料庫領域,一是源於興趣,二是源於前景。“物聯網時序資料領域還處於快速發展的階段,未來一定會有較大的發展空間,對於我自己來說,投身於這樣一個不斷髮展的領域,也能鞭策著我不斷學習和進步。只有脫離舒適區,做有挑戰性的工作,才能讓能力提升這件事保持可持續性。如果你也對此感興趣,那開源社群是一個非常好的學習渠道,通過優秀的開源專案,能夠學習到非常多的經驗,歡迎你成為 TDengine 的貢獻者。”
而談及 TDengine 的未來,他希望經過時間的洗禮,TDengine 能夠發展成為一個具備開箱即用、高效能時序資料處理能力的重要軟體產品,涵蓋時序資料日常應用中的重要場景所涉獵的功能,具備優秀的伸縮能力、容錯能力、異構環境部署能力以及面向使用者的功能擴充套件。在資料中心和邊緣側具備同樣的便捷性、易用性的使用體驗,進一步為使用者提供高效能、高效能、高可靠性、低成本的時序資料處理功能。
想了解更多 TDengine Database的具體細節,歡迎大家在GitHub上檢視相關原始碼。