虛擬存儲(chǔ)涉及到的相關(guān)基礎(chǔ)知識(shí)總結(jié) 1
794
2025-03-31
在上一篇文章《首席科學(xué)家為您揭秘:我們介紹了GaussDB(for MySQL)的體系架構(gòu),這篇文章我們將重點(diǎn)介紹GaussDB(for MySQL)如何將查詢處理卸載到存儲(chǔ)層,我們將這一特性稱之為近數(shù)據(jù)處理(Near Data Processing),簡(jiǎn)稱NDP。
NDP出現(xiàn)的契機(jī)
在計(jì)算節(jié)點(diǎn)實(shí)例上執(zhí)行查詢操作首先需要將數(shù)據(jù)頁(yè)面加載到InnoDB緩沖池(buffer pool)。相對(duì)傳統(tǒng)數(shù)據(jù)庫(kù)使用本地存儲(chǔ),云數(shù)據(jù)庫(kù)需要通過(guò)網(wǎng)絡(luò)獲取數(shù)據(jù),因此從存儲(chǔ)節(jié)點(diǎn)讀取頁(yè)面數(shù)據(jù)的延遲要高得多。相比社區(qū)版MySQL,GaussDB(for MySQL)支持并行查詢,可通過(guò)多線程并行將數(shù)據(jù)讀取到緩沖池中,但當(dāng)表數(shù)據(jù)量較大(包含數(shù)百萬(wàn)甚至更多的數(shù)據(jù)行),分析查詢需要掃描大量數(shù)據(jù)時(shí),將所需數(shù)據(jù)全部加載到緩沖池中,IO成本將變得非常高。因此,我們需要一種更優(yōu)的方法來(lái)解決此問(wèn)題。
我們的解決方案是基于GaussDB(for MySQL) 計(jì)算節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)之間的緊密集成,將部分查詢處理操作下推至靠近數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng),數(shù)據(jù)庫(kù)術(shù)語(yǔ)中稱為算子下推。通過(guò)這種方式,我們可以利用多存儲(chǔ)節(jié)點(diǎn)的總帶寬。在云環(huán)境中,存儲(chǔ)系統(tǒng)包含數(shù)百節(jié)點(diǎn),我們希望充分利用存儲(chǔ)系統(tǒng)的可擴(kuò)展性,同時(shí)避免網(wǎng)絡(luò)成為性能瓶頸點(diǎn)。NDP允許部分查詢處理以大規(guī)模并行的方式在存儲(chǔ)節(jié)點(diǎn)執(zhí)行,并顯著的減少網(wǎng)絡(luò)IO。
NDP有諸多好處,包括:
利用多租戶大規(guī)模分布式云存儲(chǔ)系統(tǒng),在多節(jié)點(diǎn)并行處理數(shù)據(jù)
顯著減少網(wǎng)絡(luò)IO,只返回滿足WHERE條件的行(過(guò)濾)和查詢涉及的列(投影)或聚合操作的結(jié)果,而不是將完整的數(shù)據(jù)頁(yè)面從存儲(chǔ)節(jié)點(diǎn)返回至計(jì)算節(jié)點(diǎn)
避免大數(shù)量掃描導(dǎo)致經(jīng)常訪問(wèn)的數(shù)據(jù)頁(yè)面從緩存池中移除
那么存儲(chǔ)層是如何處理的呢?
算子下推通常適用于
全表掃描、索引掃描、范圍查詢
等場(chǎng)景。WHERE條件可下推至存儲(chǔ)層,當(dāng)前支持的數(shù)據(jù)類型包括:
數(shù)值類型(numeric, integer, float, double)
時(shí)間類型(date, time, timestamp)
字符串類型(char, varchar)等
算子下推可以與計(jì)算節(jié)點(diǎn)的并行查詢完美結(jié)合,從概念上講,一個(gè)查詢首先在計(jì)算層(垂直擴(kuò)展)拆分為多個(gè)worker線程并行處理,每個(gè)worker線程均可觸發(fā)算子下推。由于分布式存儲(chǔ)中數(shù)據(jù)分布的策略,每個(gè)worker線程的負(fù)載將分配至存儲(chǔ)系統(tǒng)的多個(gè)節(jié)點(diǎn)上(水平擴(kuò)展),每個(gè)存儲(chǔ)節(jié)點(diǎn)都有線程池處理算子下推請(qǐng)求。
查詢是否啟用算子下推,是在查詢優(yōu)化階段,優(yōu)化器根據(jù)統(tǒng)計(jì)信息和執(zhí)行計(jì)劃自動(dòng)決策的。此外用戶還可以使用 hint 來(lái)控制查詢操作是否開(kāi)啟算子下推。
算子下推可以很好地處理冷數(shù)據(jù),然而,GaussDB(for MyQL)是一個(gè)OLTP系統(tǒng),通常包含并發(fā)更新操作。當(dāng)前計(jì)算下推實(shí)現(xiàn),MVCC處理僅在計(jì)算節(jié)點(diǎn)進(jìn)行,存儲(chǔ)節(jié)點(diǎn)只處理可見(jiàn)的行,針對(duì)無(wú)法判斷可見(jiàn)性的行,原樣返回至計(jì)算節(jié)點(diǎn),通過(guò)undo-log回放出對(duì)應(yīng)的數(shù)據(jù)。
通過(guò)算子下推,我們將獲得怎樣的收益呢?
以TPC-H標(biāo)準(zhǔn)測(cè)試集(scale factor: 100)為例,CPU:16核,內(nèi)存: 128GB,計(jì)算節(jié)點(diǎn)數(shù)據(jù)庫(kù)緩沖池大小設(shè)置為80GB,采用冷數(shù)據(jù)進(jìn)行驗(yàn)證。
下圖展示了TPC-H Q6, Q12, Q14,? Q15? 4 個(gè)Query的查詢結(jié)果,均有20-40倍的性能提升。以Q12為例,只開(kāi)啟NDP,借助分布式存儲(chǔ)算力和網(wǎng)絡(luò)IO縮減,性能提升5倍,同時(shí)在計(jì)算節(jié)點(diǎn)開(kāi)啟并行查詢,又獲得7倍性能提升,總體提升約35倍,這個(gè)提升效果是非常顯著的。
本文中提到的這些功能都可在實(shí)際生產(chǎn)環(huán)境中使用,而這只是開(kāi)始,隨著我們將更多計(jì)算推送到存儲(chǔ)層,更多的查詢將從此優(yōu)化中受益,我們可以期待更大的性能提升。
如何啟用NDP?
開(kāi)啟NDP開(kāi)關(guān),對(duì)當(dāng)前Session生效,優(yōu)化器自動(dòng)判斷是否進(jìn)行計(jì)算下推。
mysql> show variables like 'ndp_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | ndp_mode | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> explain select count(*) from lineitem; +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ | 1 | SIMPLE | lineitem | NULL | index | NULL | PRIMARY | 8 | NULL | 594000899 | 100.00 | Using pushed NDP columns; Using pushed NDP aggregate; Using index | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)
通過(guò)hint方式,使NDP對(duì)當(dāng)前Query生效。
mysql> show variables like 'ndp_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | ndp_mode | OFF | +---------------+-------+ 1 row in set (0.00 sec) mysql> explain select count(*) from lineitem; +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------+ | 1 | SIMPLE | lineitem | NULL | index | NULL | PRIMARY | 8 | NULL | 594000899 | 100.00 | Using index | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) mysql> explain select/*+ ndp_pushdown() */ count(*) from lineitem; +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ | 1 | SIMPLE | lineitem | NULL | index | NULL | PRIMARY | 8 | NULL | 594000899 | 100.00 | Using pushed NDP columns; Using pushed NDP aggregate; Using index | +----+-------------+----------+------------+-------+---------------+---------+---------+------+-----------+----------+-------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)
挑戰(zhàn)與今后方向
NDP有諸多好處,但它也有一些技術(shù)挑戰(zhàn)需要我們解決。如分布式存儲(chǔ)系統(tǒng)為多租戶共享,為了避免不同租戶對(duì)資源爭(zhēng)搶使用,我們需要實(shí)現(xiàn)單租戶級(jí)的資源管控。另外是優(yōu)化器決策使用NDP的時(shí)機(jī),需結(jié)合觸發(fā)網(wǎng)絡(luò)IO讀取的數(shù)據(jù)量以及已緩存在緩沖池中的數(shù)據(jù)量綜合考慮。
GaussDB(for MySQL)是一款云原生數(shù)據(jù)庫(kù),該體系結(jié)構(gòu)支持極其強(qiáng)大和靈活的NDP框架。未來(lái),我們計(jì)劃利用此框架不僅僅是做查詢處理,還將進(jìn)一步擴(kuò)展存儲(chǔ)層中的數(shù)據(jù)庫(kù)功能,這些功能可以與查詢下推結(jié)合使用。我們相信,云堆棧的深度集成是釋放云數(shù)據(jù)庫(kù)力量的關(guān)鍵,華為云在實(shí)現(xiàn)這一目標(biāo)方面處于領(lǐng)先地位,正如GaussDB(for MySQL)所證明的那樣。
請(qǐng)大家保持關(guān)注,我們后續(xù)將會(huì)給大家?guī)?lái)更多精彩技術(shù)分享。也歡迎大家前往華為云官網(wǎng),了解更多GaussDB(for MySQL)詳情:https://www.huaweicloud.com/product/gaussdb_mysql.html
MySQL 云數(shù)據(jù)庫(kù) MySQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。