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