來了來了!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目前為單獨倉庫「http://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