openGauss學(xué)習(xí)筆記-54 openGauss 高級特性-MOT

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

  1. 授予用戶權(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ū)分大小寫。
  1. 創(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;
  1. 為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í)行以下步驟:

    1. 暫停應(yīng)用程序活動(dòng)。

    2. 使用gs_dump工具將表數(shù)據(jù)轉(zhuǎn)儲到磁盤的物理文件中。請確保使用data only。

    3. 重命名原始基于磁盤的表。

    4. 創(chuàng)建同名同模式的MOT。請確保使用創(chuàng)建FOREIGN關(guān)鍵字指定該表為MOT。

    5. 使用gs_restore將磁盤文件的數(shù)據(jù)加載/恢復(fù)到數(shù)據(jù)庫表中。

    6. 瀏覽或手動(dòng)驗(yàn)證所有原始數(shù)據(jù)是否正確導(dǎo)入到新的MOT中。下面將舉例說明。

    7. 恢復(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,操作步驟如下:

    1. 檢查源表列類型。驗(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)富!

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容