騰訊云數(shù)據(jù)庫(kù)TDSQL PG版(原TBase)分布式關(guān)系型數(shù)據(jù)庫(kù)是一款面向海量在線實(shí)時(shí)分布式事務(wù)交易高性能數(shù)據(jù)庫(kù)系統(tǒng)。面對(duì)應(yīng)用業(yè)務(wù)產(chǎn)生的不定性數(shù)據(jù)爆炸需求,無(wú)論是高并發(fā)的交易還是海量的實(shí)時(shí)數(shù)據(jù)分析,TDSQL PG版都有足夠能力處理。
在此基礎(chǔ)上構(gòu)造發(fā)行了具有功能更豐富、穩(wěn)定性更好、兼容性更廣、安全性更高、性能更強(qiáng)、擴(kuò)展性極好的分布式數(shù)據(jù)庫(kù)TDSQL PG版產(chǎn)品。本文由騰訊云數(shù)據(jù)庫(kù)高級(jí)工程師謝燦揚(yáng)先生帶來(lái)分享,主要介紹企業(yè)級(jí)產(chǎn)品TDSQL PG版在分布式全局事務(wù),數(shù)據(jù)安全,成本優(yōu)化,復(fù)雜查詢性能等方面做的工作,以下為分享實(shí)錄:
TDSQL PG版產(chǎn)品介紹
TDSQL PG版經(jīng)過(guò)十余年打磨大概可以分為以下幾個(gè)階段,第一個(gè)是單機(jī)時(shí)代引入PostgreSQL做為騰訊大數(shù)據(jù)平臺(tái)TDW的一個(gè)補(bǔ)充,彌補(bǔ)了小數(shù)據(jù)量分析能力不足。隨著業(yè)務(wù)發(fā)展,單機(jī)瓶頸逐步凸顯,促使團(tuán)隊(duì)推出了更具有擴(kuò)展性的SQL和兼容V1版本,并在2015年上線微信支付系統(tǒng)。
此外,TDSQL PG版提前布局ToB市場(chǎng),在V2版本支持三權(quán)分立,加密透明等安全特性,并在2018年拿下數(shù)字廣東和云南公安等多個(gè)標(biāo)桿客戶。TDSQL V3主要定位HTAP,在2019年上線PICC核心業(yè)務(wù),直到去年發(fā)布V5版本,主要是為了去O,內(nèi)核具備去O和讀寫(xiě)分離能力,同時(shí)上線的運(yùn)營(yíng)商用戶還有保險(xiǎn)系統(tǒng)。
TDSQL PG版是基于騰訊及PostgreSQL開(kāi)源的自主分布式HTAP國(guó)產(chǎn)數(shù)據(jù)庫(kù),其全面兼容PostgreSQL,高度兼容Oracle語(yǔ)法,產(chǎn)品采用無(wú)共享架構(gòu),在提供數(shù)據(jù)倉(cāng)庫(kù)處理的能力的同時(shí),還能支持完整的事物分布式ACID能力。
TDSQL PG版整體能力,從支持上來(lái)說(shuō)它的支持接口比較豐富,比如libpq里的C、C++,Jdbc/odbc、Python、Ecpg,各種常用語(yǔ)言接口都是支持的,同時(shí)它也支持用戶自定義函數(shù)操作服務(wù)。很多企業(yè)用戶關(guān)心的數(shù)據(jù)安全方面,TDSQL PG版用三權(quán)分立安全體系,支持?jǐn)?shù)據(jù)脫敏同時(shí)還有加密功能,并且支持多種國(guó)密算法。
同時(shí)作為HTAB數(shù)據(jù)庫(kù),TDSQL PG版支持千萬(wàn)級(jí)TPS事務(wù)處理,全并行分布式計(jì)算框架,可以讓業(yè)務(wù)高效完成OLAP計(jì)算。在數(shù)據(jù)治理方面,可以支持在線擴(kuò)縮容,用戶無(wú)感知數(shù)據(jù)Rebalance,使用透明的冷熱數(shù)據(jù)分離來(lái)減少用戶業(yè)務(wù)成本。此外,還支持多種窗口分析常函數(shù),并且高度兼容Oracle常見(jiàn)語(yǔ)法。
針對(duì)TDSQL PG版適用場(chǎng)景從兩方面看,一是業(yè)務(wù)特征,如果業(yè)務(wù)滿足這些特征,比如在數(shù)據(jù)量OLAP超過(guò)1個(gè)T,OLAP超過(guò)5個(gè)T或并發(fā)鏈接達(dá)到2000以上,業(yè)務(wù)峰值每秒100萬(wàn)筆左右,同時(shí)還必須要有一個(gè)分布式的水平擴(kuò)展能力,需要OLTP和OLAP(03:55英混合場(chǎng)景,并需要嚴(yán)格的事務(wù)保證,TDSQL PG版是很適合的。第二是業(yè)務(wù)場(chǎng)景,例如TDSQL在地理信息系統(tǒng),高并發(fā)實(shí)時(shí)計(jì)算方面或Oracle兼容都是一個(gè)非常好的選擇。
TDSQL PG版架構(gòu)
下面和大家分享TDSQL PG版整體架構(gòu)。GTM全局事務(wù)管理器,它是全局事務(wù)信息的管理節(jié)點(diǎn)并管理全局對(duì)象。Coordinator協(xié)調(diào)節(jié)點(diǎn)主要是業(yè)務(wù)訪問(wèn)入口,CN節(jié)點(diǎn)中每個(gè)節(jié)點(diǎn)都對(duì)等,訪問(wèn)三個(gè)節(jié)點(diǎn)中任意一個(gè)結(jié)果都是一樣。圖中下層是一個(gè)數(shù)據(jù)節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)是實(shí)際處理數(shù)據(jù)的一些地方,每個(gè)數(shù)據(jù)節(jié)點(diǎn)都會(huì)有一份本地的原數(shù)據(jù),并且還有一些本地?cái)?shù)據(jù)分片,中間數(shù)據(jù)交互總線也會(huì)把所有的節(jié)點(diǎn)有機(jī)聯(lián)合起來(lái),負(fù)責(zé)整個(gè)集群中所有的數(shù)據(jù)交互。最左邊我們的管控系統(tǒng),就負(fù)責(zé)我們節(jié)點(diǎn)的資源分配、高級(jí)安全審計(jì)、數(shù)據(jù)治理、擴(kuò)容等運(yùn)維能力。
下面對(duì)重點(diǎn)能力進(jìn)行介紹。今年支持了一個(gè)多引擎、支持集中式部署模式和分布式部署模式,其中集中式部署模式和單機(jī)PostgreSQL相同,沒(méi)有分布式開(kāi)銷,并且支持一組多備的部署模式和兩地三中心,都具有完備的Oracle兼容能力。在金融或運(yùn)營(yíng)商保險(xiǎn)這種場(chǎng)景中,可以達(dá)到98%兼容性。在業(yè)務(wù)需要擴(kuò)容時(shí)可以無(wú)縫擴(kuò)展成分布式集群。
從集中式擴(kuò)展到分布式,我們擁有完整的ACID能力,并且在分布式場(chǎng)景,也支持分部件更新全局索引,可以極大減少我們業(yè)務(wù),進(jìn)行一些分布式適配的改造量。并且在分布式場(chǎng)景中,TDSQL PG版也支持提供高性能OLAP能力,支持業(yè)務(wù)做分類型查詢工作。
TDSQL PG版同時(shí)支持集中式和分布式,集中式與分布式支持完整的ACID,其中分布式事務(wù),是基于GTS提供的MVCC并發(fā)控制邏輯,這里一個(gè)核心點(diǎn)是GTS時(shí)間戳,是由GTS集群進(jìn)行提供。
GTS集群是從零開(kāi)始單向遞增的邏輯時(shí)鐘,通過(guò)硬件提供足夠穩(wěn)定保障,并且是單向遞增,我們利用這個(gè)特性來(lái)進(jìn)行高性能分布式事務(wù)。而GTS對(duì)硬件沒(méi)有要求,可以通用服務(wù)器來(lái)做GTM節(jié)點(diǎn),同時(shí)GTS本身可以通過(guò)流復(fù)制來(lái)保證可靠性。在性能方面,24核服務(wù)器能夠處理1200萬(wàn)的QPS,幾乎可以滿足所有場(chǎng)景的需要。
TDSQL PG版性能
TDSQL PG版在全并行計(jì)算方面的并行能力分為三個(gè)層級(jí):
一是節(jié)點(diǎn)級(jí)并行,所謂節(jié)點(diǎn)級(jí)并行是系統(tǒng)拿到一個(gè)查詢后,會(huì)把查詢下發(fā)給不同的DN,并且通過(guò)DN之間的分片查詢節(jié)點(diǎn)級(jí)并行。
二是進(jìn)程中并行,在執(zhí)行器拿到算子以后,把它算子并行化,允許多個(gè)CPU同時(shí)用資源來(lái)完成查詢工作。
三是通過(guò)指令級(jí),比如可以通過(guò)特殊的CPU指令,SIMD指令,進(jìn)行算術(shù)運(yùn)算等,來(lái)提升計(jì)算效率。
今年新增另一特性全局索引,要知道如果在分布式設(shè)計(jì)中,表配置非分布鍵性能它比分布鍵性能差距是比較大的。舉個(gè)例子,比如說(shuō)分布鍵是其它鍵,那這里用一個(gè)非分布鍵,比如說(shuō)Mike這個(gè)名稱。
由于這個(gè)鍵它不是我們的分布鍵,數(shù)據(jù)庫(kù)其實(shí)不知道它在到底存儲(chǔ)到哪個(gè)節(jié)點(diǎn)。那這樣我們就需要在節(jié)點(diǎn)上,比如說(shuō)DN1、DN2、DN3都需要掃描。假設(shè)這條數(shù)據(jù)只有一條,多了很多無(wú)用掃描,特別是節(jié)點(diǎn)數(shù)越來(lái)越多時(shí)。當(dāng)然有了全局索引,相當(dāng)于有一個(gè)全局索引來(lái)存儲(chǔ)MAC這條記錄對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),那這樣就可以比較快的去找到這一個(gè)節(jié)點(diǎn)。并且隨著節(jié)點(diǎn)數(shù)的增多,性能也是穩(wěn)步提升。
這里需要一個(gè)全局事務(wù)來(lái)保證全局索引,保證數(shù)據(jù)表之間的一致性。可以看到右下角這個(gè)圖,藍(lán)色是非分布鍵的索引,黃色的是分布鍵,灰色的是全局索引??梢钥吹较鄬?duì)于非全局索引它的提升還是很大的。相對(duì)于我們的分布鍵查詢,它的性能是比較接近的。全局索引的高性能還可以用在外鍵或者全局唯一約束上,這樣可以極大減少業(yè)務(wù)的分布式改造成本。
這里有一個(gè)特性透明壓縮,支持?jǐn)?shù)據(jù)庫(kù)透明壓縮能力,這個(gè)是完全對(duì)業(yè)務(wù)透明。通過(guò)簡(jiǎn)單的Alter table,可以把一個(gè)表直接壓縮成它的1/3,或者它的1/4、1/5。然后從左邊的圖可以看到透明壓縮主要存儲(chǔ)層工作,頁(yè)面在落盤(pán)的時(shí)候,調(diào)用指定的一個(gè)壓縮算法,然后存儲(chǔ)在對(duì)應(yīng)文件系統(tǒng)里面來(lái)減少磁盤(pán)空間。
當(dāng)業(yè)務(wù)需要使用一個(gè)頁(yè)面讀取出去時(shí),我們會(huì)在內(nèi)存里進(jìn)行解壓,供業(yè)務(wù)來(lái)使用。下面是TPCC模型測(cè)試結(jié)果??梢钥吹揭粋€(gè)磁盤(pán)壓縮率大概是降低了70%左右,CPU大概是增加20%,因?yàn)橐~外CPU去做壓縮,性能TPCC查詢性能是降28%。
另外TDSQL PG版支持全面的循環(huán)校驗(yàn)。這是對(duì)磁盤(pán)損壞的保障方案。我們都知道磁盤(pán)壞塊概率相對(duì)較低,但隨著業(yè)務(wù)量增長(zhǎng),集群數(shù)、服務(wù)器數(shù)增多,它會(huì)成為一個(gè)必然事件。TDSQL PG版支持全流程校驗(yàn),例如定期全量校驗(yàn),主動(dòng)實(shí)施故障探測(cè),故障阻斷,在故障發(fā)現(xiàn)之后,會(huì)自動(dòng)發(fā)起增量修復(fù)去完成副本的修復(fù)。在這樣一個(gè)手段中,可以保證壞塊不會(huì)擴(kuò)散到冷備還有備機(jī),相當(dāng)于病毒,不能讓它擴(kuò)散到所有副本上。
在表上我們的一個(gè)數(shù)據(jù)中,維護(hù)了一個(gè)塊級(jí)別的CRC信息,從介質(zhì)里面讀取的時(shí)我們可以校驗(yàn)來(lái)做數(shù)據(jù)保護(hù)。最后來(lái)說(shuō)當(dāng)故障發(fā)生時(shí),做數(shù)據(jù)儲(chǔ)備轉(zhuǎn)換時(shí),可以保證在數(shù)據(jù)正確情況下,第一時(shí)間恢復(fù)業(yè)務(wù),再異步修復(fù)流程。通過(guò)備份或者說(shuō)冷備中,來(lái)拿取受損頁(yè)面推進(jìn)修復(fù)。在線修復(fù)可以通過(guò)可用的副本來(lái)進(jìn)行,沒(méi)有可用副本才會(huì)從冷備中拉取。
另外一點(diǎn)Direct IO因?yàn)镻age Buffer問(wèn)題,導(dǎo)致內(nèi)存的利用率并不高,并且在某些情況下容易引起性能波動(dòng)。TDSQL PG版支持Direct IO,經(jīng)過(guò)測(cè)試可以提高內(nèi)存的使用率。并且在TPCC測(cè)試,它的波動(dòng)是更加平穩(wěn)的,也就是說(shuō)它能夠提高業(yè)務(wù)穩(wěn)定性。在新版本中,我們支持多種定位視圖,一是全局事物視圖,支持全局鏈接管理。第二是我們內(nèi)存占用視圖,可以對(duì)當(dāng)前內(nèi)存使用量進(jìn)行一些統(tǒng)計(jì)。
用戶案例
接下來(lái)是我們的經(jīng)典用戶案例。TDSQL PG版是在2015年,替換微信支付的分庫(kù)分表系統(tǒng)上線,支撐微信支付從500萬(wàn)筆到1000萬(wàn)再到10億筆,保證業(yè)務(wù)穩(wěn)定性還有連續(xù)性,這里用到了數(shù)據(jù)治理功能。圖上右上角是我們的CLB騰訊的內(nèi)部的一個(gè)負(fù)載均衡的組件。
CLB是我們接入的節(jié)點(diǎn),在DN上漲,我們是存儲(chǔ)四個(gè)月數(shù)據(jù),四個(gè)月內(nèi)數(shù)據(jù)是存在一個(gè)高性能的SSD里面,四個(gè)月前的數(shù)據(jù)會(huì)存到比較普通設(shè)備,比如大存儲(chǔ)硬盤(pán)。它使用了大小商戶策略,可以解決不同體量用戶傾斜問(wèn)題,從而高效保證系統(tǒng)運(yùn)行。通過(guò)這種方式,把整個(gè)業(yè)務(wù)成本降低到1/4左右。
在外部有比較大的一個(gè)保險(xiǎn)公司,上線了非常多的實(shí)例。這里只展現(xiàn)了我們的一個(gè)部署架構(gòu)。首先分為兩個(gè)平面,一個(gè)是讀寫(xiě)平面,一個(gè)只讀平面,讀寫(xiě)平面業(yè)務(wù)可以通過(guò)VIP來(lái)提供讀寫(xiě)能力,我們的只讀平面,VIP在多個(gè)節(jié)點(diǎn)中做負(fù)載均衡,提供一個(gè)業(yè)務(wù)只讀的能力。
TDSQL PG版在數(shù)據(jù)生成后,需要把數(shù)據(jù)同步到其它的系統(tǒng)上,例如Elasticsearch、MySQL、INFORMIX或者Oracle在TDSQL PG版中可以在通訊的同時(shí)把它解成一個(gè)Json形式,同步到Kafka同步工具,最后通過(guò)Kafka通到其它業(yè)務(wù)系統(tǒng)。
最后一個(gè)案例是去年上線的的七人普系統(tǒng),這個(gè)項(xiàng)目是國(guó)家核心重點(diǎn)項(xiàng)目,涉及700萬(wàn)的普查員以及1億人自主申報(bào),并且在15天內(nèi)完成數(shù)據(jù)量采集。在項(xiàng)目中PostgreSQL承擔(dān)了非常重要的分析業(yè)務(wù),同時(shí)具備了實(shí)時(shí)寫(xiě)入還有海量數(shù)據(jù)同時(shí)分析能力。目前PG已經(jīng)成為新應(yīng)用的首選?,F(xiàn)在屬于數(shù)據(jù)庫(kù)黃金時(shí)代,所以我們會(huì)一起共同努力,謝謝大家!