openGauss學(xué)習(xí)筆記-54 openGauss 高級特性-MOT54.1 MOT特性及價(jià)值54.2 MOT關(guān)鍵技術(shù)54.3 MOT應(yīng)用場景54.4 不支持的數(shù)據(jù)類型54.5 使用MOT54.6 將磁盤表轉(zhuǎn)換為MOT
openGauss學(xué)習(xí)筆記-54 openGauss 高級特性-MOT
openGauss引入了MOT(Memory-Optimized Table,MOT)存儲引擎,它是一種事務(wù)性行存儲,針對多核和大內(nèi)存服務(wù)器進(jìn)行了優(yōu)化。MOT是openGauss數(shù)據(jù)庫最先進(jìn)的生產(chǎn)級特性(Beta版本),它為事務(wù)性工作負(fù)載提供更高的性能。MOT完全支持ACID特性,并包括嚴(yán)格的持久性和高可用性支持。企業(yè)可以在關(guān)鍵任務(wù)、性能敏感的在線事務(wù)處理(OLTP)中使用MOT,以實(shí)現(xiàn)高性能、高吞吐、可預(yù)測低延遲以及多核服務(wù)器的高利用率。MOT尤其適合在多路和多核處理器的現(xiàn)代服務(wù)器上運(yùn)行,例如基于Arm/鯤鵬處理器的華為TaiShan服務(wù)器,以及基于x86的戴爾或類似服務(wù)器。
54.1 MOT特性及價(jià)值
MOT在高性能(查詢和事務(wù)延遲)、高可擴(kuò)展性(吞吐量和并發(fā)量)甚至在某些情況下成本(高資源利用率)這些方面擁有顯著優(yōu)勢。
低延遲(Low Latency):提供快速的查詢和事務(wù)響應(yīng)時(shí)間。
高吞吐量(High Throughput):支持峰值和持續(xù)高用戶并發(fā)。
高資源利用率(High Resource Utilization):充分利用硬件。
使用了MOT的應(yīng)用程序可以達(dá)到2.5到4倍的吞吐量。例如,在基于Arm/鯤鵬的華為TaiShan服務(wù)器和基于英特爾至強(qiáng)的戴爾x86服務(wù)器上,執(zhí)行TPC-C基準(zhǔn)測試(交互事務(wù)和同步日志)。MOT提供的吞吐率增益在2路服務(wù)器上達(dá)到2.5倍,4路服務(wù)器上達(dá)到3.7倍,在4路256核Arm服務(wù)器上達(dá)到480萬tpmC。
在TPC-C基準(zhǔn)測試中可觀察到,MOT提供更低的延遲將事務(wù)速度降低3至5.5倍。
此外,高負(fù)載和高爭用的情況是所有領(lǐng)先的行業(yè)數(shù)據(jù)庫都會遇到的公認(rèn)問題,而MOT能夠在這種情況下極高地利用服務(wù)器資源。使用MOT后,4路服務(wù)器的資源利用率達(dá)到99%,遠(yuǎn)遠(yuǎn)領(lǐng)先其他行業(yè)數(shù)據(jù)庫。
這種能力在現(xiàn)代的多核服務(wù)器上尤為明顯和重要。
54.2 MOT關(guān)鍵技術(shù)
MOT的關(guān)鍵技術(shù)如下:
內(nèi)存優(yōu)化數(shù)據(jù)結(jié)構(gòu):以實(shí)現(xiàn)高并發(fā)吞吐量和可預(yù)測的低延遲為目標(biāo),所有數(shù)據(jù)和索引都在內(nèi)存中,不使用中間頁緩沖區(qū),并使用持續(xù)時(shí)間最短的鎖。數(shù)據(jù)結(jié)構(gòu)和所有算法都是專門為內(nèi)存設(shè)計(jì)而優(yōu)化的。
免鎖事務(wù)管理:MOT在保證嚴(yán)格一致性和數(shù)據(jù)完整性的前提下,采用樂觀的策略實(shí)現(xiàn)高并發(fā)和高吞吐。在事務(wù)過程中,MOT不會對正在更新的數(shù)據(jù)行的任何版本加鎖,從而大大降低了一些大內(nèi)存系統(tǒng)中的爭用。事務(wù)中的樂觀并發(fā)控制(Optimistic Concurrency Control,OCC)語句是在沒有鎖的情況下實(shí)現(xiàn)的,所有的數(shù)據(jù)修改都是在內(nèi)存中專門用于私有事務(wù)的部分(也稱為私有事務(wù)內(nèi)存)中進(jìn)行的。這就意味著在事務(wù)過程中,相關(guān)數(shù)據(jù)在私有事務(wù)內(nèi)存中更新,從而實(shí)現(xiàn)了無鎖讀寫;而且只有在提交階段才會短時(shí)間加鎖。
免鎖索引:由于內(nèi)存表的數(shù)據(jù)和索引完全存儲在內(nèi)存中,因此擁有一個(gè)高效的索引數(shù)據(jù)結(jié)構(gòu)和算法非常重要。MOT索引機(jī)制基于最先進(jìn)的Masstree,這是一種用于多核系統(tǒng)的快速和可擴(kuò)展的鍵值(Key Value,KV)存儲索引,以B+樹的Trie實(shí)現(xiàn)。通過這種方式,高并發(fā)工作負(fù)載在多核服務(wù)器上可以獲得卓越的性能。同時(shí)MOT應(yīng)用了各種先進(jìn)的技術(shù)以優(yōu)化性能,如優(yōu)化鎖方法、高速緩存感知和內(nèi)存預(yù)取。
NUMA-aware的內(nèi)存管理:MOT內(nèi)存訪問的設(shè)計(jì)支持非統(tǒng)一內(nèi)存訪問(NUMA)感知。NUMA-aware算法增強(qiáng)了內(nèi)存中數(shù)據(jù)布局的性能,使線程訪問物理上連接到線程運(yùn)行的核心的內(nèi)存。這是由內(nèi)存控制器處理的,不需要通過使用互連(如英特爾QPI)進(jìn)行額外的跳轉(zhuǎn)。MOT的智能內(nèi)存控制模塊,為各種內(nèi)存對象預(yù)先分配了內(nèi)存池,提高了性能,減少了鎖,保證了穩(wěn)定性。事務(wù)的內(nèi)存對象的分配始終是NUMA本地的。本地處理的對象會返回到池中。同時(shí)在事務(wù)中盡量減少系統(tǒng)內(nèi)存分配(OS malloc)的使用,避免不必要的鎖。
-
高效持久性:日志和檢查點(diǎn)是實(shí)現(xiàn)磁盤持久化的關(guān)鍵能力,也是ACID的關(guān)鍵要求之一(D代表持久性)。目前所有的磁盤(包括SSD和NVMe)都明顯慢于內(nèi)存,因此持久化是基于內(nèi)存數(shù)據(jù)庫引擎的瓶頸。作為一個(gè)基于內(nèi)存的存儲引擎,MOT的持久化設(shè)計(jì)必須實(shí)現(xiàn)各種各樣的算法優(yōu)化,以確保持久化的同時(shí)還能達(dá)到設(shè)計(jì)時(shí)的速度和吞吐量目標(biāo)。這些優(yōu)化包括:
并行日志,所有openGauss磁盤表都支持。
每個(gè)事務(wù)的日志緩沖和無鎖事務(wù)準(zhǔn)備。
增量更新記錄,即只記錄變化。
除了同步和異步之外,創(chuàng)新的NUMA感知組提交日志記錄。
最先進(jìn)的數(shù)據(jù)庫檢查點(diǎn)(CALC,Checkpointing Asynchronously using Logical Consistency)使內(nèi)存和計(jì)算開銷降到最低。
高SQL覆蓋率和功能集:MOT通過擴(kuò)展的PostgreSQL外部數(shù)據(jù)封裝(FDW)以及索引,幾乎支持完整的SQL范圍,包括存儲過程、用戶定義函數(shù)和系統(tǒng)函數(shù)調(diào)用。
使用PREPARE語句的查詢原生編譯:通過使用PREPARE客戶端命令,可以以交互方式執(zhí)行查詢和事務(wù)語句。這些命令已被預(yù)編譯成原生執(zhí)行格式,也稱為Code-Gen或即時(shí)(Just-in-Time,JIT)編譯。這樣可以實(shí)現(xiàn)平均30%的性能提升。在可能的情況下,應(yīng)用編譯和輕量級執(zhí)行;否則,使用標(biāo)準(zhǔn)執(zhí)行路徑處理適用的查詢。Cache Plan模塊已針對OLTP進(jìn)行了優(yōu)化,在整個(gè)會話中甚至使用不同的綁定設(shè)置以及在不同的會話中重用編譯結(jié)果。
MOT和openGauss數(shù)據(jù)庫的無縫集成:MOT是一個(gè)高性能的面向內(nèi)存優(yōu)化的存儲引擎,已集成在openGauss包中。MOT的主內(nèi)存引擎和基于磁盤的存儲引擎并存,以支持多種應(yīng)用場景,同時(shí)在內(nèi)部重用數(shù)據(jù)庫輔助服務(wù),如WAL重做日志、復(fù)制、檢查點(diǎn)和恢復(fù)高可用性等。用戶可以從基于磁盤的表和MOT的統(tǒng)一部署、配置和訪問中受益。根據(jù)特定需求,靈活且低成本地選擇使用哪種存儲引擎。例如,把會導(dǎo)致瓶頸的高度性能敏感數(shù)據(jù)放入內(nèi)存中。
54.3 MOT應(yīng)用場景
MOT可以根據(jù)負(fù)載的特點(diǎn),顯著加快應(yīng)用程序的整體性能。MOT通過提高數(shù)據(jù)訪問和事務(wù)執(zhí)行的效率,并通過消除并發(fā)執(zhí)行事務(wù)之間的鎖和鎖存爭用,最大程度地減少重定向,從而提高了事務(wù)處理的性能。
MOT的極速不僅因?yàn)樗趦?nèi)存中,還因?yàn)樗鼑@并發(fā)內(nèi)存使用管理進(jìn)行了優(yōu)化。數(shù)據(jù)存儲、訪問和處理算法從頭開始設(shè)計(jì),以利用內(nèi)存和高并發(fā)計(jì)算的最新先進(jìn)技術(shù)。
openGauss允許應(yīng)用程序隨意組合MOT和基于標(biāo)準(zhǔn)磁盤的表。對于啟用已證明是瓶頸的最活躍、高爭用和對性能敏感的應(yīng)用程序表,以及需要可預(yù)測的低延遲訪問和高吞吐量的表來說,MOT特別有用。
MOT可用于各種應(yīng)用,例如:
高吞吐事務(wù)處理:這是使用MOT的主要場景,因?yàn)樗С趾A渴聞?wù),同時(shí)要求單個(gè)事務(wù)的延遲較低。這類應(yīng)用的例子有實(shí)時(shí)決策系統(tǒng)、支付系統(tǒng)、金融工具交易、體育博彩、移動(dòng)游戲、廣告投放等。
性能瓶頸加速:存在高爭用現(xiàn)象的表可以通過使用MOT受益,即使該表是磁盤表。由于延遲更低、競爭和鎖更少以及服務(wù)器吞吐量能力增加,此類表(除了相關(guān)表和在查詢和事務(wù)中一起引用的表之外)的轉(zhuǎn)換使得性能顯著提升。
消除中間層緩存:云計(jì)算和移動(dòng)應(yīng)用往往會有周期性或峰值的高工作負(fù)載。此外,許多應(yīng)用都有80%以上負(fù)載是讀負(fù)載,并伴有頻繁的重復(fù)查詢。為了滿足峰值負(fù)載單獨(dú)要求,以及降低響應(yīng)延遲提供最佳的用戶體驗(yàn),應(yīng)用程序通常會部署中間緩存層。這樣的附加層增加了開發(fā)的復(fù)雜性和時(shí)間,也增加了運(yùn)營成本。 MOT提供了一個(gè)很好的替代方案,通過一致的高性能數(shù)據(jù)存儲來簡化應(yīng)用架構(gòu),縮短開發(fā)周期,降低CAPEX和OPEX成本。
大規(guī)模流數(shù)據(jù)提?。篗OT可以滿足云端(針對移動(dòng)、M2M和物聯(lián)網(wǎng))、事務(wù)處理(Transactional Processing,TP)、分析處理(Analytical Processing,AP)和機(jī)器學(xué)習(xí)(Machine Learning,ML)的大規(guī)模流數(shù)據(jù)的提取要求。MOT尤其擅長持續(xù)快速地同時(shí)提取來自許多不同來源的大量數(shù)據(jù)。這些數(shù)據(jù)可以在以后進(jìn)行處理、轉(zhuǎn)換,并在速度較慢的基于磁盤的表中進(jìn)行移動(dòng)。另外,MOT還可以查詢到一致的、最新的數(shù)據(jù),從而得出實(shí)時(shí)結(jié)果。在有許多實(shí)時(shí)數(shù)據(jù)流的物聯(lián)網(wǎng)和云計(jì)算應(yīng)用中,通常會有專門的數(shù)據(jù)攝取和處理。例如,一個(gè)Apache Kafka集群可以用來提取10萬個(gè)事件/秒的數(shù)據(jù),延遲為10ms。一個(gè)周期性的批處理任務(wù)會將收集到的數(shù)據(jù)收集起來,并將轉(zhuǎn)換格式,放入關(guān)系型數(shù)據(jù)庫中進(jìn)行進(jìn)一步分析。MOT可以通過將數(shù)據(jù)流直接存儲在MOT關(guān)系表中,為分析和決策做好準(zhǔn)備,從而支持這樣的場景(同時(shí)消除單獨(dú)的數(shù)據(jù)處理層)。這樣可以更快地收集和處理數(shù)據(jù),MOT避免了代價(jià)高昂的分層和緩慢的批處理,提高了一致性,增加了分析數(shù)據(jù)的實(shí)時(shí)性,同時(shí)降低了總擁有成本(Total Cost of Ownership,TCO)。
降低TCO:提高資源利用率和消除中間層可以節(jié)省30%到90%的TCO。
54.4 不支持的數(shù)據(jù)類型
UUID
User-Defined Type (UDF)
Array data type
NVARCHAR2(n)
Clob
Name
Blob
Raw
Path
Circle
Reltime
Bit varying(10)
Tsvector
Tsquery
JSON
Box
Text
Line
Point
LSEG
POLYGON
INET
CIDR
MACADDR
Smalldatetime
BYTEA
Bit
Varbit
OID
Money
無限制的varchar/character varying
HSTORE
54.5 使用MOT
-
授予用戶權(quán)限
以授予數(shù)據(jù)庫用戶對MOT存儲引擎的訪問權(quán)限為例。每個(gè)數(shù)據(jù)庫用戶僅執(zhí)行一次,通常在初始配置階段完成。
[圖片上傳失敗...(image-9c8055-1693316405044)]
說明: MOT通過外部數(shù)據(jù)封裝器(Foreign Data Wrapper,F(xiàn)DW)機(jī)制與openGauss數(shù)據(jù)庫集成,所以需要授權(quán)用戶權(quán)限。
要使特定用戶能夠創(chuàng)建和訪問MOT(DDL、DML、SELECT),以下語句只執(zhí)行一次:
GRANT USAGE ON FOREIGN SERVER mot_server TO <user>;
所有關(guān)鍵字不區(qū)分大小寫。
-
創(chuàng)建/刪除MOT
只有MOT中的創(chuàng)建和刪除表語句與openGauss中基于磁盤的表的語句不同。SELECT、DML和DDL的所有其他命令的語法對于MOT表和openGauss基于磁盤的表是一樣的。
- 創(chuàng)建MOT:
create FOREIGN table test(x int) [server mot_server];
* 以上語句中:
* 始終使用FOREIGN關(guān)鍵字引用MOT。
* 在創(chuàng)建MOT表時(shí),[server mot_server]部分是可選的,因?yàn)镸OT是一個(gè)集成的引擎,而不是一個(gè)獨(dú)立的服務(wù)器。
* 上文以創(chuàng)建一個(gè)名為test的內(nèi)存表(表中有一個(gè)名為x的整數(shù)列)為例。在下一節(jié)(創(chuàng)建索引)中將提供一個(gè)更現(xiàn)實(shí)的例子。
* 如果postgresql.conf中開啟了增量檢查點(diǎn),則無法創(chuàng)建MOT。因此請?jiān)趧?chuàng)建MOT前將enable_incremental_checkpoint設(shè)置為off。
* 刪除名為test的MOT:
drop FOREIGN table test;
-
為MOT創(chuàng)建索引
支持標(biāo)準(zhǔn)的openGauss創(chuàng)建和刪除索引語句。
例如:
create index text_index1 on test(x) ;
創(chuàng)建一個(gè)用于TPC-C的ORDER表,并創(chuàng)建索引:
create FOREIGN table bmsql_oorder (
o_w_id integer not null,
o_d_id integer not null,
o_id integer not null,
o_c_id integer not null,
o_carrier_id integer,
o_ol_cnt integer,
o_all_local integer,
o_entry_d timestamp,
primary key (o_w_id, o_d_id, o_id)
);
create index bmsql_oorder_index1 on bmsql_oorder(o_w_id, o_d_id, o_c_id, o_id) ;
> [圖片上傳失敗...(image-4fa31c-1693316405044)]
>
> **說明:** 在MOT名字之前不需要指定FOREIGN關(guān)鍵字,因?yàn)樗鼉H用于創(chuàng)建和刪除表的命令。
54.6 將磁盤表轉(zhuǎn)換為MOT
磁盤表直接轉(zhuǎn)換為MOT尚不能實(shí)現(xiàn),這意味著尚不存在將基于磁盤的表轉(zhuǎn)換為MOT的ALTER TABLE語句。
下面介紹如何手動(dòng)將基于磁盤的表轉(zhuǎn)換為MOT,如何使用gs_dump工具導(dǎo)出數(shù)據(jù),以及如何使用gs_restore工具導(dǎo)入數(shù)據(jù)。
-
前置條件檢查
檢查待轉(zhuǎn)換為MOT的磁盤表是否包含所有需要的列。
檢查表中是否包含任何不支持的列數(shù)據(jù)類型,具體參見“不支持的數(shù)據(jù)類型”。
如果不支持特定列數(shù)據(jù)類型,則建議首先創(chuàng)建一個(gè)更新了列數(shù)據(jù)類型的磁盤表。此表內(nèi)容與原始表相同,只是所有不支持的數(shù)據(jù)類型都已轉(zhuǎn)換為支持的數(shù)據(jù)類型。
使用以下腳本導(dǎo)出該備磁盤表,然后導(dǎo)入到MOT中。
-
轉(zhuǎn)換
要將基于磁盤的表轉(zhuǎn)換為MOT,請執(zhí)行以下步驟:
暫停應(yīng)用程序活動(dòng)。
使用gs_dump工具將表數(shù)據(jù)轉(zhuǎn)儲到磁盤的物理文件中。請確保使用data only。
重命名原始基于磁盤的表。
創(chuàng)建同名同模式的MOT。請確保使用創(chuàng)建FOREIGN關(guān)鍵字指定該表為MOT。
使用gs_restore將磁盤文件的數(shù)據(jù)加載/恢復(fù)到數(shù)據(jù)庫表中。
瀏覽或手動(dòng)驗(yàn)證所有原始數(shù)據(jù)是否正確導(dǎo)入到新的MOT中。下面將舉例說明。
恢復(fù)應(yīng)用程序活動(dòng)。
[圖片上傳失敗...(image-77312e-1693316405043)]
須知: 由于表名稱保持不變,應(yīng)用程序查詢和相關(guān)數(shù)據(jù)庫存儲過程將能夠無縫訪問新的MOT,而無需更改代碼。請注意,MOT目前不支持跨引擎多表查詢(如使用Join、Union和子查詢)和跨引擎多表事務(wù)。因此,如果在多表查詢、存儲過程或事務(wù)中訪問原始表,則必須將所有相關(guān)的磁盤表轉(zhuǎn)換為MOT,或者更改應(yīng)用程序或數(shù)據(jù)庫中的相關(guān)代碼。
-
轉(zhuǎn)換示例
假設(shè)要將數(shù)據(jù)庫benchmarksql中一個(gè)基于磁盤的表customer遷移到MOT中。
將customer表遷移到MOT,操作步驟如下:
- 檢查源表列類型。驗(yàn)證MOT支持所有類型,詳情請參閱“不支持的數(shù)據(jù)類型”章節(jié)。
benchmarksql-# \d+ customer
Table "public.customer"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
x | integer | | plain | |
y | integer | | plain | |
Has OIDs: no
Options: orientation=row, compression=no
2. 請檢查源表數(shù)據(jù)。
benchmarksql=# select * from customer;
x | y
---+---
1 | 2
3 | 4
(2 rows)
3. 只能使用gs_dump轉(zhuǎn)儲表數(shù)據(jù)。
$ gs_dump -Fc benchmarksql -a --table customer -f customer.dump -p 16000
gs_dump[port='15500'][benchmarksql][2020-06-04 16:45:38]: dump database benchmarksql successfully
gs_dump[port='15500'][benchmarksql][2020-06-04 16:45:38]: total time: 332 ms
4. 重命名源表。
benchmarksql=# alter table customer rename to customer_bk;
ALTER TABLE
5. 創(chuàng)建與源表完全相同的MOT。
benchmarksql=# create foreign table customer (x int, y int);
CREATE FOREIGN TABLE
benchmarksql=# select * from customer;
x | y
---+---
(0 rows)
6. 將源轉(zhuǎn)儲數(shù)據(jù)導(dǎo)入到新MOT中。
$ gs_restore -C -d benchmarksql customer.dump -p 16000
restore operation successful
total time: 24 ms
Check that the data was imported successfully.
benchmarksql=# select * from customer;
x | y
---+---
1 | 2
3 | 4
(2 rows)
benchmarksql=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------+-------------+---------------+--------+----------------------------------
public | customer | foreign table | aharon |
public | customer_bk | table | aharon | {orientation=row,compression=no}
(2 rows)
?? 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!
?? 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進(jìn)步的財(cái)富!
