來了來了!MatrixOne技術架構詳解來了!

語言: CN / TW / HK

前一段時間在知乎上有個小夥伴吐槽說已放棄閱讀MatrixOne原始碼,想必是對MatrixOne的程式碼可讀性與解釋文件的缺乏不太滿意。確實,MO在這些方面還需要做很多改進工作,作為一個開源專案,良好的程式碼和文件可閱讀性是讓大家來參與的基礎。

社群中也有很多小夥伴問到MatrixOne是否有一個整體架構和模組說明的文件?那必須給大家安排上!本文將說明MatirxOne每個模組的現狀與進展,希望通過技術架構詳解,大家對MatrixOne能夠有更清楚的瞭解,同時也歡迎大家貢獻程式碼~

設計理念和初衷

MatrixOne的定位是超融合異構雲原生資料庫。

我們核心的設計初衷是由於觀察到資料增長和應用的需求越來越強烈,但是資料處理的任務卻變得越來越複雜,行業中充斥著使用多個數據庫或者大資料的元件自己組合搭建一套資料平臺的做法,這樣的做法需要極強的IT能力、高昂的維護和使用成本。

對網際網路企業而言,行業紅利已經接近天花板,下半場的強監管與精細化運營必然對降低成本提出更高要求。而對大量還在數字化轉型過程中的傳統企業而言,在還未嘗到數字化的甜頭的時候,由於資料處理的複雜性和高IT門檻就已經足夠勸退大量企業。

MatrixOne希望通過一套比較簡潔的架構,能提供一套統一的滿足大部分場景資料處理需求的平臺,將複雜性包含在系統內部,讓使用者能夠高效快速的處理和應用資料。

舉一個例子來講,現在的資料庫產品就類似於一個個獨立的電子裝置,MP3,數碼相機,收音機,電話,每個實現一部分相對突出的功能。而MatrixOne希望提供的是一個類似智慧手機的產品,將大部分相對通用的功能整合在產品內部,極大的簡化使用體驗和維護成本。

關於我們的產品理念和初衷,請參見我們釋出於InfoQ的《昂貴、複雜、低效... 中小型企業如何打破大資料技術棧困境?》一文。

架構特點

當前整體架構可以用NewSQL+MPP來定義,並且正在進化成為一個為OLAP增強的分散式HTAP資料庫,今年下半年將開始向面向雲邊一體的場景進一步演進。

MatrixOne將極簡易用作為重要的設計準則,儘管是分散式資料庫,但在部署上只提供單一Binary,每個節點只執行完全同樣的單一程序即可。

MatrixOne的NewSQL架構特點

眾所周知,關係型資料庫自SystemR確立了關係模型+SQL+事務處理“老三樣”以來,已經存在了超過30年,直到NewSQL的出現。NewSQL是指以Google Spanner為起點,CockroachDB、TiDB、YugabyteDB等作為開源代表出現的分散式資料庫,採用以複製狀態機(Replicate State Machine)為核心,同時解決傳統單機資料庫伸縮性和高可用問題的分散式架構。

在計算機領域,複製狀態機是實現容錯服務的主要方式。狀態機開始於給定的起始狀態。每個收到的輸入都通過狀態轉移機制來產生一個新的狀態以及相應的輸出。在複製狀態機中,一組Server的狀態機計算相同狀態的副本,即使有一部分Server宕機了,它們仍然能夠繼續執行。一致性協議是複製狀態機背景下提出的,用來保證複製日誌的一致性,常用的一致性協議有Paxos,Raft等。在複製狀態機架構下,通過掛載Key Value儲存引擎進而實現OLTP能力,就是以上NewSQL的主要構型。

MatrixOne的當前架構,跟以上NewSQL資料庫的區別在於,它是可以掛載多種儲存引擎的。當前的0.2版本已經掛載了一個Key-Value儲存引擎,用來存放Catalog等元資料。以及一個列存引擎,提供OLAP分析能力。當然,根據需要,它也可以掛載任意儲存引擎,包括但不限於行存,圖,專用時序,專用NoSQL等多模引擎。不同的儲存引擎可以去滿足不同場景中的應用,也非常歡迎社群的開發者來貢獻想法和程式碼。

圖:Raft的複製狀態機實現

MatrixOne的MPP架構特點

MPP(Massively Parallel Processing)大規模並行處理是一種針對大規模的資料分析的計算架構。簡單來說,MPP是將任務並行的分散到多個伺服器和節點上,在每個節點上計算完成後,將各自部分的結果彙總在一起得到最終的結果。這個架構最早被Teradata和Greenplum等第一代OLAP資料庫採用,後來為Hadoop體系奠基的MapReduce也借鑑了MPP架構的做法。但是兩者在處理的資料體量,SQL的支援程度,資料處理型別及效率上有較大差別。用今天的概念來講,Hadoop方案更偏資料湖,可以儲存和處理上百PB資料,可以在讀取的時候再定義schema,可以放大量的非結構化和半結構化資料,但是SQL支援,查詢效能和實時流式處理不太理想。基於MPP架構的資料庫方案更像是大幅強化了查詢能力的關係型資料庫,仍然兼具良好的SQL支援和ACID事務屬性。新一代的開源MPP計算引擎代表有Clickhouse,Presto,Impala,GreenPlum,Apache Doris等。

MatrixOne也在MPP架構的基礎上提供強大的OLAP能力,與其他專案不同的是,目前MatrixOne的MPP SQL計算引擎目前是用Golang實現的最快SQL引擎,相比C++的計算引擎,也可以在效能上一較高下。而且通過向量化和因子化加速之後,在如非主鍵join,多表複雜join等方面表現更優。

圖:MPP架構

整體架構

MatrixOne整體分為前端、計算層、元資料層、分散式框架和儲存層這幾個層次。

圖:MatrixOne的整體架構

元件介紹:

前端SQL Frontend:這是MatrixOne的入口,目前MatrixOne提供MySQL相容協議,以及MySQL語法(部分相容)。SQL Frontend接收來自MySQL客戶端的請求,解析後轉到下一層。

計算層Query Parser: 接收到來自SQL Frontend的請求之後,SQL Parser負責將其解析並轉化為抽象語法樹。儘管提供 MySQL語法,但MatrixOne並沒有採用流行的開源Query Parser,如TiDB,Vitess的Parser等。事實上,在2021 年10月釋出的MatrixOne 0.1版本中,就採用的TiDB Parser,但在0.2版本中,我們自研了一個新的Parser,這主要是因為:

  • MatrixOne致力於提供超融合資料庫,未來會有很多的自定義語法,這並沒有必要完全跟MySQL保持一致。此外, MatrixOne未來還有提供多方言協議相容的計劃,包括PostgreSQL,Hive,ClickHouse等,因此MatrixOne需要 有自己的Query Parser,可以任意定製,併為多方言語法相容提供基礎。
  • MatrixOne當前更突出OLAP能力,而目前開源的Parser,基本的都是服務OLTP場景的,對一些OLAP的場景,如大批量插入等,效能開銷較大。

計算層MPP SQL Execution:這是MatrixOne的MPP計算引擎,該引擎由Golang實現,其中針對SQL計算引擎的一些基礎操作的向量化加速,部分操作採用了彙編改寫做加速。目前僅實現了Intel X86架構中AVX2,AVX512指令集的適配和加速。另外,我們通過獨有的因子化加速能力,在針對多表join的場景下會有非常高效的表現。這些技術細節都會有後續的文章介紹。但是總的來說我們目前距離完善的SQL能力和底層適配還有很長的路要走,這裡也歡迎社群可以更多的貢獻針對其他如ARM處理器架構以及更多SQL操作的彙編加速實現。

元資料層Catalog:這是存放資料庫整體元資料的元件,例如Table/Schema定義等。目前Catalog還是一個臨時方案,採用一個Key Value引擎存放,後續Catalog將整體遷入一個標準的OLTP引擎,提供進一步更完善的ACID能力來支撐Catalog元件。

分散式框架MatixCube:這個元件是實現NewSQL架構的分散式基礎架構庫,目前是一個獨立的倉庫。它包含兩部分的功能,一個是提供複製狀態機實現的共識協議部分,當前採用Multi Raft機制。另一個是提供基於Raft的副本排程機制,該排程器在程式碼中稱為Prophet。MatrixCube是一個通用的庫,它可以對接各種儲存引擎,這也是目前把它放到一個獨立的倉庫 的原因,任何第三方開發者,都可以比較方便的採用它來實現分散式強一致的儲存引擎和資料庫。MatrixCube還有一個非常重要的工作,就是提供分散式事務能力,這個工作目前正在方案設計中,很快也會將方案公開給開發者參考與討論。

圖:MatrixCube架構圖

儲存層Storage Engine:在MatrixOne中,儲存引擎被定義為Engine,因此採用DDL建立表的時候,可以通過指定Engine,來決定用什麼儲存引擎來存放表資料。在當前的倉庫裡,只實現了一個Engine: AOE引擎。在最初的版本里,AOE的意思是Append Only Engine,這是一個Append Only的列存引擎。前面提到MatrixOne目前提供了2種儲存的掛載,一個是Key Value,另一個是列存。 但是目前,Key Value還沒有完成Engine的抽象,它對應的名字叫做TPE(Transaction Processing Engine),目前正在開發中,因此前述的Catalog是臨時方案,待TPE完成後,Catalog將採用TPE實現。未來,不排除TPE對外暴露提供完整SQL能力的可能。AOE本質上是一個Demo儲存引擎,它驗證了將列存跟 NewSQL架構結合的一系列設計問題,這跟基於Key Value的NewSQL有著很大不同。目前開源的分散式資料庫中,只有MatrixOne和Apache Kudu實現了基於列存的NewSQL架構。AOE的一個演進叫做TAE(Transactional Analytical Engine),這是一個基於列存的HTAP引擎,會提供完整ACID能力及強大的OLAP能力,類似於MySQL與Clickhouse整合的同時帶完整分散式事務能力的資料庫,目前正在緊張開發中。待完成後,MatrixOne將擁有完整的分散式 HTAP能力,完成Apache Kudu多年一直沒有做到的事情:兼顧事務和高效能。

MatirxOne程式碼結構

介紹完MatrixOne的架構之後,想必小夥伴們已經對MatrixOne有了一個整體的瞭解。接下來我們會整體介紹一下MatrixOne的程式碼倉庫結構,方便各位小夥伴對感興趣的部分進行深入研究或者參與貢獻。

MatrixOne的核心程式碼全在"matrixone/pkg/ "資料夾下。與上述架構圖中對應的模組程式碼庫位置:

  • SQL Frontend: frontend/
  • SQL Parser: sql/parser
  • MPP SQL Execution: sql/
    - 向量化: vectorize/
  • Catalog: catalog/
  • MatrixCube: MatrixCube目前為單獨倉庫「https://github.com/matrixorigin/matrixcube
  • Storage Engine: vm/engine,這裡vm的意思是虛擬機器,這裡借用了SQLite的概念,類似整個MatrixOne的runtime,整個存算邏輯包裝在vm中,提供對物理資源的抽象,方便進行資源管理。
    - AOE: vm/engine/aoe
    - TPE: vm/engine/tpe

我們在github上有一個完整的good-first-issue列表,相對於MatrixOne這個龐大系統,這些任務相對比較容易上手和實現,期待各位開發者來認領參與~

Good First Issues List #1907

圖 :MatrixOne good-first-issue列表

驚喜預告!MatrixOne即將釋出第一期系統built-in函式新手任務,其中需要修改的程式碼主要在builtin與vectorize當中,歡迎社群開發者的參與!

歡迎加入MatrixOne社群

官網:matrixorigin.cn

原始碼:github.com/matrixorigin/matrixone

Slack:matrixoneworkspace.slack.com

知乎 | CSDN | 墨天輪 | OSCHINA | InfoQMatrixOrigin