X-Engine的效能與InnoDB相似,但是儲存成本遠低於InnoDB,因此擁有極高的性價比。
背景資訊
RDS MySQL提供阿里雲自研儲存引擎X-Engine,相比InnoDB,X-Engine在磁碟空間佔用和資料庫整體成本上有比較明顯的優勢,X-Engine使用了層次化的儲存結構,並結合ZSTD壓縮演算法實現了更高的資料壓縮率。下文將詳細對比X-Engine、InnoDB、TokuDB的儲存開銷和效能。
測試環境
用於測試的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
- 如果您是新使用者,想使用X-Engine,請在購買RDS MySQL執行個體時選擇X-Engine作為預設引擎,詳情請參見快速建立RDS MySQL執行個體。
- 如果您已經在使用RDS MySQL執行個體,想轉換為X-Engine,請參見InnoDB/TokuDB/Myrocks引擎轉換為X-Engine引擎。