1.前言
隨著云計(jì)算規(guī)模越來越大,企業(yè)業(yè)務(wù)數(shù)據(jù)量呈指數(shù)級(jí)增長(zhǎng),傳統(tǒng)數(shù)據(jù)庫在海量數(shù)據(jù)存儲(chǔ)與管理方面顯得力不從心,面臨“存不下,算得慢、算不準(zhǔn)”的問題。
面對(duì)挑戰(zhàn),華為云數(shù)據(jù)庫深度融合華為在數(shù)據(jù)庫領(lǐng)域多年的經(jīng)驗(yàn),充分結(jié)合了企業(yè)級(jí)場(chǎng)景需求,基于openGauss自研生態(tài)推出了企業(yè)級(jí)分布式關(guān)系型數(shù)據(jù)庫GaussDB(for openGauss)。GaussDB(for openGauss)目前支持單分片和分布式兩種部署形態(tài),在支撐傳統(tǒng)業(yè)務(wù)的基礎(chǔ)上,持續(xù)構(gòu)建競(jìng)爭(zhēng)力特性,為企業(yè)面向數(shù)字化轉(zhuǎn)型提供了無限可能。
4月9日,由華為云主辦的GaussDB(for openGauss)系列技術(shù)直播第2期《華為云數(shù)據(jù)庫 GaussDB(for openGauss)數(shù)據(jù)存儲(chǔ)與訪問》于線上開啟,直播詳細(xì)介紹了GaussDB(for openGauss)的數(shù)據(jù)分布方式和數(shù)據(jù)讀寫流程,為方便大家快速了解GaussDB(for openGauss),本文結(jié)合第2場(chǎng)直播內(nèi)容從總體架構(gòu)、數(shù)據(jù)分布方式、計(jì)算下推、數(shù)據(jù)強(qiáng)一致等方面進(jìn)行介紹。
2.分布式架構(gòu)
GaussDB(for openGauss)是一個(gè)典型的基于數(shù)據(jù)分片的雙層分布式架構(gòu)(share nothing),數(shù)據(jù)通過一定的規(guī)則比如hash、list或者range等讓數(shù)據(jù)打散分布到不同的數(shù)據(jù)節(jié)點(diǎn)上,計(jì)算時(shí)底層多個(gè)數(shù)據(jù)節(jié)點(diǎn)共同參與,上層協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)執(zhí)行計(jì)劃生成和結(jié)果匯聚。
3.讓數(shù)據(jù)“存得下、算得快、算得準(zhǔn)”
隨著5G時(shí)代的到來,單一節(jié)點(diǎn)是難以應(yīng)對(duì)數(shù)據(jù)規(guī)模的不斷增長(zhǎng)并確保性能的需要,業(yè)務(wù)面臨“存不下、算得慢、算不準(zhǔn)”的問題。而GaussDB(for openGauss)可橫向擴(kuò)展的分布式架構(gòu)可以很好滿足大規(guī)模海量數(shù)據(jù)的計(jì)算存儲(chǔ)需求,讓數(shù)據(jù)“存得下、算得快、算得準(zhǔn)”。
3.1海量數(shù)據(jù)“存得下”
GaussDB(for openGauss) 支持1000+的數(shù)據(jù)節(jié)點(diǎn)擴(kuò)展能力,數(shù)據(jù)通過一定的規(guī)則比如hash、list或者range等讓數(shù)據(jù)打散分布到不同的數(shù)據(jù)節(jié)點(diǎn)上,讓數(shù)據(jù)“存得下”。
數(shù)據(jù)分布方式
GaussDB(for openGauss)支持hash、list、range、replication分布方式,下圖以hash和replication為例,示意了數(shù)據(jù)在DN節(jié)點(diǎn)上的分布情況。create table通過distribute by語法指定表的數(shù)據(jù)分布方式。hash分布把數(shù)據(jù)散列存儲(chǔ)到所有DN,適合數(shù)據(jù)量比較大的表;replication分布把數(shù)據(jù)復(fù)制存儲(chǔ)到所有DN,數(shù)據(jù)更新時(shí),會(huì)同時(shí)更新所有DN,采用2PC(兩階段提交)保證分布式事務(wù)的一致性,適合更新頻率比較低的小表。
一致性hash
GaussDB的hash分布采用類似一致性hash的方式,數(shù)據(jù)通過兩層映射,第一層通過hash映射把數(shù)據(jù)映射到N個(gè)hash bucket中,或者叫vnode中;第二層映射把vnode映射到物理的datanode上。擴(kuò)容時(shí),只需要調(diào)整二層映射,保證數(shù)據(jù)搬遷最?。簲?shù)據(jù)只會(huì)搬遷到新節(jié)點(diǎn),已有節(jié)點(diǎn)之間不會(huì)互相搬遷數(shù)據(jù);
分布鍵的選擇
對(duì)于數(shù)據(jù)分布來講,分布鍵的選擇至關(guān)重要,不合適的分布鍵會(huì)導(dǎo)致數(shù)據(jù)傾斜,導(dǎo)致木桶效應(yīng)。分布鍵的選擇一般遵循如下原則:
a. 盡量選擇distinct值比較多的列,保證數(shù)據(jù)均勻分布。分布均勻是為了避免木桶效應(yīng),各個(gè)節(jié)點(diǎn)對(duì)等執(zhí)行。
b. 盡量選擇Join列或group 列做分布列。盡量選擇Join列或group 列是為了避免數(shù)據(jù)節(jié)點(diǎn)之間數(shù)據(jù)流動(dòng), 提高性能。
數(shù)據(jù)傾斜
當(dāng)我們選擇了一個(gè)分布鍵之后,如何判斷數(shù)據(jù)是否分布均勻呢?GaussDB(for openGauss)提供了SQL語句可以方便地查詢是否發(fā)生了數(shù)據(jù)傾斜。
通過如下方法,可以查詢數(shù)據(jù)存儲(chǔ)在哪個(gè)DN,其中xc_node_id就是DN的內(nèi)部標(biāo)識(shí),取值于系統(tǒng)表pgxc_node的xc_node_id列。
通過如下SQL,就可以查看表在各個(gè)DN上的數(shù)據(jù)分布情況,一般來說,DN的數(shù)據(jù)量相差10%以上,則可能發(fā)生了數(shù)據(jù)傾斜,就要考慮按照前面的原則調(diào)整分布列。
SELECT a.count,b.node_name
FROM
(SELECT count(*) AS count,xc_node_id FROM tablename GROUP BY xc_node_id) a,
pgxc_node b
WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC;
3.2計(jì)算下推,“算得快”
GaussDB(for openGauss) 的優(yōu)化器和全并行分布式執(zhí)行能力,把計(jì)算下推到DN節(jié)點(diǎn),減少數(shù)據(jù)移動(dòng),讓數(shù)據(jù)“算得快”。
數(shù)據(jù)讀寫流程
大致執(zhí)行過程:
業(yè)務(wù)應(yīng)用下發(fā)SQL給Coordinator ,SQL可以包含對(duì)數(shù)據(jù)的CRUD操作;Coordinator利用數(shù)據(jù)庫的優(yōu)化器生成執(zhí)行計(jì)劃,每個(gè)DN會(huì)按照?qǐng)?zhí)行計(jì)劃的要求去處理數(shù)據(jù);數(shù)據(jù)基于一致性Hash算法分布在每個(gè)DN,因此DN在處理數(shù)據(jù)的過程中,可能需要從其他DN獲取數(shù)據(jù),GaussDB提供三種stream流(廣播流、聚合流和重分布流)實(shí)現(xiàn)數(shù)據(jù)在DN間的流動(dòng),使得join無需抽取到CN執(zhí)行;DN將結(jié)果集返回給Coordinate進(jìn)行匯總;Coordinator將匯總后的結(jié)果返回給業(yè)務(wù)應(yīng)用。
華為在SQL執(zhí)行優(yōu)化方面有多年的沉淀,即使是復(fù)雜的SQL、事務(wù)分析混合(HTAP)的場(chǎng)景也能得到最佳的執(zhí)行,我給大家舉一些列子:
基于代價(jià)的優(yōu)化基數(shù)估算:Feedback增強(qiáng)、AI基數(shù)增強(qiáng)代價(jià)估算:行存/列存代價(jià)估算、網(wǎng)絡(luò)通信代價(jià)估算搜索算法:動(dòng)態(tài)規(guī)劃方法、遺傳算法、AI搜索分布式執(zhí)行計(jì)劃能力Light ProxyFast Query ShippingRemote Query Shipping自研Cascade優(yōu)化器對(duì)象化處理規(guī)則應(yīng)用及搜索任務(wù)基于分支限界的剪枝技術(shù)
計(jì)算下推
優(yōu)化器是GaussDB(for openGauss)關(guān)鍵技術(shù)之一,可以把各種復(fù)雜的SQL進(jìn)行下推執(zhí)行,最小化數(shù)據(jù)移動(dòng),這是GaussDB相對(duì)于基于分庫分表的中間件方案的核心優(yōu)勢(shì)(對(duì)于復(fù)雜查詢,由于計(jì)算無法下推,中間件很容易成為性能瓶頸,需要業(yè)務(wù)做比較大的改造來規(guī)避)。
以下案例的表結(jié)構(gòu)為:
create table t1(a int, b int, c int) distribute by hash(a);
create table t2(a int, b int, c int) distribute by hash(a);
單表查詢下推
單表查詢,不管SQL的where條件是否帶有分片鍵,優(yōu)化器都可以生成下推的執(zhí)行計(jì)劃,包括sort/group by等復(fù)雜算子,都可以下推。
1)分片鍵上的where條件,直接下推到DN
2)非分片鍵where條件,DN先計(jì)算,CN做匯總,sort/group by可以直接下推到DN
Join查詢下推
1)分片鍵上的join條件,直接下推到DN執(zhí)行
2)非分片鍵join條件,DN直接做數(shù)據(jù)交換,避免CN成為性能瓶頸
1,Join下推到DN執(zhí)行,DN之間直接進(jìn)行數(shù)據(jù)重分布,交換數(shù)據(jù),無需CN參與;CBO優(yōu)化器選擇小表t2做重分布;
2,Sort下推到DN,CN只需做歸并排序,避免CN成為性能瓶頸;
3.3數(shù)據(jù)強(qiáng)一致,“算得準(zhǔn)”
數(shù)據(jù)強(qiáng)一致是GaussDB(for openGauss)相對(duì)于基于分庫分表的中間件方案的另一個(gè)核心優(yōu)勢(shì),基于中間件的方案由于不感知事務(wù)的快照邏輯,只能做到最終一致性,部分場(chǎng)景需要業(yè)務(wù)做比較大的改造來規(guī)避陷阱。GaussDB(for openGauss)提供數(shù)據(jù)強(qiáng)一致能力,讓數(shù)據(jù)“算得準(zhǔn)”。
分布式強(qiáng)一致:
1)兩階段提交保證寫的原子性。
2)兩階段提交對(duì)用戶透明,寫操作如果只涉及一個(gè)節(jié)點(diǎn),無需使用兩階段提交。
3)全局CSN保證讀的強(qiáng)一致。
高性能事務(wù)管理:
GTM線程池、原子的CSN分配,中心節(jié)點(diǎn)無性能瓶頸。
4.總結(jié)
綜上所述,GaussDB(for openGauss)基于可橫向擴(kuò)展的分布式架構(gòu),提供了海量存儲(chǔ)、快速響應(yīng)、數(shù)據(jù)強(qiáng)一致的能力,可以很好滿足大規(guī)模海量數(shù)據(jù)的計(jì)算存儲(chǔ)需求,讓數(shù)據(jù)“存得下、算得快、算得準(zhǔn)”。
值得一提的是,openGauss是開放的生態(tài):架構(gòu)開放、代碼開放、技術(shù)開放和社區(qū)開放,方便企業(yè)選擇開放的生態(tài),讓自己的業(yè)務(wù)具備更好的連續(xù)性。畢竟如果讓企業(yè)從一個(gè)封閉的生態(tài)走向?yàn)榱硗庖粋€(gè)封閉的生態(tài),本質(zhì)上并沒有解決業(yè)務(wù)連續(xù)性的問題,不開放的生態(tài)是沒有活力的,數(shù)據(jù)庫軟件尤甚,所以華為十分重視生態(tài)開放。