5月18日,騰訊云首款分布式分析型數(shù)據(jù)庫TDSQL-A正式發(fā)布公有云版本。
TDSQL-A作為領(lǐng)先的分析型數(shù)據(jù)庫,是騰訊首款分布式分析型數(shù)據(jù)庫,采用全并行無共享架構(gòu),具有自研列式存儲(chǔ)引擎,支持行列混合存儲(chǔ),適應(yīng)于海量OLAP關(guān)聯(lián)分析查詢場(chǎng)景。它能夠支持2000臺(tái)物理服務(wù)器以上的集群規(guī)模,存儲(chǔ)容量能達(dá)到單數(shù)據(jù)庫實(shí)例百P級(jí)。
**TDSQL-A具備強(qiáng)大的海量數(shù)據(jù)實(shí)時(shí)分析能力,并全面兼容PostgreSQL語法、高度兼容Oracle語法,同時(shí)具備高安全、高可用、超大規(guī)模集群支持和完整事務(wù)能力等產(chǎn)品特性,可為企業(yè)用戶需求提供高效、低成本的數(shù)據(jù)分析解決方案。**
其中,TDSQL-A完整的分布式事務(wù)處理能力,可實(shí)時(shí)保障系統(tǒng)多平面數(shù)據(jù)全局讀一致性、可靠性;支持多級(jí)容災(zāi)以及多維度資源隔離,還提供強(qiáng)大的多級(jí)安全體系,提供完善的企業(yè)級(jí)管理能力,為用戶提供容災(zāi)、備份、恢復(fù)、監(jiān)控、安全、審計(jì)等全套解決方案。同時(shí)TDSQL-A提供彈性擴(kuò)縮容能力,適用于 GB-PB 級(jí)的海量 OLAP 場(chǎng)景,是市場(chǎng)領(lǐng)先的企業(yè)級(jí)分析型數(shù)據(jù)庫引擎產(chǎn)品。
TDSQL-A有這么多吸引人的特性,這些特性具體是如何保證完備、優(yōu)雅地解決以上這些需求問題的呢?以下是騰訊云數(shù)據(jù)庫技術(shù)總監(jiān)李躍森老師對(duì)TDSQL-A產(chǎn)品核心架構(gòu)的分享。
# 一、TDSQL-A場(chǎng)景定位
**TDSQL-A是騰訊基于PostgreSQL自主研發(fā)的分布式在線關(guān)系型數(shù)據(jù)倉(cāng)庫,業(yè)務(wù)場(chǎng)景針對(duì)于在線數(shù)據(jù)分析。**
TDSQL-A是植根于騰訊內(nèi)部業(yè)務(wù)發(fā)展起來的分布式數(shù)據(jù)庫,最早的時(shí)候我們是用TDSQL-PG來做一些大數(shù)據(jù)平臺(tái)小規(guī)模的數(shù)據(jù)分析。隨著業(yè)務(wù)的發(fā)展,我們發(fā)現(xiàn)單機(jī)的數(shù)據(jù)庫逐漸不能滿足業(yè)務(wù)的需要,我們就萌生了要開發(fā)分布式數(shù)據(jù)庫的想法。最早我們服務(wù)了微信支付,而隨著業(yè)務(wù)的發(fā)展,我們逐步自主研發(fā)了列存儲(chǔ),來增進(jìn)TDSQL 分析型能力。
同時(shí),隨著騰訊云業(yè)務(wù)的拓展,TDSQL-A也逐步走向服務(wù)外部客戶的過程中,積累了大量?jī)?yōu)秀案例實(shí)踐。
# 二、TDSQL-A核心技術(shù)架構(gòu)
TDSQL-A整體架構(gòu)和PostgreSQL的整體架構(gòu)相比,是既緊緊地跟隨生態(tài),同時(shí)有深度定制改造。
**TDSQL-A數(shù)據(jù)庫的內(nèi)核,分為幾個(gè)部分:**
第一是上層的GTM事務(wù)管理器,它主要是負(fù)責(zé)全局事務(wù)的管理,協(xié)調(diào)機(jī)群的事務(wù),同時(shí)管理集群的全體對(duì)象。右上角是協(xié)調(diào)節(jié)點(diǎn),它是業(yè)務(wù)訪問入口。協(xié)調(diào)節(jié)點(diǎn)模塊是水平對(duì)等的,也就是說業(yè)務(wù)連接到任何一個(gè)協(xié)調(diào)節(jié)點(diǎn)上,都能夠獲得到一致的數(shù)據(jù)庫視圖。
第二是下方的數(shù)據(jù)節(jié)點(diǎn)。數(shù)據(jù)節(jié)點(diǎn)也是實(shí)際存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn),每個(gè)數(shù)據(jù)節(jié)點(diǎn)只會(huì)存儲(chǔ)數(shù)據(jù)的分片,而數(shù)據(jù)節(jié)點(diǎn)之間加在一起會(huì)形成一個(gè)完整的數(shù)據(jù)視圖。
而數(shù)據(jù)節(jié)點(diǎn)和協(xié)調(diào)節(jié)點(diǎn)之間是集群的數(shù)據(jù)交互總線。集群數(shù)據(jù)交互總線在TDSQL-PG和TDSQL-A之間是存在差異的——兩者在系統(tǒng)內(nèi)名字上來講都叫集群交互總線,但是在這兩個(gè)不同的產(chǎn)品形態(tài)下,其實(shí)現(xiàn)邏輯完全不同——在TDSQL-A里面通過基于物理網(wǎng)卡的數(shù)據(jù)交互匯集器,并通過完整的網(wǎng)絡(luò)連接的復(fù)用來完成這個(gè)工作。集群交互總線的目的是把集群內(nèi)部節(jié)點(diǎn)連接在一起,從而完成整個(gè)查詢交互。
最后,左側(cè)描述的是數(shù)據(jù)庫內(nèi)核的運(yùn)維管控系統(tǒng)。數(shù)據(jù)庫在運(yùn)行的時(shí)候需要一個(gè)運(yùn)維管控系統(tǒng)來支撐運(yùn)營(yíng),包括運(yùn)維管理、實(shí)時(shí)監(jiān)控、實(shí)時(shí)告警、安全審計(jì)和數(shù)據(jù)治理等等。
**2.1 TDSQL-A自研行列混合存儲(chǔ)能力**
下面介紹TDSQL-A全自研的行列混合的存儲(chǔ)能力。
數(shù)據(jù)庫的存儲(chǔ)有兩種方式,一個(gè)是按行存儲(chǔ)、一個(gè)是按列存儲(chǔ):
按行存儲(chǔ)表:每行數(shù)據(jù)存儲(chǔ)所有列、一次磁盤IO可以訪問一行中所有列、適合OLTP場(chǎng)景。
按列存儲(chǔ)表:每列單獨(dú)存儲(chǔ),多個(gè)列邏輯組成一行;一次磁盤IO只包含一列數(shù)據(jù);方便做數(shù)據(jù)壓縮;適合OLAP場(chǎng)景。
TDSQL-A支持按列存儲(chǔ)和按行存儲(chǔ)兩種方式來建表,同時(shí)在列表和行表之間,用戶不用感知到下層的表是通過行表還是列表來建,行表和列表之間可以進(jìn)行無縫的互操作——包括相互關(guān)聯(lián)、相互交換數(shù)據(jù),完全不需要感知到底下的存儲(chǔ)邏輯。
除了操作的便利性之外,行表和列表之間混合查詢還能保持完整的事務(wù)一致性,也就是說在查詢運(yùn)行的同時(shí),整個(gè)事務(wù)(ACID)的能力也得到完整的保證。
**2.2 ?TDSQL-A列存儲(chǔ)壓縮能力**
列存模塊,我們介紹列存儲(chǔ)壓縮能力。
TDSQL-A的列存儲(chǔ)壓縮分為兩種:
第一種是輕量式壓縮。輕量式壓縮方式首先感知到數(shù)據(jù)的具體內(nèi)容,從而針對(duì)數(shù)據(jù)的特點(diǎn)來選用不同的壓縮辦法提高壓縮比,降低業(yè)務(wù)的成本,當(dāng)前我們支持RLE的壓縮方式。
第二種是透明壓縮。這種壓縮方式是直接使用包括zstd和gzip直接進(jìn)行壓縮,這種壓縮對(duì)數(shù)據(jù)的存儲(chǔ)內(nèi)容沒有明確的要求,可以對(duì)任何的信息進(jìn)行壓縮。通過數(shù)據(jù)壓縮,可以把數(shù)據(jù)的體積大幅度減少,一方面減少用戶的使用成本,另一方面可以在大量查詢分析的時(shí)候減少IO訪問量,提升我們的查詢效率。
**2.3 ?TDSQL-A執(zhí)行引擎:延遲物化原理**
在存儲(chǔ)層之上,是數(shù)據(jù)庫的執(zhí)行引擎。執(zhí)行引擎模塊中,大規(guī)模的查詢分析場(chǎng)景下的數(shù)據(jù)交換以及IO、網(wǎng)絡(luò)開銷是非常大的關(guān)注點(diǎn),因?yàn)槠鋵?duì)系統(tǒng)性能以及整體擴(kuò)展性都有很大影響。
TDSQL-A在調(diào)研了業(yè)界的技術(shù)趨勢(shì)和技術(shù)的發(fā)展方向之后,在引擎里引入了延遲物化。相對(duì)于延遲物化,就是一般常見的提前物化。提前物化指的就是查詢執(zhí)行器再去執(zhí)行掃描的時(shí)候——這里簡(jiǎn)單理解這些查詢里面包括Scan、Join、Project等。
這里舉一個(gè)例子,一個(gè)場(chǎng)景中有兩張表——tbl_a和tbl_b,兩張表上都有f1和f2兩列,分布列都是f1。按照tbl_a的f1列與tbl_b的非分布列f2來進(jìn)行關(guān)聯(lián)——此時(shí)左邊是提前物化的計(jì)算方法, Project需要返回tbl_b的f1,進(jìn)行Join關(guān)聯(lián)的時(shí)候需要tbl_b的f2,所以在對(duì)tbl_b進(jìn)行Scan的時(shí)候,就會(huì)把tbl_b的f1和f2都物化出來。所謂的物化,是把兩個(gè)列在文件里面讀出來,在內(nèi)存里形成一個(gè)虛擬的記錄元組,然后往上傳輸。實(shí)際上可以看一下,在最上層往里面投數(shù)據(jù)的時(shí)候,只投影了tbl_b的f1。在這個(gè)過程中,如果中間Join關(guān)聯(lián)的過濾比例很高,比如說只有1%是滿足要求的,這里面有很多tbl_b的f1列數(shù)據(jù)是沒有必要傳輸進(jìn)來的。
**可見,提前物化造成對(duì)網(wǎng)絡(luò)帶寬的浪費(fèi):**
JOIN的選擇率等于0.01
TBL_B中有20億條記錄
JOIN有20億 * (1 – 0.01) * sizeof(TBL_B .f1) = 7.4GB的無效數(shù)據(jù)傳輸。
這個(gè)現(xiàn)象是在OLAP場(chǎng)景下常見的開銷,因?yàn)镺LAP做各種復(fù)雜查詢時(shí)很多是寬表,而且查詢時(shí)大多數(shù)時(shí)候只會(huì)訪問寬表里面極少數(shù)列,這個(gè)時(shí)候如果遇到了比較典型的選擇率很低、投影率很少的情況,開銷就變得不能忽視。
TDSQL-A延遲物化技術(shù)就是針對(duì)剛才的問題提出的優(yōu)化方案。TDSQL-A延遲物化查詢計(jì)劃會(huì)在下層進(jìn)行Scan的時(shí)候,針對(duì)Join中不需要的目標(biāo)列只往上層傳遞物理元組的位置信息到上層節(jié)點(diǎn)。只有等上層節(jié)點(diǎn)完成Join關(guān)聯(lián)后,才會(huì)去把滿足條件的記錄的位置信息記錄下來,在投影階段再到下層拉取需要的數(shù)據(jù)信息,進(jìn)而透到外面。
通過測(cè)試證明,這種方式可以大幅度地節(jié)省CPU的計(jì)算開銷和網(wǎng)絡(luò)IO、磁盤IO的開銷。
延遲物化對(duì)性能提升的效果:當(dāng)測(cè)試的場(chǎng)景是20節(jié)點(diǎn)、20臺(tái)節(jié)點(diǎn)、1TB的數(shù)據(jù),選擇率是10%,投影率是60%,兩表進(jìn)行Join??梢悦黠@地發(fā)現(xiàn),時(shí)間消耗相比是提前物化的五分之一,網(wǎng)絡(luò)帶寬的占用只有提前物化的一半。假設(shè)把表Join個(gè)數(shù)從兩個(gè)變成三個(gè),消耗的時(shí)間則是其30%,網(wǎng)絡(luò)占用比接近40%——也就是說節(jié)省了60%的網(wǎng)絡(luò)占用。
因此,測(cè)試結(jié)果證明這對(duì)于IO和網(wǎng)絡(luò)開銷有非常明顯的節(jié)省。而通過這兩個(gè)開銷的節(jié)省,可以進(jìn)一步影響到性能的提升。
此外我們專門做了一個(gè)復(fù)雜Join的測(cè)試:選擇率是1%、投影率是100%;兩表的Join,橫坐標(biāo)是100GB到1TB。從上面兩表的Join可以看出,表越大到1TB的時(shí)候,相比開源的GP有5.2倍性能的提升;假設(shè)把兩張表變成三張表,則有18倍性能提升??梢?,隨著查詢變得復(fù)雜、表變得越大,在延遲物化的場(chǎng)景下對(duì)性能的提升越明顯。
**2.4TDSQL-A全新設(shè)計(jì)的異步執(zhí)行器解耦控制和數(shù)據(jù)交互**
最初我們目標(biāo)是讓TDSQL—A支持?jǐn)?shù)千臺(tái)服務(wù)器集群規(guī)模。支撐數(shù)千臺(tái)服務(wù)器的規(guī)模,存在一些必須要去跨越的障礙,其中一個(gè)障礙就是網(wǎng)絡(luò)連接數(shù)過多。
為了解決上連接數(shù)過高的問題,TDSQL-A全新設(shè)計(jì)了異步執(zhí)行器。TDSQL-A的執(zhí)行器是全新自研設(shè)計(jì)的執(zhí)行器,主要有兩個(gè)特點(diǎn):第一個(gè)是異步執(zhí)行;第二個(gè)是控制邏輯和數(shù)據(jù)傳輸邏輯分離。
具體來說,系統(tǒng)在查詢優(yōu)化階段的時(shí)候會(huì)生成統(tǒng)一的執(zhí)行計(jì)劃、統(tǒng)一執(zhí)行需要的資源,這是TDSQL-A的控制邏輯。同時(shí)系統(tǒng)把整個(gè)網(wǎng)絡(luò)通信進(jìn)行了抽象,抽象成下面藍(lán)色的Router——Router主要是負(fù)責(zé)機(jī)群內(nèi)部的數(shù)據(jù)查收。不同的進(jìn)程之間,比如兩層Join或者三層Join,不同層級(jí)的進(jìn)程之間是完全異步執(zhí)行的,并通過推送數(shù)據(jù)的方式來完成數(shù)據(jù)交互。假設(shè)有N個(gè)節(jié)點(diǎn),有M層join,則一共有M×N個(gè)進(jìn)程。
在對(duì)執(zhí)行器進(jìn)行異步化和控制數(shù)據(jù)分層的基礎(chǔ)上,TDSQL-A又對(duì)數(shù)據(jù)交互邏輯進(jìn)行完整實(shí)現(xiàn),這就是數(shù)據(jù)交互總線(Forward Node)。它主要是負(fù)責(zé)節(jié)點(diǎn)間的數(shù)據(jù)交互??梢哉J(rèn)為它是我們集群的邏輯網(wǎng)卡。
FN通過共享內(nèi)存和CN、DN進(jìn)行數(shù)據(jù)交互——當(dāng)然也存在本地的邏輯交互,假設(shè)數(shù)據(jù)需要從本地內(nèi)部進(jìn)行交互,可以不走網(wǎng)絡(luò)而直接在內(nèi)存里面完成交互,進(jìn)一步提升性能。
啟用了FN之后,假設(shè)有N個(gè)節(jié)點(diǎn),M×Join不管有多復(fù)雜,連接個(gè)數(shù)都是只有(N-1)×S——這個(gè)“S”是一個(gè)正整數(shù),這意味著每臺(tái)服務(wù)器和其他服務(wù)器建N個(gè)連接,一般來說會(huì)乘2,這樣就可以把整個(gè)集群內(nèi)部的網(wǎng)絡(luò)連接完全抽象和簡(jiǎn)化。服務(wù)器與服務(wù)器之間建立的連接個(gè)數(shù)變成近似于和集群規(guī)模相關(guān)的一個(gè)很小的數(shù)值:假設(shè)我們有2000臺(tái)服務(wù)器,這個(gè)值也只會(huì)在4000左右。
現(xiàn)在很多業(yè)務(wù)場(chǎng)景下業(yè)務(wù)都會(huì)要求讀多寫少——非常復(fù)雜的查詢的讀多寫少,比如最多有五六張20億條的表進(jìn)行關(guān)聯(lián),同時(shí)有數(shù)十個(gè)、甚至更多并發(fā)發(fā)生。這種情況將對(duì)數(shù)據(jù)庫的計(jì)算資源帶來極大的挑戰(zhàn)。一般而言,在不具備這個(gè)技術(shù)之前,一般做法是每當(dāng)計(jì)算資源不足,就多建一個(gè)新的數(shù)據(jù)庫集群來保存完整的數(shù)據(jù),在新建副本上通過擴(kuò)容的方式實(shí)現(xiàn)冗余數(shù)據(jù)的重新查詢。這種方式存在很大的問題——建一個(gè)新的數(shù)據(jù)庫,數(shù)據(jù)一致性是非常大的挑戰(zhàn)。擴(kuò)容的時(shí)候規(guī)模變得很大,同時(shí)每新建一個(gè)數(shù)據(jù)庫集群,就需要容災(zāi)、備份等所有的資源都同時(shí)擴(kuò)展,這導(dǎo)致的結(jié)果是數(shù)據(jù)庫整體的開銷更大、成本更高。
針對(duì)這個(gè)問題,TDSQL-A設(shè)計(jì)推出了多平面方案。
**2.5 TDSQL-A的多平面能力提供一致的讀擴(kuò)展性**
所謂的多平面:一個(gè)平面對(duì)應(yīng)一個(gè)完整的數(shù)據(jù)副本,完整的數(shù)據(jù)副本可以提供完整的一致性讀擴(kuò)展服務(wù)——讀擴(kuò)展可以是單條的查詢,也可以是復(fù)雜的OLAP的關(guān)聯(lián)查詢,通過這種方式TDSQL-A可以提供成本低廉的讀擴(kuò)展服務(wù)。
在TDSQL-A整個(gè)架構(gòu)體系當(dāng)中,多平面技術(shù)可在數(shù)據(jù)庫集群內(nèi)部保證各個(gè)平面之間數(shù)據(jù)一致性,同時(shí)也能保證各個(gè)平面在讀取時(shí)數(shù)據(jù)事務(wù)的一致性。
**2.6 TDSQL-A如何做到高性能計(jì)算—全并行能力**
對(duì)數(shù)據(jù)庫來說最關(guān)鍵的一點(diǎn)的無疑是高性能計(jì)算。以下介紹TDSQL-A在高速并行計(jì)算方面的工作。
在海量數(shù)據(jù)的實(shí)時(shí)分析場(chǎng)景下,我們一定要充分去發(fā)揮、充分壓榨資源才能達(dá)到最好的效果。這個(gè)方式,在TDSQL-A里面叫全并行能力。
**TDSQL-A全并行分為三個(gè)層級(jí):**
**第一層節(jié)點(diǎn)級(jí)并行。**所謂節(jié)點(diǎn)級(jí)的并行是,系統(tǒng)拿到一個(gè)查詢之后,會(huì)把查詢分發(fā)給各個(gè)不同的DN,通過DN之間分片區(qū)的查詢來完成節(jié)點(diǎn)級(jí)并行;
**第二是執(zhí)行器拿到分配后把算子并行化,即盡量使用允許更多CPU資源來完成查詢工作,通過多CPU方式提升查詢的效率;**
**第三層是指令層面**,包括對(duì)于CPU的特殊指令、SMD指令等,通過簡(jiǎn)單的算術(shù)運(yùn)算或者求值,以及通過指定值的優(yōu)化和并行來提升查詢效率。
總結(jié)而言,全并行計(jì)算是系統(tǒng)榨干硬件潛力的必經(jīng)之路,是做復(fù)雜查詢、實(shí)時(shí)在線查詢的必經(jīng)之路。
除了高性能計(jì)算,隨著行業(yè)對(duì)OLAP技術(shù)深入研究,近年來向量化也越來越受到關(guān)注。在TDSQL-A系統(tǒng),也實(shí)現(xiàn)了向量化能力:數(shù)據(jù)量越大,列存儲(chǔ)場(chǎng)景下向量化結(jié)果越明顯,最好的結(jié)果是列存儲(chǔ)向量化運(yùn)行時(shí)間會(huì)達(dá)到列存儲(chǔ)非向量化的二分之一、行存儲(chǔ)時(shí)間的八分之一左右。向量化也是在列存儲(chǔ)引擎里實(shí)現(xiàn)實(shí)時(shí)在線分析的必經(jīng)之路之一。
# 三、結(jié)語
當(dāng)前,是TDSQL-A的新起點(diǎn),未來TDSQL-A整體規(guī)劃分兩部分:一方面是陸續(xù)將目前基于PG10的版本,merge到PG11、PG12、PG13等更高版本,持續(xù)地跟進(jìn)社區(qū)版本豐富的特性來提升用戶的體驗(yàn),為客戶創(chuàng)造更多價(jià)值。另一方面,TDSQL-A希望通過引入新硬件,來提升產(chǎn)品競(jìng)爭(zhēng)力,為客戶提供更好的服務(wù)。
?
本文摘自 :https://blog.51cto.com/u