全部產品
Search
文件中心

ApsaraDB RDS:X-Engine性價比優勢

更新時間:Jun 19, 2024

X-Engine的效能與InnoDB相似,但是儲存成本遠低於InnoDB,因此擁有極高的性價比。

背景資訊

RDS MySQL提供阿里雲自研儲存引擎X-Engine,相比InnoDB,X-Engine在磁碟空間佔用和資料庫整體成本上有比較明顯的優勢,X-Engine使用了層次化的儲存結構,並結合ZSTD壓縮演算法實現了更高的資料壓縮率。下文將詳細對比X-Engine、InnoDB、TokuDB的儲存開銷和效能。

說明 X-Engine的主要技術創新已經發表在國際資料庫領域學術會議ACM SIGMOD 2019、VLDB2020和儲存領域學術會議USENIX FAST 2020。

測試環境

用於測試的RDS執行個體規格為rds.mysql.s3.large(4核CPU、8 GB記憶體),儲存空間為2 TB。

X-Engine儲存成本約為InnoDB一半

空間佔用對比

上圖為分別使用InnoDB和X-Engine儲存引擎時的磁碟空間使用方式。

兩種儲存引擎均使用預設配置,使用SysBench的預設表結構,每張表包含1千萬條記錄,表總數從32張逐漸增長到736張。實測資料顯示,隨著資料量的逐漸增長,X-Engine的空間佔用的增長更慢,節省的空間越多,最多時僅為InnoDB的58%。對於單條記錄長度更長的情境,X-Engine有更大的儲存空間優勢。例如淘寶圖片空間庫從InnoDB遷移到X-Engine後,儲存空間僅為InnoDB的14%。

由於絕大部分的InnoDB業務情境中未使用資料壓縮,如果開啟壓縮,InnoDB的儲存空間會壓縮為之前的67%左右,且查詢效能會大幅下降,嚴重影響業務,以主鍵更新為例,其吞吐效能僅為壓縮前的10%。相比開啟壓縮後效能過低的InnoDB,X-Engine是一個兼顧儲存成本和效能的高性價比儲存引擎。

Sysbench測試命令:

#InnoDB prepare資料庫
sysbench /usr/share/sysbench/oltp_update_index.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --mysql-db=sbtest\
    --threads=32\
    --tables=[32-736]\
    --table_size=10000000\
    --mysql-storage_engine=INNODB\
    prepare

#X-Engine prepare資料庫
sysbench /usr/share/sysbench/oltp_update_index.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --mysql-db=sbtest\
    --threads=32\
    --tables=[32-736]\
    --table_size=10000000\
    --mysql-storage_engine=XENGINE\
    prepare

X-Engine儲存開銷比TokuDB更低

TokuDB曾經也是提供低儲存開銷的資料庫引擎,但其開發人員Percona已經停止TokuDB的維護,而且X-Engine與TokuDB相比擁有更低的儲存開銷,所以阿里雲建議將TokuDB引擎的資料庫遷移至X-Engine引擎。

TokuDB採用分形樹(Fractal Tree),較InnoDB使用的B+tree而言擁有更多充滿資料的葉子節點及相應的資料區塊,能夠實現比InnoDB更高的壓縮率。但TokuDB沒有X-Engine的階層式存放區設計,而X-Engine同樣擁有充滿記錄的資料區塊這一優勢,結合其它空間最佳化,X-Engine實現了比TokuDB更低的儲存開銷。

磁碟空間比

上圖為分別使用TokuDB和X-Engine儲存引擎時的磁碟空間使用方式。

執行個體中建立32張表,每張表1億條記錄,最終TokuDB和X-Engine分別佔用411 GB和400 GB磁碟空間,由此可見X-Engine可以替代TokuDB,滿足您的低成本儲存需求。

Sysbench測試命令:

#TokuDB prepare資料庫
sysbench /usr/share/sysbench/oltp_update_index.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --mysql-db=sbtest\
    --threads=32\
    --tables=[32-736]\
    --table_size=1000000000\
    --mysql-storage_engine=TokuDB\
    prepare

#X-Engine prepare資料庫
sysbench /usr/share/sysbench/oltp_update_index.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --mysql-db=sbtest\
    --threads=32\
    --tables=[32-736]\
    --table_size=1000000000\
    --mysql-storage_engine=XENGINE\
    prepare

X-Engine階層式存放區和分層訪問提高QPS

X-Engine可以保證在不影響熱資料查詢效能的情況下,降低冷資料佔用的空間,以實現降低總儲存成本。主要原因如下:

  • 採用層次化的儲存結構,將熱資料與冷資料分別存放在不同的層次中,並預設對冷資料所在層次進行壓縮。
  • 對每一條記錄都使用了首碼編碼等減少儲存開銷的技術。
  • 採用分層訪問,結合真實業務情境中廣泛存在的局部性和資料訪問傾斜現象(熱資料量往往遠小於冷資料量),提高QPS。
點查詢效能

上圖為X-Engine處理有傾斜特徵的資料訪問時點查詢的效能情況。

這項測試使用了業界常用的齊夫分布來控制資料訪問的傾斜程度,當傾斜程度(Zipf factor)較高時,更多的點查詢會命中緩衝中的熱資料,而不是磁碟中的冷資料,所以訪問延遲更低,整體QPS效能更高,此時壓縮冷資料對QPS的影響很小。

簡而言之,X-Engine階層式存放區、分層訪問的方式使得業務中絕大部分訪問熱資料的SQL可以不受冷資料的影響,QPS比均勻訪問所有資料高2.7倍。

Sysbench測試命令:

sysbench /usr/share/sysbench/oltp_point_select.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --time=3600\
    --mysql-db=sbtest\
    --tables=32\
    --threads=512\
    --table_size=10000000\
    --rand-type=zipfian\
    --rand-zipfian-exp=[0-1]\
    --report-interval=1\
    run

X-Engine查詢存量資料效能與InnoDB基本持平

如果將大量存量資料(尤其是歸檔和歷史類資料)存入X-Engine,查詢存量資料時X-Engine的效能(QPS或TPS)整體略低於InnoDB。

效能對比

上圖為各種情境分別使用InnoDB和X-Engine儲存引擎時的效能對比,通過對比可以發現X-Engine與InnoDB效能相近。

在大多數的OLTP事務型負載中,更新(oltp_update_index、oltp_write_only)和點查(oltp_point_select)的執行頻率較高,X-Engine在這兩項上的效能與InnoDB基本持平。

由於X-Engine的階層式存放區特性,X-Engine在執行範圍掃描時或檢查一條記錄是否唯一時,需要掃描或訪問多個層次,所以X-Engine的範圍查詢(oltp_read_only)和新記錄插入(oltp_insert)效能比InnoDB略差。

在混合情境(oltp_read_write),X-Engine與InnoDB效能基本持平。

Sysbench測試命令:

#以oltp_read_only為例
sysbench /usr/share/sysbench/oltp_read_only.lua\
    --mysql-host=[RDS執行個體串連串]\
    --mysql-user=sbtest\
    --mysql-password=sbtest\
    --mysql-db=sbtest\
    --time=3600\
    --tables=32\
    --threads=512\
    --table_size=10000000\
    --rand-type=uniform\
    --report-interval=1\
    run

總結

X-Engine是一款效能與InnoDB相似,但是儲存成本非常低的RDS MySQL儲存引擎產品。目前,X-Engine已經服務於阿里雲上承載的DingTalk歷史庫、淘寶圖片資訊庫、淘寶交易歷史庫等多項阿里巴巴集團核心業務,不僅降低了儲存成本,還能保證效能滿足業務需求。關於X-Engine的詳細介紹請參見X-Engine簡介

使用X-Engine