五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

從 Git 到 Databend Fuse Engine 存儲引擎

2022-05-11 17:44 作者:Databend  | 我要投稿

Databend 是一個使用 Rust 研發(fā)、開源的、完全面向云架構(gòu)的新式數(shù)倉,致力于提供極速的彈性擴(kuò)展能力,打造按需、按量的 Data Cloud 產(chǎn)品體驗(yàn)。開源地址:https://github.com/datafuselabs/databend ?


前言

這篇來介紹下 Databend 底座:Fuse Engine,一個動力澎湃的列式存儲引擎,Databend Fuse Engine 在設(shè)計(jì)之初社區(qū)給它的定位是:動力要澎湃,架構(gòu)要簡單,可靠性要高。在正式介紹之前,我們先看一組“挑戰(zhàn)數(shù)據(jù)”,Databend Fuse Engine + AWS S3,一個事務(wù)在 ~1.5 小時寫入了 22.89 TB 原始數(shù)據(jù):


mysql> INSERT INTO ontime_new SELECT * FROM ontime_new;
Query OK, 0 rows affected (1 hour 34 min 36.82 sec)
Read 31619274180 rows, 22.89 TB in 5675.207 sec., 5.57 million rows/sec., 4.03 GB/sec.


同時,在功能上要滿足:

  • 分布式事務(wù):支持多個計(jì)算節(jié)點(diǎn)同時讀、寫同一份數(shù)據(jù)(存算分離架構(gòu)首先要解決的問題)

  • 快照隔離:不同版本數(shù)據(jù)之間互不影響,方便做 Table Zero-Copy

  • 回溯能力:可切換到任意一個版本,方便做 Time Travel

  • 數(shù)據(jù)合并:合并后生成新版本數(shù)據(jù)

  • 簡單、健壯:關(guān)系通過文件來描述,基于這些文件即可恢復(fù)出整個數(shù)據(jù)系統(tǒng)

從這些需求出發(fā),你會發(fā)現(xiàn) Fuse Engine 跟 Git “形似”(Git-inspired),在介紹 Fuse Engine 設(shè)計(jì)之前,我們先來看看 Git 底層是如何工作的。


Git工作機(jī)制

?解決了分布式環(huán)境下的數(shù)據(jù)版本管理(data version control)問題,它有隔離(branch)、提交(commit)、回溯(checkout),以及合并(merge)功能,基于 Git 語義完全可以打造出一個分布式存儲引擎。市面上也出現(xiàn)一些基于 Git-like 思想而構(gòu)建的產(chǎn)品,比如 Nessie - Transactional Catalog for Data Lakes 和 lakeFS 。

為了更好的探索 Git 底層工作機(jī)制,我們選擇從數(shù)據(jù)庫角度出發(fā),使用 Git 語義來完成一系列“數(shù)據(jù)”操作。

1.首先,準(zhǔn)備一個數(shù)據(jù)文件 cloud.txt,內(nèi)容為:

2022/05/06,?Databend,?Cloud


2.把?cloud.txt?數(shù)據(jù)寫到 Git 系統(tǒng):

git?commit?-m?"Add?olap.txt"


3.Git 為我們生成一個快照,Commit ID 為:7d972c7ba9213c2a2b15422d4f31a8cbc9815f71

git log
commit 7d972c7ba9213c2a2b15422d4f31a8cbc9815f71 (HEAD)
Author: BohuTANG <overred.shuttler@gmail.com>
Date: ? Fri May 6 16:44:21 2022 +0800

? ?Add cloud.txt


4.再準(zhǔn)備一個新文件 warehouse.txt

2022/05/07,?Databend,?Warehouse


5.把?warehouse.txt?數(shù)據(jù)寫到 Git 系統(tǒng)

git?commit?-m?"Add?warehouse.txt"


6.Git 為我們生成一個新的快照,Commit ID 為:15af34e4d16082034e1faeaddd0332b3836f1424

commit 15af34e4d16082034e1faeaddd0332b3836f1424 (HEAD)
Author: BohuTANG <overred.shuttler@gmail.com>
Date: ? Fri May 6 17:41:43 2022 +0800

? ?Add warehouse.txt

commit 7d972c7ba9213c2a2b15422d4f31a8cbc9815f71
Author: BohuTANG <overred.shuttler@gmail.com>
Date: ? Fri May 6 16:44:21 2022 +0800

? ?Add cloud.txt


到此為止,Git 已經(jīng)為我們維護(hù)了 2 個版本的數(shù)據(jù):

ID?15af34e4d16082034e1faeaddd0332b3836f1424,版本2
ID?7d972c7ba9213c2a2b15422d4f31a8cbc9815f71,版本1


我們可以根據(jù) Commit ID 進(jìn)行版本間的任意切換,也就是實(shí)現(xiàn)了 Time Travel 和 Table Zero-Copy 功能,那么 Git 底層是如何做到的呢?方式也比較簡單,它通過引入 3 類對象文件來進(jìn)行關(guān)系描述:

  • Commit 文件,用于描述 tree 對象信息

  • Tree 文件,用于描述 blob 對象信息

  • Blob 文件,用于描述文件信息


HEAD 文件

首先,我們需要知道一個 HEAD ?指針:

cat .git/HEAD
15af34e4d16082034e1faeaddd0332b3836f1424


Commit 文件

Commit 文件會記錄跟 commit 相關(guān)的一些元數(shù)據(jù)信息,比如當(dāng)前 tree 以及 parent,還有提交人等,文件路徑:

.git/objects/15/af34e4d16082034e1faeaddd0332b3836f1424


文件內(nèi)容

git cat-file -p 15af34e4d16082034e1faeaddd0332b3836f1424

tree 576c63e580846fa6df2337c1f074c8d840e0b70a
parent 7d972c7ba9213c2a2b15422d4f31a8cbc9815f71
author BohuTANG <overred.shuttler@gmail.com> 1651830103 +0800
committer BohuTANG <overred.shuttler@gmail.com> 1651830103 +0800

Add warehouse.txt


Tree 文件

Tree 文件記錄當(dāng)前版本下所有的數(shù)據(jù)文件,文件路徑:

.git/objects/57/6c63e580846fa6df2337c1f074c8d840e0b70a


文件內(nèi)容:

git cat-file -p 576c63e580846fa6df2337c1f074c8d840e0b70a

100644 blob 688de5069f9e873c7e7bd15aa67c6c33e0594dde cloud.txt
100644 blob bdea812b9602ed3c6662a2231b3f1e7b52dc1ccb warehouse.txt


Blob 文件

Blob 文件是原始數(shù)據(jù)文件,同樣可以通過?git cat-file?命令來查看文件內(nèi)容(如果使用 Git 來管理代碼,Blob 就是我們的代碼文件)。

git cat-file -p 688de5069f9e873c7e7bd15aa67c6c33e0594dde
2022/05/06, Databend, Cloud

git cat-file -p bdea812b9602ed3c6662a2231b3f1e7b52dc1ccb
2022/05/07, Databend, Warehouse


Fuse Engine

Databend Fuse Engine 在設(shè)計(jì)上,跟 Git 非常類似,它引入 3 個描述文件:


  • Snapshot 文件,用于描述 Segment 對象信息

  • Segment 文件,用于描述 Block 對象信息

  • Block 文件,用于描述 Parquet 文件信息


我們繼續(xù)在 Fuse Engine 里進(jìn)行一把剛才在 Git 進(jìn)行的操作。

1.首先創(chuàng)建一個表:

CREATE?TABLE?git(file?VARCHAR,?content?VARCHAR);


2.把?cloud.txt?數(shù)據(jù)寫到 Fuse Engine

INSERT?INTO?git?VALUES('cloud.txt',?'2022/05/06,?Databend,?Cloud');


3.Fuse 為我們生成一個新的 Snapshot?ID? 6450690b09c449939a83268c49c12bb2

CALL system$fuse_snapshot('default', 'git');
*************************** 1. row ***************************
? ? ? ? snapshot_id: 6450690b09c449939a83268c49c12bb2
? snapshot_location: 53/133/_ss/6450690b09c449939a83268c49c12bb2_v1.json
? ? ?format_version: 1
previous_snapshot_id: NULL
? ? ? segment_count: 1
? ? ? ? block_count: 1
? ? ? ? ? row_count: 1
?bytes_uncompressed: 68
? ?bytes_compressed: 351


4.把?warehouse.txt??數(shù)據(jù)寫到 Fuse Engine

INSERT?INTO?git?VALUES('warehouse.txt',?'2022/05/07,?Databend,?Warehouse');


5.Fuse Engine 為我們生成一個新的 Snapshot ID? efe2687fd1fc48f8b414b5df2cec1e19,并指向前一個 Snapshot ID? 6450690b09c449939a83268c49c12bb2

CALL system$fuse_snapshot('default', 'git');
*************************** 1. row ***************************
? ? ? ? snapshot_id: efe2687fd1fc48f8b414b5df2cec1e19
? snapshot_location: 53/133/_ss/efe2687fd1fc48f8b414b5df2cec1e19_v1.json
? ? ?format_version: 1
previous_snapshot_id: 6450690b09c449939a83268c49c12bb2
? ? ? segment_count: 2
? ? ? ? block_count: 2
? ? ? ? ? row_count: 2
*************************** 2. row ***************************
? ? ? ? snapshot_id: 6450690b09c449939a83268c49c12bb2
? snapshot_location: 53/133/_ss/6450690b09c449939a83268c49c12bb2_v1.json
? ? ?format_version: 1
previous_snapshot_id: NULL
? ? ? segment_count: 1
? ? ? ? block_count: 1
? ? ? ? ? row_count: 1

目前為止,F(xiàn)use Engine 為我們生成了 2 個版本的數(shù)據(jù):

ID?efe2687fd1fc48f8b414b5df2cec1e19,版本2
ID?6450690b09c449939a83268c49c12bb2,版本1


是不是跟 Git 非常類似?


HEAD

跟 Git 一樣,F(xiàn)use Engine 也需要一個 HEAD 作為入口,查看 Fuse Engine 的 HEAD:

SHOW CREATE TABLE git\G;
*************************** 1. row ***************************
? ? ? Table: git
Create Table: CREATE TABLE `git` (
?`file` VARCHAR,
?`content` VARCHAR
) ENGINE=FUSE SNAPSHOT_LOCATION='53/133/_ss/efe2687fd1fc48f8b414b5df2cec1e19_v1.json'


SNAPSHOT_LOCATION 就是 HEAD,默認(rèn)指向最新的快照 efe2687fd1fc48f8b414b5df2cec1e19,那我們?nèi)绾吻械?ID 為 6450690b09c449939a83268c49c12bb2 的快照數(shù)據(jù)呢?


很簡單,先查看當(dāng)前表的 Snapshot 信息:

CALL system$fuse_snapshot('default', 'git')\G;
*************************** 1. row ***************************
? ? ? ? snapshot_id: efe2687fd1fc48f8b414b5df2cec1e19
? snapshot_location: 53/133/_ss/efe2687fd1fc48f8b414b5df2cec1e19_v1.json
? ? ?format_version: 1
previous_snapshot_id: 6450690b09c449939a83268c49c12bb2
? ? ? segment_count: 2
? ? ? ? block_count: 2
? ? ? ? ? row_count: 2
*************************** 2. row ***************************
? ? ? ? snapshot_id: 6450690b09c449939a83268c49c12bb2
? snapshot_location: 53/133/_ss/6450690b09c449939a83268c49c12bb2_v1.json
? ? ?format_version: 1
previous_snapshot_id: NULL
? ? ? segment_count: 1
? ? ? ? block_count: 1
? ? ? ? ? row_count: 1


然后創(chuàng)建一個新表(git_v1)并把 SNAPSHOT_LOCATION 指向相應(yīng)的? Snapshot 文件:

CREATE TABLE git_v1(`file` VARCHAR, `content` VARCHAR) SNAPSHOT_LOCATION='53/133/_ss/6450690b09c449939a83268c49c12bb2_v1.json';

SELECT * FROM git_v1;
+-----------+-----------------------------+
| file ? ? ?| content ? ? ? ? ? ? ? ? ? ? |
+-----------+-----------------------------+
| cloud.txt | 2022/05/06, Databend, Cloud |
+-----------+-----------------------------+


Snapshot 文件

用于存儲 Segment 信息,文件路徑 :

53/133/_ss/efe2687fd1fc48f8b414b5df2cec1e19_v1.json


文件內(nèi)容:

{
? "format_version":1,
? "snapshot_id":"efe2687f-d1fc-48f8-b414-b5df2cec1e19",
? "prev_snapshot_id":[
? ? ?"6450690b-09c4-4993-9a83-268c49c12bb2",
? ? ?1
? ],
?
? "segments":[
? ? ?[
? ? ? ? "53/133/_sg/df56e911eb26446b9f8fac5acc65a580_v1.json"
? ? ?],
? ? ?[
? ? ? ? "53/133/_sg/d0bff902b98846469480b23c2a8f93d7_v1.json"
? ? ?]
? ]
? ... ...
}


Segment 文件

用于存儲 Block 相關(guān)信息,文件路徑:?

{
? "format_version":1,
? "blocks":[
? ? ?{
? ? ? ? "row_count":1,
? ? ? ? "block_size":76,
? ? ? ? "file_size":360,
? ? ? ? "location":[
? ? ? ? ? ?"53/133/_b/ba4a60013e27479e856f739aefeadfaf_v0.parquet",
? ? ? ? ? ?0
? ? ? ? ],
? ? ? ? "compression":"Lz4Raw"
? ? ?}
? ]
? ... ...
}


Block 文件

Fuse Engine 底層數(shù)據(jù)使用 Parquet 格式,每個文件內(nèi)部有多個 Block 組成。


小結(jié)

Databend Fuse Engine 在早期設(shè)計(jì)(2021 年 10 月)時候,需求很明確,但方案選型還是經(jīng)歷過一段小曲折。當(dāng)時,Databend 社區(qū)調(diào)研了市面上大量的 Table Format 方案(比如 Iceberg 等),當(dāng)時面臨的挑戰(zhàn)是基于現(xiàn)有方案還是自己造一套?最終選擇研發(fā)一套簡潔的、適合自己的 Storage Engine,但數(shù)據(jù)存儲格式選擇 Parquet 標(biāo)準(zhǔn)。在 Fuse Engine 里,我們把 Parquet Footer 單獨(dú)存放,以減少不必要的 Seek 操作,另外增加了一套更加靈活的索引機(jī)制,比如 Aggregation,Join 等都可以有自己的索引來進(jìn)行加速。

歡迎體驗(yàn) Fuse Engine,掛上對象存儲,讓你體驗(yàn)不一樣的大數(shù)據(jù)分析 https://databend.rs/doc/deploy?Databend?

開源地址:https://github.com/datafuselabs/databend


關(guān)于Databend

Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實(shí)時分析的新式數(shù)倉。期待您的關(guān)注,一起探索云原生數(shù)倉解決方案,打造新一代開源 Data Cloud。

  • Databend 文檔:https://databend.rs/

  • twitter:https://twitter.com/Datafuse_Labs

  • Slack:https://datafusecloud.slack.com/

  • Wechat:Databend

  • GitHub :https://github.com/datafuselabs/databend


文章首發(fā)于公眾號:Databend


從 Git 到 Databend Fuse Engine 存儲引擎的評論 (共 條)

分享到微博請遵守國家法律
张北县| 苍溪县| 垣曲县| 乃东县| 安远县| 博客| 宝山区| 芜湖市| 迭部县| 忻州市| 香河县| 宣威市| 孝感市| 岳阳市| 裕民县| 广南县| 东宁县| 红河县| 萨嘎县| 托克托县| 西充县| 磐安县| 项城市| 松原市| 中卫市| 棋牌| 明水县| 特克斯县| 定安县| 锡林郭勒盟| 宜昌市| 望都县| 平南县| 班玛县| 澎湖县| 饶河县| 鹤壁市| 凤庆县| 玛曲县| 迁安市| 北票市|