6月5日,“國產(chǎn)數(shù)據(jù)庫硬核技術(shù)沙龍-TDSQL-A技術(shù)揭秘”如約而至。5位騰訊云技術(shù)大咖分別從整體技術(shù)架構(gòu)、列式存儲及相關(guān)執(zhí)行優(yōu)化、集群數(shù)據(jù)交互總線、Fragment執(zhí)行框架/查詢分片策略/子查詢框架以及向量化執(zhí)行引擎等多個方面對TDSQL-A進(jìn)行了深入解讀。以下帶來騰訊云數(shù)據(jù)庫技術(shù)總監(jiān)李躍森老師的在線分享。
TDSQL-A產(chǎn)品定位
TDSQL-A是騰訊基于PostgreSQL自主研發(fā)的分布式超大規(guī)模在線關(guān)系型數(shù)據(jù)倉庫,業(yè)務(wù)場景針對于在線高性能數(shù)據(jù)分析。
TDSQL-A有四個主要特點:
無共享MPP能實現(xiàn)無共享的存儲,還可以實現(xiàn)線性的擴(kuò)展;
在存儲層面,通過自研列存儲技術(shù),能夠做到行列混合存儲;
在數(shù)據(jù)庫規(guī)模方面,實現(xiàn)了超大規(guī)模集群的支持;
為了讓客戶有更好的體驗,TDSQL-A還有超高速的計算能力,能夠快速處理業(yè)務(wù)以及請求。
TDSQL-A發(fā)展歷程
TDSQL-A是在騰訊業(yè)務(wù)發(fā)展過程中孵化出來的產(chǎn)品。最早的時候我們是用單機(jī)PG來做一些大數(shù)據(jù)平臺小規(guī)模的數(shù)據(jù)分析以及結(jié)果緩存。但隨著騰訊業(yè)務(wù)的擴(kuò)張,我們發(fā)現(xiàn)單機(jī)的數(shù)據(jù)庫已經(jīng)無法支撐相關(guān)業(yè)務(wù)的數(shù)據(jù)量及請求量,就萌生了開發(fā)分布式數(shù)據(jù)庫的想法。在2013年我們啟動了第一個版本的開發(fā)。
開發(fā)完成后的TDSQL-PG(原TBase V2),最早用來支撐內(nèi)部商戶系統(tǒng)。隨著業(yè)務(wù)的發(fā)展,我們在V2的基礎(chǔ)上增加了列存儲和分布式異步執(zhí)行器、向量化等OLAP高級能力,在融入了騰訊云的幾個主要平臺后,逐漸對外提供服務(wù)。TDSQL-A最近一次閃亮亮相,是為去年第七次全國人口普查提供技術(shù)支撐。作為在線數(shù)據(jù)分析引擎,TDSQL-A很好地支撐了國家人口普查的執(zhí)行,起到了加好的效果。
TDSQL-A技術(shù)架構(gòu)
在對TDSQL-A產(chǎn)品進(jìn)行研發(fā)和架構(gòu)設(shè)計的時候,我們主要面臨四個方面的挑戰(zhàn):
一是隨著5G和loT時代的到來,數(shù)據(jù)呈現(xiàn)爆炸式的增長。單個數(shù)據(jù)庫集群里面需要處理的數(shù)據(jù)的容量很容易就達(dá)到10PB級別的大小。這對傳統(tǒng)的數(shù)據(jù)倉庫及數(shù)據(jù)庫來說,是一個非常有挑戰(zhàn)的數(shù)據(jù)規(guī)模。
二是隨著數(shù)據(jù)量的增大,我們需要處理的數(shù)據(jù)庫業(yè)務(wù)以及各種類型的終端越來越多,對數(shù)據(jù)庫的并發(fā)要求比之前更高了。我們最多的時候甚至需要處理數(shù)千個OLAP的并發(fā)。
三是隨著業(yè)務(wù)系統(tǒng)的發(fā)展,查詢會變得異常復(fù)雜,需要涉及到近十張大表的數(shù)據(jù)關(guān)聯(lián),這對數(shù)據(jù)存儲和數(shù)據(jù)倉庫查詢優(yōu)化都提出了很高的要求。
四是客戶和業(yè)務(wù)對于延時的要求??蛻粝M覀冊絹碓娇斓匕呀Y(jié)果處理完成,這樣才能更好地去實現(xiàn)自己的商業(yè)價值和業(yè)務(wù)目標(biāo)。
TDSQL-A產(chǎn)品的架構(gòu)設(shè)計就是圍繞這四個問題的解決展開的。
1.TDSQL-A實時數(shù)據(jù)倉庫如何解決支持超大規(guī)模集群
對實時數(shù)據(jù)倉庫來說,第一個要解決的問題就是如何去支持超大規(guī)模的集群。傳統(tǒng)認(rèn)知認(rèn)為,分布式數(shù)據(jù)庫集群的處理能力會隨結(jié)點增多而變強(qiáng)。但實際上卻并非如此。
下圖就是我們進(jìn)行分布式查詢的時候需要建立的網(wǎng)絡(luò)連接,或者說我們需要進(jìn)行網(wǎng)絡(luò)通信的管道。從圖中我們可以看到,在兩表進(jìn)行JOIN查詢時,我們少則需要兩個網(wǎng)絡(luò)連接,多則需要八個網(wǎng)絡(luò)連接。隨著SQL復(fù)雜度的提升和并發(fā)的增加,系統(tǒng)需要建立的網(wǎng)絡(luò)數(shù)量則會越來越多,數(shù)據(jù)倉庫的處理能力不一定會提升。
由此我們可以得出一個結(jié)論,即限制分布式數(shù)據(jù)庫擴(kuò)展性的核心問題之一,就是服務(wù)器連接數(shù)過高。那TDSQL-A是如何解決這個問題的呢?
全新設(shè)計的異步執(zhí)行器解耦控制和數(shù)據(jù)交互
首先在執(zhí)行邏輯方面,我們設(shè)計了全新的執(zhí)行器,來解耦SQL執(zhí)行的的控制邏輯和執(zhí)行邏輯。
在查詢優(yōu)化階段我們通過分析物理查詢計劃,對執(zhí)行計劃進(jìn)行分片,由CN在各個節(jié)點創(chuàng)建執(zhí)行進(jìn)程。每個進(jìn)程負(fù)責(zé)執(zhí)行一個計劃分片,這些進(jìn)程不關(guān)注網(wǎng)絡(luò)通信,相互獨立執(zhí)行。
假設(shè)N個節(jié)點,M層join,則會產(chǎn)生M*N個進(jìn)程。
這種設(shè)計一方面分離了SQL執(zhí)行的控制邏輯和執(zhí)行邏輯;另外一方面,也將網(wǎng)絡(luò)連接從具體執(zhí)行邏輯抽象了出來,變成了一組接口,SQL執(zhí)行引擎只需要關(guān)注自己的執(zhí)行邏輯,對于底層的通訊邏輯則不用專門去編寫代碼。而且,這些進(jìn)程之間相互獨立,沒有相互的依賴關(guān)系,沒有鎖和進(jìn)程同步,執(zhí)行效率大大提升。
集中數(shù)據(jù)交互總線解決集群網(wǎng)絡(luò)瓶頸
在通訊邏輯方面,我們進(jìn)一步引入Forward Node(FN)來進(jìn)行節(jié)點間數(shù)據(jù)交互。每臺物理機(jī)一個FN節(jié)點。FN與CN/DN通過共享內(nèi)存進(jìn)行數(shù)據(jù)交互,本機(jī)數(shù)據(jù)交互還可以不走網(wǎng)絡(luò)層,從而提供更高的性能。假設(shè)N個節(jié)點,M層Join,且不管查詢多復(fù)雜,只有S*(N-1)個網(wǎng)絡(luò)連接數(shù)。這對于服務(wù)器來說是并不算是一個很高的負(fù)載。
我們來小結(jié)一下TDSQL-A是如何實現(xiàn)超大規(guī)模數(shù)據(jù)集群支持的。
我們對整個數(shù)據(jù)庫的執(zhí)行邏輯進(jìn)行了分流,把數(shù)據(jù)庫分為了控制流和數(shù)據(jù)流。所謂的控制流由控制節(jié)點,CN節(jié)點完成,它去完成執(zhí)行機(jī)構(gòu)的生成,執(zhí)行機(jī)構(gòu)的下發(fā)以及運(yùn)用資源的初始化。在執(zhí)行的過程中控制平面就不會再參與執(zhí)行的過程,執(zhí)行過程完全由執(zhí)行平臺來完成,執(zhí)行平臺主要負(fù)責(zé)執(zhí)行過程中數(shù)據(jù)的交互以及整個執(zhí)行過程的達(dá)成。
在執(zhí)行過程中,數(shù)據(jù)流由轉(zhuǎn)發(fā)平面完成,即FN節(jié)點。每個服務(wù)器上面就會部署一個FN進(jìn)程,不同的物理服務(wù)器之間的FN進(jìn)程相互連接在一起會組成一個轉(zhuǎn)發(fā)平面。FN跟每臺服務(wù)器之間通過下面的共享內(nèi)存和上面的CN或DN進(jìn)行通信,F(xiàn)N內(nèi)部完成數(shù)據(jù)的交換和路由轉(zhuǎn)發(fā)。
2.TDSQL-A自研行列混合存儲能力提升OLAP效率
下面介紹TDSQL-A全自研的行列混合的存儲能力。數(shù)據(jù)庫的存儲有兩種方式,一個是按行存儲、一個是按列存儲:
按行存儲表:每行數(shù)據(jù)存儲所有列、一次磁盤IO可以訪問一行中所有列、適合OLTP場景。
按列存儲表:每列單獨存儲,多個列邏輯組成一行;一次磁盤IO只包含一列數(shù)據(jù);方便做數(shù)據(jù)壓縮;適合OLAP場景。
TDSQL-A支持按列存儲和按行存儲兩種方式來建表,同時在列表和行表之間,用戶不用感知到下層的表是通過行表還是列表來建,行表和列表之間可以進(jìn)行無縫的互操作——包括相互關(guān)聯(lián)、相互交換數(shù)據(jù),完全不需要感知到底下的存儲邏輯。
除了操作的便利性之外,行表和列表之間混合查詢還能保持完整的事務(wù)一致性,也就是說在查詢運(yùn)行的同時,整個事務(wù)(ACID)的能力也得到完整的保證。
3.TDSQL-A列存儲壓縮能力降低業(yè)務(wù)成本
作為OLAP場景下的產(chǎn)品來說,壓縮是一項非常重要的能力,這里介紹TDSQL-A的列存儲壓縮能力。
目前我們支持兩種壓縮方式:
一是輕量級壓縮。這是能夠感知到數(shù)據(jù)內(nèi)容的一種壓縮方式。它可以針對用戶數(shù)據(jù)的特點提供合適的壓縮方式來降低用戶的成本,在有規(guī)律時達(dá)到數(shù)百倍的壓縮比。我們可以針對特殊的數(shù)據(jù),比如重復(fù)率比較高的或者是有規(guī)律、有順序的數(shù)據(jù)進(jìn)行輕量級壓縮。
二是透明壓縮。透明壓縮主要是用zstd和gzip壓縮算法來提供壓縮能力,可以幫用戶進(jìn)一步去壓縮成本,提升處理效率。
4.延遲物化原理
在分布式場景下,特別是超大規(guī)模分布式場景下,網(wǎng)絡(luò)IO和CPU其實是非常重要的資源。如果在計算時,網(wǎng)絡(luò)IO達(dá)到了瓶頸,或者CPU達(dá)到了瓶頸,都會從整體上影響集群的擴(kuò)展性和集群的處理能力。
目前用數(shù)據(jù)庫或數(shù)據(jù)倉庫進(jìn)行查詢時,很多使用的都是提前物化。所謂的提前物化是相對于查詢來說的。其在數(shù)據(jù)庫里面會分解成幾步:第一步需要從下面最底層的表里面把數(shù)據(jù)查詢出來,再進(jìn)行關(guān)聯(lián),join完成之后再進(jìn)行投影,傳給上層要使用的一些列。
可以看到,在進(jìn)行join時我們其實只關(guān)聯(lián)了表b的f2這一列,但是投影時卻投影了表b的f1這一列。這時對之前的數(shù)據(jù)庫進(jìn)行提前物化時,在傳遞數(shù)據(jù)給join時,我們就會把表b的f1和f2都吐出來。因為我們計算發(fā)現(xiàn)上層project需要f1這一列,但是join這里需要f2這一列,所以它就會把上層需要的所有列全部在這里算出來。但實際上如果在這個地方關(guān)聯(lián)時過濾的比例很高的話,比如說現(xiàn)在有1%的滿足率,其實大部分的f1是沒有意義的,因為最終在這里通過join會被拋棄掉。在超大規(guī)模的分布式場景下,如果表里面有20億條記錄,選擇率是0.01的話,這個時候就會有7.4GB的無效數(shù)據(jù)傳輸。對于十分依賴網(wǎng)絡(luò)傳播的分布式數(shù)據(jù)庫來說,7.4個GB已經(jīng)是非??捎^的開銷了。
因此我們引入了另外一種物化算法,即延遲物化。延遲物化可以簡單理解為不見兔子不撒鷹。所謂的不見兔子不撒鷹,就是在投影的時候只拉去滿足條件的那些數(shù)據(jù),減少中間這7.4個GB的傳輸。這就要我們在進(jìn)行Scan時,只看上層join節(jié)點需要的一些列,把它傳遞到上層節(jié)點去,join完成之后把滿足條件的那些列的位置信息傳遞給上層的project節(jié)點。根據(jù)我們的測試,隨著表變得越來越復(fù)雜,隨著查詢變得越來越復(fù)雜,表變得越來越大,我們優(yōu)化的效果也越來越明顯。
5.TDSQL-A全并行能力、向量化計算能力
除了上面的延遲物化外,我們還引入了系統(tǒng)的全并行能力。全并行能力對數(shù)據(jù)庫的OLAP場景數(shù)據(jù)庫來講是一個必經(jīng)之路。MPP架構(gòu)讓我們具備了多節(jié)點并行的架構(gòu)優(yōu)勢,同時我們還通過優(yōu)化做到了節(jié)點內(nèi)部的多進(jìn)程進(jìn)程間的進(jìn)行,并在內(nèi)部使用了CPU的特殊指令做到指令級并行,因此TDSQL-A可以做到三級并行,依次是:節(jié)點級并行,進(jìn)程級并行以及指令級并行。這種全并行的能力能夠進(jìn)一步提升我們整體的處理效率。
向量化計算能力在OLAP上也是一個必須探討的課題。TDSQL-A也進(jìn)行了一些新的嘗試,并實現(xiàn)了向量化計算能力:數(shù)據(jù)量越大,列存非向量化和列存向量化效果越明顯,在最好的情況下,列存向量化運(yùn)行時間是列村非向量化的1/2,列存向量化運(yùn)行時間是行村的1/8。列存儲的向量化執(zhí)行能夠達(dá)到行存儲執(zhí)行1/8左右。向量化計算能力對整個OLAP性能的提升是非常明顯的。
6.TDSQL-A的多平面能力提供一致的讀擴(kuò)展性
在整體架構(gòu)上,TDSQL-A也提供了比較好的一致性的讀擴(kuò)展能力。
一致性的讀擴(kuò)展能力是跟隨業(yè)務(wù)場景的催生的技術(shù)特性。有一些客戶反映過這種的情況,就是在數(shù)據(jù)庫CPU,內(nèi)存已經(jīng)用滿的情況下,還有更多的業(yè)務(wù)請求要加進(jìn)來。為了滿足這種讀的擴(kuò)展性需要,我們就研發(fā)出了能夠提供讀取能力的多平面特性,簡單理解就是在讀寫平面的基礎(chǔ)上,通過內(nèi)部復(fù)制的方式來創(chuàng)建出一個只讀平面,去處理只讀的請求。相比之前新建數(shù)據(jù)庫集群的方式,這種做法在降低了業(yè)務(wù)成本和系統(tǒng)復(fù)雜度的同時,也幫助客戶解決了很多現(xiàn)實的問題。
7.TDSQL-A整體技術(shù)架構(gòu)小結(jié)
TDSQL-A整體的技術(shù)架構(gòu)可以總結(jié)成六點:
通過集中式的網(wǎng)絡(luò)架構(gòu)、網(wǎng)絡(luò)融合通信技術(shù)以及后面在執(zhí)行級層面引入的能力,可以進(jìn)一步去拓展分布式MPP數(shù)據(jù)倉庫的存儲規(guī)模的上限,達(dá)到數(shù)千臺的規(guī)模;
通過向量化技術(shù),底層整個執(zhí)行級的邏輯優(yōu)化,做到極速OLAP的響應(yīng);
在存儲層面通過多種高效的數(shù)據(jù)壓縮方式,提供極高的壓縮比,幫助業(yè)務(wù)去節(jié)省經(jīng)營成本;
在接口層面完整兼容了SQL2003,同時對ORALE語法兼容性達(dá)到95%,包括存儲過程、觸發(fā)器等一系列內(nèi)容;
支持行列混合存儲及行列混合操作的能力;
借助特有能力去訪問外部數(shù)據(jù)源,包括分布式對象存儲,HDFS存儲等,能夠?qū)崿F(xiàn)存儲與計算分離。
TDSQL-A后續(xù)規(guī)劃
TDSQL-A的后續(xù)規(guī)劃分為兩部分:
一方面是陸續(xù)將目前基于PG10的版本,merge到PG11、PG12、PG13等更高版本,持續(xù)地跟進(jìn)社區(qū)版本豐富的特性,來提升用戶的體驗,為客戶創(chuàng)造更多價值。
另一方面,隨著硬件技術(shù)的不斷發(fā)展,包括GPU、FGA以及APE這些新硬件的發(fā)展,給我們創(chuàng)造了為客戶創(chuàng)造更高價值可能性,TDSQL-A也希望通過引入新硬件,來提升產(chǎn)品競爭力,為客戶提供更好的服務(wù)。