在“國(guó)產(chǎn)數(shù)據(jù)庫(kù)硬核技術(shù)沙龍-TDSQL-A技術(shù)揭秘”系列分享中,5位騰訊云技術(shù)大咖分別從整體技術(shù)架構(gòu)、列式存儲(chǔ)及相關(guān)執(zhí)行優(yōu)化、集群數(shù)據(jù)交互總線、分布式執(zhí)行框架以及向量化執(zhí)行引擎等多方面對(duì)TDSQL-A進(jìn)行了深入解讀。
在本系列分享的最后一期,我們整理了關(guān)于TDSQL-A大家最關(guān)心的十個(gè)問題,騰訊云技術(shù)大咖們將對(duì)這些問題一一解答。
TDSQL-A是騰訊首款分布式分析型數(shù)據(jù)庫(kù)引擎,采用全并行無共享架構(gòu),具有自研列式存儲(chǔ)引擎,支持行列混合存儲(chǔ),適應(yīng)于海量OLAP關(guān)聯(lián)分析查詢場(chǎng)景。它能夠支持2000臺(tái)物理服務(wù)器以上的集群規(guī)模,存儲(chǔ)容量能達(dá)到單數(shù)據(jù)庫(kù)實(shí)例百P級(jí)。
Q1:TDSQL-A目前有哪些用戶在使用?
TDSQL-A是伴隨騰訊自身業(yè)務(wù)發(fā)展過程中衍生出來的產(chǎn)品,在騰訊內(nèi)部有非常廣泛的應(yīng)用,像騰訊廣告、QQ音樂核心業(yè)務(wù)都在使用TDSQL-A。
Q2:TDSQL-A的主要優(yōu)勢(shì)是什么?
TDSQL-A的主要優(yōu)勢(shì)在于,它是一個(gè)分布式的超大規(guī)模數(shù)據(jù)倉(cāng)庫(kù)集群,其應(yīng)用場(chǎng)景主要面向超大規(guī)模數(shù)據(jù)集合的高速計(jì)算,在達(dá)到數(shù)千臺(tái)服務(wù)器單個(gè)數(shù)據(jù)庫(kù)集群超大規(guī)模的同時(shí),還能做到高效的查詢的執(zhí)行。
Q3:TDSQL-A在支持國(guó)產(chǎn)化硬件和操作系統(tǒng)方面做了哪些工作?
近年來,隨著國(guó)家芯創(chuàng)事業(yè)的推進(jìn),以及自主研發(fā)的硬件和軟件的大規(guī)模應(yīng)用,TDSQL-A也一直在做相關(guān)的適配工作。在國(guó)產(chǎn)化硬件方面,像鯤鵬、海光等主流國(guó)產(chǎn)化芯片,我們都做了很好的支持。在國(guó)產(chǎn)操作系統(tǒng)方面,我們也通過了一系列主流廠家的認(rèn)證。
Q4:TDSQL-A是否支持強(qiáng)同步復(fù)制?
在PostgreSQL流程中,事務(wù)在提交前會(huì)記錄WAL日志。對(duì)于行存表和列存表,我們都有對(duì)應(yīng)的WAL日志去支持主備間的流式復(fù)制,用戶還可以選擇具體的復(fù)制級(jí)別或者是復(fù)制的同步配置。用戶可以根據(jù)不同場(chǎng)景去選擇是否需要高級(jí)別或者偏低級(jí)別的主備同步級(jí)別。另外,TDSQL-A也支持Hot Standby,即備平面可讀。這些都可以通過TDSQL-A的管控平臺(tái)來進(jìn)行便捷的配置。
Q5:TDSQL-A如何進(jìn)行高效的分布式Join?
這主要涉及到優(yōu)化器、執(zhí)行器、向量化等多個(gè)方面。我們以優(yōu)化器為例。如果是帶有CTE或者子查詢比較多的復(fù)雜查詢,TDSQL-A優(yōu)化器會(huì)首先進(jìn)行查詢重寫(rewrite),把CTE進(jìn)行inline操作,隨后盡量把子查詢提升成Join來進(jìn)行優(yōu)化。這樣做可以降低查詢的執(zhí)行復(fù)雜度,如果是特定查詢甚至可能達(dá)到成百上千倍的提升。
Rewrite之后,優(yōu)化器還會(huì)自動(dòng)對(duì)Join的順序進(jìn)行調(diào)整,相當(dāng)于進(jìn)行一個(gè)全面的遍歷,然后去選擇一個(gè)最優(yōu)執(zhí)行代價(jià)的計(jì)劃。在分布式場(chǎng)景下,我們做了很多優(yōu)化。比如Join關(guān)聯(lián)的列是否是數(shù)據(jù)分布列,是否需要進(jìn)行重分布,是否添加延遲物化算子,TDSQL-A會(huì)智能地根據(jù)cost來進(jìn)行調(diào)整。
另外,在物理算子選擇時(shí),根據(jù)不同的場(chǎng)景、選擇率、代價(jià)評(píng)估,TDSQL-A會(huì)選擇不同的關(guān)聯(lián)算法,比如Nestloop join、HashJoin、MergeJoin。同時(shí)TDSQL-A還支持全流程的并行執(zhí)行和向量化執(zhí)行,以此來保證整體的高效的分布式Join計(jì)算能力。
Q6:TDSQL-A目前支持哪些算子?其算子級(jí)別的并行能力又在哪些方面得到增強(qiáng)?
我們基于PG 10對(duì)TDSQL-A做了很多自研和功能增強(qiáng)。因?yàn)镻G 10本身在并行能力上存在欠缺,比如像Hash Join支持外表的并行,但像Build Hash Table就不支持并行。為了彌補(bǔ)欠缺,我們基于PG 10開發(fā)了完成的Hash Join的并行來同時(shí)支持Inner/Outer Plan的并行。
另外就是聚合算子。因?yàn)楹芏喾植际綀?chǎng)景需要進(jìn)行兩階段的聚合計(jì)算。這種兩階段聚合可能會(huì)在中間進(jìn)行數(shù)據(jù)重分布,對(duì)于這種情況我們也需要支持完整的并行能力。TDSQL-A會(huì)根據(jù)聚合的列去做一個(gè)hash的計(jì)算,來選擇在哪個(gè)work上計(jì)算,同時(shí)在不同的執(zhí)行分片之間進(jìn)行綁定,保證不同的分片執(zhí)行時(shí),它的不同并行進(jìn)程之間可以收到正確的數(shù)據(jù)然后做并行計(jì)算。TDSQL-A還支持一些其它的算子,后面我們會(huì)不斷去更新。
Q7:TDSQL-A是否可以直接訪問包括Oracle在內(nèi)的外部數(shù)據(jù)源?
Oracle以及Hive/Spark等大數(shù)據(jù)項(xiàng)目對(duì)接是比較廣泛的應(yīng)用場(chǎng)景。針對(duì)Oracle兼容和國(guó)產(chǎn)數(shù)據(jù)庫(kù)替換,我們做了很多兼容性能力增強(qiáng)方面的工作。另外用戶可以直接在TDSQL-A中用dblink來直接訪問Oracle外部數(shù)據(jù)源,去做數(shù)據(jù)變更或者做查詢。像Hive或者其他的第三方數(shù)據(jù)源,PG有Foreign Data Wrapper這樣的接口。用戶可以使用我們支持的插件或者適配豐富的第三方插件來訪問異構(gòu)外部數(shù)據(jù)源。
如果需要把數(shù)據(jù)拉到TDSQL-A來,我們可以用TDSQL-A配套的數(shù)據(jù)導(dǎo)入工具TDX去進(jìn)行數(shù)據(jù)導(dǎo)入。實(shí)際上我們會(huì)有比較豐富的協(xié)議,可以通過不同的外部數(shù)據(jù)源,把數(shù)據(jù)流導(dǎo)到TDX上面。數(shù)據(jù)庫(kù)會(huì)并行地從TDX往DN節(jié)點(diǎn)進(jìn)行數(shù)據(jù)抽取,這樣可以訪問外部數(shù)據(jù)源,也可以享受數(shù)據(jù)加載的便捷服務(wù)。
Q8:TDSQL-A能否快速把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)系統(tǒng)里?是否能與其他系統(tǒng)進(jìn)行數(shù)據(jù)交互?
TDSQL-A支持在PG數(shù)據(jù)源上進(jìn)行copy,可以將數(shù)據(jù)copy in、copy from,同時(shí)還支持外表定義,我們可以去創(chuàng)建外部表,直接把外部的數(shù)據(jù)文件在數(shù)據(jù)庫(kù)里進(jìn)行定義,從而進(jìn)行一些操作。同時(shí),我們還支持DB bridge——云上的數(shù)據(jù)同步工具,它可以實(shí)時(shí)同步其他系統(tǒng)的數(shù)據(jù)進(jìn)來,然后再通過Kafka同步出去。此外,我們還開發(fā)了一個(gè)專門的數(shù)據(jù)導(dǎo)入導(dǎo)出工具TDX,它可以借助多DN并行高效地進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出。
Q9:TDSQL-A目前最多能支持多少個(gè)節(jié)點(diǎn)的部署?
在TDSQL-A中,部署節(jié)點(diǎn)數(shù)量是一個(gè)配置參數(shù),在一開始初裝時(shí)就可以進(jìn)行配置,默認(rèn)值為2048,具體可以根據(jù)用戶需要進(jìn)行調(diào)整。
Q10:大規(guī)模部署時(shí),F(xiàn)N如何保證通信更高效?
我們先來假設(shè)在沒有FN的情況下,由于系統(tǒng)集群規(guī)模比較大,集群內(nèi)又在不停地創(chuàng)建連接,這樣就會(huì)導(dǎo)致整個(gè)系統(tǒng)網(wǎng)絡(luò)的socket數(shù)量成為瓶頸。這也是我們引入FN數(shù)據(jù)交互總線的初衷,用來有效減少連接數(shù)量。通過FN節(jié)點(diǎn),具體計(jì)算進(jìn)程不需要直接進(jìn)行全鏈接,而是通過FN節(jié)點(diǎn)進(jìn)行數(shù)據(jù)路由,極大的減少了socket連接數(shù)。
FN如何保證高效性,這個(gè)問題可以從兩方面來回答。一方面,在同一個(gè)服務(wù)器內(nèi)部,F(xiàn)N通過共享內(nèi)存直接獲取數(shù)據(jù),實(shí)際上省了網(wǎng)絡(luò)這一層,因此它的通信是比較高效的。另一方面,在不同服務(wù)器之間,F(xiàn)N主要負(fù)責(zé)數(shù)據(jù)的發(fā)送,其內(nèi)部是一個(gè)多線程的模型,可以存在很多個(gè)發(fā)送線程。FN內(nèi)部還有一個(gè)Merge線程,它的作用是在一個(gè)數(shù)據(jù)發(fā)送之前,會(huì)檢查哪個(gè)發(fā)送線程的隊(duì)列比較空閑,然后把這個(gè)數(shù)據(jù)調(diào)度到這個(gè)空閑的發(fā)送線程中,從而達(dá)到復(fù)雜均能的效果。