自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OLTP&OLAP超融合,揭秘新一代云原生數(shù)據(jù)庫的設(shè)計之道

云計算 云原生 其他數(shù)據(jù)庫
MatrixOne 是一款面向未來的超融合異構(gòu)云原生數(shù)據(jù)庫管理系統(tǒng)。通過全新設(shè)計和研發(fā)的統(tǒng)一分布式數(shù)據(jù)庫引擎,能夠同時靈活支持 OLTP、OLAP、Streaming 等不同工作負載的數(shù)據(jù)管理和應(yīng)用,用戶可以在公有云、自建數(shù)據(jù)中心和邊緣節(jié)點上無縫部署和運行。

MatrixOne 是一款面向未來的超融合異構(gòu)云原生數(shù)據(jù)庫管理系統(tǒng)。通過全新設(shè)計和研發(fā)的統(tǒng)一分布式數(shù)據(jù)庫引擎,能夠同時靈活支持 OLTP、OLAP、Streaming 等不同工作負載的數(shù)據(jù)管理和應(yīng)用,用戶可以在公有云、自建數(shù)據(jù)中心和邊緣節(jié)點上無縫部署和運行。其優(yōu)點包括:簡單易用,成本較低,性能優(yōu)異,靈活擴展。本文將對 MatrixOne 存儲格式設(shè)計進行詳細解讀。

一、MatrixOne 存儲格式設(shè)計的初衷

1. MatrixOne 架構(gòu)解讀

圖片

MatrixOne 整體架構(gòu)分為三層,分別為:

計算層,設(shè)計為多節(jié)點結(jié)構(gòu),主要負責(zé)提取數(shù)據(jù),完成計算功能。

中間層,事務(wù)處理與元數(shù)據(jù)層面、共享日志,主要功能是提供完整的日志服務(wù)以及元數(shù)據(jù)信息。

對接層,通過 File Service 對接底層各種不同的存儲,比如 S3、用戶的本地文件、NAS 等。

數(shù)據(jù)執(zhí)行過程:

插入一條數(shù)據(jù),系統(tǒng)接到請求后,這一條數(shù)據(jù)提交到事務(wù)處理層,之后系統(tǒng)將數(shù)據(jù)寫到共享日志中,再返回給用戶提示,表示操作成功。

有三點需要注意:

第一點:事務(wù)處理層(TN)剛開始寫數(shù)據(jù)會比較小,系統(tǒng)會先在內(nèi)存里面做組織結(jié)構(gòu),等積累到足夠的量,比如幾千行或 1 萬行,再將這些數(shù)據(jù)落盤,落盤后的數(shù)據(jù)定義為一個 block。

第二點:剛開始用戶寫數(shù)據(jù)是比較小的,隨著數(shù)據(jù)量的增長,系統(tǒng)會把數(shù)據(jù)都 MER merge 起來,然后不停地 merge,方便用戶直接查數(shù)據(jù),做分析。

第三點:遇到在寫入數(shù)據(jù)過程中,操作多及數(shù)據(jù)量大的時候,系統(tǒng)會直接將數(shù)據(jù)寫入 Database 或者寫入 S3,寫入完成后,通過發(fā)布 service,提交到系統(tǒng)后臺。

圖片

如上圖右邊的結(jié)構(gòu),從上至下,第一層是 DB,第二層是 table,DB 和 table 存在元數(shù)據(jù)里,具體的數(shù)據(jù)分為多個 object,一個 object 又可以分為多個 block。

2. MatrixOne 存儲格式設(shè)計的初衷

圖片

從 MatrixOne 0.5 開始,現(xiàn)在已經(jīng)發(fā)布到 1.1,一直采用列存的結(jié)構(gòu),因為列存對 AP 容易優(yōu)化,負載可以靈活適配;一個 Column 數(shù)據(jù),和大多數(shù)數(shù)據(jù)庫的 Hive 文件排列結(jié)構(gòu)比較相似,每一個列有獨立的 block,用戶可以通過這些列來查詢數(shù)據(jù)。

對于 MatrixOne 來說,需要滿足所有的業(yè)務(wù)類型,比如數(shù)據(jù)庫表的數(shù)據(jù),table、DB、Catalog 的元數(shù)據(jù)管理、元數(shù)據(jù)落盤、再做 Replay。

業(yè)務(wù)數(shù)據(jù)在運行過程中,有很多 trace log、raw log,為了方便用戶查看 log,也要對這些數(shù)據(jù)做足夠的支撐。

遇到類似 AP 場景,有很大數(shù)據(jù)量的查詢,查詢結(jié)果后續(xù)可能還會調(diào)用,系統(tǒng)會把常用查詢結(jié)果存儲在本地文件或者是 S3 上,方便后續(xù)直接調(diào)用常用結(jié)果型數(shù)據(jù)。

為了滿足所有的業(yè)務(wù)數(shù)據(jù),不同的數(shù)據(jù)類型方便去訪問,且不影響數(shù)據(jù)查詢時效,采用 File Server 中的 S3 共享存儲可以解決此問題。S3 的對象存儲,每一個對象都需要存儲指定的行,或者是指定 size,或者是指定的 block。block 有很多,存儲一個對象可能會有多種類型的 block,可能 schema 都不一樣,這些不同的 schema,需要哪些 block,需要用 block 的語言數(shù)據(jù)分析,之后更新 block 的源數(shù)據(jù),才能得到真正的數(shù)據(jù)存放地址。這就是保證便捷高效的元數(shù)據(jù)請求訪問的原理。

用戶數(shù)據(jù)在正常運行一段時間之后,需要 scrub 任務(wù)來校驗一下數(shù)據(jù)正確性,MatrixOne 提供了一些工具,來滿足這些需求,幫助用戶做數(shù)據(jù)維護。

3. 數(shù)據(jù)結(jié)構(gòu)解析

圖片

結(jié)構(gòu)圖最上方 Header 會記錄對象的版本信息、數(shù)據(jù)格式、元數(shù)據(jù)的位置、校驗值位置,結(jié)構(gòu)圖最下方的 footer 是 head 的鏡像。

結(jié)構(gòu)圖 Header 以下是數(shù)據(jù)區(qū),寫入的業(yè)務(wù)數(shù)據(jù)在內(nèi)存打包處理后寫到這個數(shù)據(jù)區(qū),在數(shù)據(jù)區(qū)里將寫入的數(shù)據(jù)稱為一個 block,結(jié)構(gòu)圖再往下一層是整個對象的元數(shù)據(jù)區(qū)域。

首先是索引區(qū)域,比如現(xiàn)有的 feature 還有 Romec 都存在里面。

結(jié)構(gòu)圖最后一層是整個對象的 Meta 標(biāo)記,包括整個對象怎么解析,怎么去讀。

當(dāng)用戶寫完數(shù)據(jù)成功后,系統(tǒng)會有一個 offset 指向整個 Meta data 區(qū)域。

圖片

Metadata 的結(jié)構(gòu)如上圖所示。

Tombstone 就是用戶 data,用戶寫完后可能要刪某一行,因為寫入系統(tǒng)不能直接修改,需要刪的那一行,系統(tǒng)會再記錄一下,也就是軟刪。

SubMeta 會存儲 catalog、block、object 等,用戶讀數(shù)據(jù)的時候,需要這些元數(shù)據(jù),簡稱為 checkpoint。Checkpoint 存在 SubMeta 里面,有 20 多種。為了保障性能,用戶要提取一套數(shù)據(jù),系統(tǒng)只需要指針偏移,就可以去拿到對應(yīng)的 Meta,記錄這些 Meta 存在的位置,就需要 SubMetaIndex。

DataMeta、TombstoneMeta、SubMeta,每一個 Meta 都有 head 去記錄整個 Meta 的信息。

圖片

Block 層結(jié)構(gòu)如上圖。

每個 block 有不同的值,整個數(shù)據(jù)的 Meta 的checkpoint、columncnt,rows或者 Bloom Fitter 這些索引,都記錄在 supplement。還有一些 block 的 index 用來記錄 block 的偏移,block 的數(shù)量不是固定的,所以系統(tǒng)要記錄 index。否則如果先去讀有多少 block,然后通過這些 block 去算需要的 block 具體在哪里,這樣對整體性能要求很高,所以系統(tǒng)會記住 block index,記錄固定的起止位置來標(biāo)記 block 都在哪里,從而便于讀取。

圖片

DBID、TableID、AccountID 等內(nèi)容具體解釋如上圖所示。

圖片

ColumnMeta 記錄第幾列,當(dāng)前列是什么 type;NDV 即 column 中有多少不同的值;NullCnt 記錄的是這一列中有多少 null 值;DataExtent 記錄的是數(shù)據(jù)位置,也會記錄壓縮前和壓縮后的數(shù)據(jù)大小;Chksum 是數(shù)據(jù)的 checksum;ZoneMap 是指這列的 MinMax 索引,然后通過 index 當(dāng)前尋找的偏行地址就可以讀這個數(shù)據(jù)。

圖片

用戶寫完數(shù)據(jù)后,會返回一個記錄對象 Meta 位置的 extent,并保存到 catalog 也就是 Metadata 當(dāng)中。當(dāng)用戶使用系統(tǒng)去執(zhí)行查詢數(shù)據(jù)所需要去讀數(shù)據(jù)的時候,可以通過這個 extent 去查詢整個對象的 Meta,從而通過 Meta 一層一層去看到具體的 column data。

通過一個 extent,就可以去讀取一個 IO,因為系統(tǒng)中一個對象里面最小的單位是 IO entry,根據(jù)不同的 IO 它可分成不同的 IO entry。比如一個 column data,column 是一列,就等于一個 IO,可以一列一列地讀,或者一個 Meta,也是一個 IO,或者 bloomfilter,也是一個 IO,可以通過一個 IO 讀出所有不同的 feed,方便過濾。

通過 IO entry,查詢到這個對象的 Meta,然后查詢真正的數(shù)據(jù)。通過 Meta 讀數(shù)據(jù),需要先查找數(shù)據(jù)的 head,然后得到 block index 就可以很方便地去獲取到 block 的 Meta,每一列都在 block Meta 里面,包括如何方便地查詢一些 column,可以看到 column Meta,column Meta 里面就記錄著 data 的 extent,然后可以根據(jù)這些 IO 去讀數(shù)據(jù),能夠很方便地獲得真正想要的數(shù)據(jù)。

當(dāng)遇到有些數(shù)據(jù)不常用到但也需要去分析時,用戶決定讀哪些數(shù)據(jù),對應(yīng)對象的Meta 就需要不停地去查,系統(tǒng)會將對象的 Meta 放在常駐緩存中,解決數(shù)據(jù)讀取時效的問題。

二、性能的保證

圖片

需要訪問的數(shù)據(jù)多種多樣,包括元數(shù)據(jù)、Table data、索引、checkpoint 以及各種日志。為了保證低成本訪問,需要做 metadata cache、index cache 等等。拿到數(shù)據(jù)后,需要高效地解析。

圖片

為了實現(xiàn)對元數(shù)據(jù)的高效解析,我們也做了很多嘗試。比如采用 byte 的方式,放在內(nèi)存里面也不需要序列化,直接去用就可以了。要去讀哪些字段時,靠指針偏移即可完成。

數(shù)據(jù)寫入的時候也很方便,set 一個 block ID,相當(dāng)于通過 block ID 這個結(jié)構(gòu)先做成 byte,可以直接拷貝,指針操作也很方便。

通過 Benchmark 做反序列化解析,只要拿到相應(yīng)的 Meta data 的 ID,整個解析過程會比較快,是納秒級別的速度。

三、數(shù)據(jù)兼容性和使?場景

1. 數(shù)據(jù)兼容性

圖片

兼容性也是個很重要的問題,比如客戶已經(jīng)用了一兩年,有些優(yōu)化需要修改數(shù)據(jù)格式,那么新的代碼肯定要對以前的數(shù)據(jù)做好兼容。

我們的方案比較簡單,每個 IO Entry 會在 Header 中標(biāo)記 Data Type,type 會決定如何 encode 和 decode。Version 是 type 的版本。版本切換時,注冊相應(yīng)的 encode 和 decode 函數(shù),讀到相應(yīng)的 IO Entry Header,選擇對應(yīng)的函數(shù),解析數(shù)據(jù),這樣就可以實現(xiàn)兼容。

圖片

以上是結(jié)構(gòu)圖,IOEntryHeader 中記錄著 Type 和 Version。Type 包括對象的 Meta,column data,還有 index 等等。用戶寫數(shù)據(jù)時,系統(tǒng)會注冊一個 encode 函數(shù),如果要寫入對象的 Meta,對象 Meta 是版本 2,就會標(biāo)記 type 為 type1,版本是 version2,后面就是要寫入的 Meta的byte。

讀的時候,先讀到 header,因為系統(tǒng)去讀 IO Entry 是把所有的東西都讀上來,之后先拿前面兩個字段,通過 header 去做解析。

從開始到現(xiàn)在,MatrixOne 的版本只變過三次,每個版本會有簡潔的對應(yīng)的函數(shù),維護起來非常便捷。

2. 應(yīng)用場景

圖片

系統(tǒng)有單獨的 log service,其余所有的數(shù)據(jù)結(jié)構(gòu)都使用這種結(jié)構(gòu)-落盤讀取,包括正常業(yè)務(wù)的讀寫 table 數(shù)據(jù),查詢或者插入等等。

支持 checkpoint、catalog。系統(tǒng)隔一段時間會打一個 checkpoint,記錄增加了哪個 DB,DB 里面增加了幾個 table,如果是落盤的數(shù)據(jù),增加哪個對象,以及具體的對象數(shù)據(jù)的里面 block。啟動的時候,系統(tǒng)會根據(jù) checkpoint,replay 出來 catalog。用戶可以根據(jù) Catalog 去查詢 DB 數(shù)據(jù)。

Metadata 掃描的主要功能是查看 scan 用戶存了多少數(shù)據(jù),存了多少表 DB,這些 DB 具體有多少個對象文件,對象到底都有多大,壓縮前、壓縮后分別是多大等等。Metadata 掃描會用到對象的 metadata,常駐在緩存里面,效率很高。

查詢結(jié)果的 cache 的使用,在遇到比較大的查詢分析時,比如一個查詢分析要幾秒,耗費計算資源比較多,系統(tǒng)會將這些結(jié)果都存在 cache 里。這樣用戶下次查詢就不需要再重新去 load 那么多數(shù)據(jù)再重新計算。

圖片


四、問答環(huán)節(jié)

Q1:社區(qū)實現(xiàn)動態(tài) catalog 會考慮任務(wù)修改?

A1:現(xiàn)在 Catalog 是通過 checkpoint 來做,問題已經(jīng)得到解決,checkpoint 所有都是增量的,增量的所有的記錄都會記錄下來,增刪改查或 DDL,這些東西都記錄在 checkpoint 里面,只要 Replay 即可。Catalog 也是常駐在內(nèi)存當(dāng)中的,可以進行原子性的控制。

Q2:比如企業(yè)已有一個非常完善的,且有很多存量數(shù)據(jù)的集群,在這種情況下怎么使用 MatrixOne 呢?

A2:MatrixOne 對外提供了集群對接的小工具,MoDump,可以實現(xiàn) load 這些數(shù)據(jù)。首先要做的是把這些數(shù)據(jù)打包 load 出來,然后再把這些數(shù)據(jù) load 到產(chǎn)品里面。后期會開發(fā)一些對接各種數(shù)據(jù)庫可以實時拷貝的工具。

責(zé)任編輯:姜華 來源: DataFunTalk
相關(guān)推薦

2016-05-10 20:30:32

聯(lián)想

2023-01-12 15:32:46

云原生Loggie

2017-09-30 10:41:22

數(shù)據(jù)庫PolarDB關(guān)系

2024-05-06 07:39:30

CubeFS云原生存儲平臺

2016-10-28 20:53:55

數(shù)據(jù)中心

2010-05-05 18:05:00

新一代數(shù)據(jù)中心

2024-03-04 07:55:41

數(shù)據(jù)架構(gòu)AlluxioNewsBreak

2013-07-03 09:49:21

云計算數(shù)據(jù)中心

2010-02-04 17:29:35

Android OS平

2021-12-16 12:42:18

AIoT人工智能物聯(lián)網(wǎng)

2023-03-09 22:00:25

2017-04-07 17:04:28

思科朱立新

2021-09-07 11:07:35

AnalyticDBSQL 云原生

2018-11-22 19:29:23

騰訊云數(shù)據(jù)庫企業(yè)

2017-09-25 10:27:37

阿里云POLARDB數(shù)據(jù)庫

2016-09-13 17:32:33

數(shù)據(jù)中心

2024-03-12 07:24:26

DingoDB數(shù)據(jù)庫數(shù)據(jù)的存儲
點贊
收藏

51CTO技術(shù)棧公眾號