沙場秋點(diǎn)兵——MySQL容器化性能測試對比
容器技術(shù)改變了應(yīng)用交付、運(yùn)行的方式,幾乎各種Linux環(huán)境下的應(yīng)用程序都可以使用容器來運(yùn)行。但是否能在容器環(huán)境里運(yùn)行數(shù)據(jù)庫應(yīng)用,以及數(shù)據(jù)庫應(yīng)用是否適合在容器里運(yùn)行,一直都是大家很關(guān)注的問題,今天我們就來深入分析一下容器環(huán)境運(yùn)行MySQL數(shù)據(jù)庫的事。
在容器中運(yùn)行數(shù)據(jù)庫,能幫助用戶提高服務(wù)器利用效率,降低基礎(chǔ)架構(gòu)成本,更快速地部署、更便捷地管理數(shù)據(jù)庫服務(wù)。
根據(jù)云監(jiān)控供應(yīng)商Datadog的調(diào)查報告, Postgres、MongoDB和MySQL等數(shù)據(jù)庫技術(shù)都位于容器上運(yùn)行的十大技術(shù)之中——并且使用量還在增長。

MySQL容器化需要容器存儲的有力支持
數(shù)據(jù)庫實(shí)際上由兩大組件組成:讀取、寫入和查詢數(shù)據(jù)的應(yīng)用,以及數(shù)據(jù)存儲,我們通常稱之為數(shù)據(jù)卷。MySQL等數(shù)據(jù)庫應(yīng)用所需的計算資源完全可以通過容器技術(shù)提供,是否能流暢運(yùn)行MySQL數(shù)據(jù)庫的關(guān)鍵在于容器存儲方案。國內(nèi)大多數(shù)用戶在選擇容器存儲時,通常有以下幾種方案:
l 新版本的Kubernetes可以支持塊設(shè)備掛載至容器內(nèi)部(該塊設(shè)備可以來自服務(wù)器的物理磁盤,也可以來自傳統(tǒng)的SAN陣列)
l 通過Ceph提供的CSI插件使用CephRBD或者CephFS
l 使用焱融云的YRCloudFile提供的容器存儲
大多數(shù)客戶對容器存儲的以下幾點(diǎn)尤為關(guān)注:
l 數(shù)據(jù)可靠性
l 是否能通過容器編排平臺快速完成存儲資源的生命周期管理(創(chuàng)建、擴(kuò)容、刪除和回收等)
l MySQL在容器化環(huán)境中的容災(zāi)備份
l MySQL容器故障后,在新節(jié)點(diǎn)重新啟動,其數(shù)據(jù)是否能快速訪問
l MySQL使用容器存儲的實(shí)際性能如何,是否能滿足業(yè)務(wù)需求
關(guān)于用戶關(guān)注的上述特性,我們在之前的文章中都有過介紹,在以后的文章里也會進(jìn)一步描述。本文針對用戶最關(guān)注的,MySQL基于不同存儲的實(shí)際性能進(jìn)行了實(shí)際測試和對比。
MySQL存儲引擎和數(shù)據(jù)寫入策略
在介紹實(shí)際測試性能之前,有必要介紹一下MySQL數(shù)據(jù)庫的存儲引擎,以及相關(guān)的寫入策略,這對于數(shù)據(jù)庫的實(shí)際使用性能有非常關(guān)鍵的影響。
MySQL存儲引擎
MySQL數(shù)據(jù)庫提供插件式的存儲引擎,這個存儲引擎提供了一系列標(biāo)準(zhǔn)的管理和數(shù)據(jù)讀寫服務(wù)的支持,不同的存儲引擎有不同的特點(diǎn),存儲引擎對于業(yè)務(wù)開發(fā)人員而言是透明的。其中,InnoDB是著名的第三方存儲引擎,后被Oracle收購,是MySQL數(shù)據(jù)庫OLTP(Online Transaction Processing,在線事務(wù)處理)應(yīng)用中使用最廣的存儲引擎,也是5.5.8版本后,MySQL默認(rèn)的存儲引擎,以下的測試就基于InnoDB存儲引擎進(jìn)行。
InnoDB刷數(shù)據(jù)策略
InnoDB中有一項(xiàng)設(shè)置——innodb_flush_method,這項(xiàng)設(shè)置負(fù)責(zé)控制InnoDB刷數(shù)據(jù)時所使用的系統(tǒng)調(diào)用。所謂刷數(shù)據(jù),即將緩存在內(nèi)存中或臨時磁盤存儲區(qū)域中的數(shù)據(jù)寫入特定的日志及數(shù)據(jù)文件(log,如ib_logfile和數(shù)據(jù)庫data file),完成持久化。
刷數(shù)據(jù)動作可能是因?yàn)閮?nèi)存區(qū)域已滿并且系統(tǒng)需要釋放一些空間而觸發(fā),或是因?yàn)槭聞?wù)完成更改的commit操作而觸發(fā),或者由需要終結(jié)所有未完成工作的關(guān)閉操作而觸發(fā)。
innodb_flush_method的值對應(yīng)著不同的系統(tǒng)調(diào)用,從而會觸發(fā)不同的系統(tǒng)行為,經(jīng)常使用的值包括:
l fsync:InnoDB使用fsync()系統(tǒng)調(diào)用將MySQL的數(shù)據(jù)和日志文件都刷到持久化存儲中,fsync是InnoDB的模式設(shè)置。
l O_DIRECT:InnoDB使用O_DIRECT標(biāo)識打開MySQL的數(shù)據(jù)文件,意味著MySQL數(shù)據(jù)將繞過pagecache,直接寫入磁盤,并使用fsync()系統(tǒng)調(diào)用將MySQL數(shù)據(jù)和日志文件的元數(shù)據(jù)信息更新刷入磁盤。
l O_DIRECT_NO_FSYNC:只使用O_DIRECT方式,繞過pagecache,將數(shù)據(jù)直接寫入磁盤,并在寫操作時跳過fsync()更新日志的元數(shù)據(jù)信息。在8.0.14版本之后, MySQL會在創(chuàng)建文件、增加文件長度以及關(guān)閉文件時自動調(diào)用fsync()來更新MySQL文件在文件系統(tǒng)中的元數(shù)據(jù)信息。
YRCloudFile可以支持這種刷數(shù)據(jù)方式,即可以很好地確保每個數(shù)據(jù)都直接落盤,同時減少頻繁調(diào)用fsync帶來的開銷,極大提升性能。

sysbench性能對比測試
在下面進(jìn)行的性能對比的測試中,我們在MySQL容器中使用了以下幾種存儲方案進(jìn)行對比:
l 將本地物理SSD盤掛載到MySQL容器中
l 將基于RoCE(RDMA over Converged Ethernet)的YRCloudFile集群中的PV掛載到MySQL容器中
l 將基于TCP的YRCloudFile集群中的PV掛載到MySQL容器中
l 將CephRDB的PV掛載到MySQL容器中
l 將CephFS的PV掛載到容器中
除物理SSD盤外,YRCloudFile和Ceph集群都采用以下四臺相同的物理服務(wù)器進(jìn)行搭建:
l CPU:Intel 4112 * 2
l 內(nèi)存:64GB
l 系統(tǒng)盤:240GB * 2
l 元數(shù)據(jù)盤:960GB SSD * 2(CephRBD時不需要元數(shù)據(jù)盤)
l 緩存盤:960GB SSD * 2
l 數(shù)據(jù)盤:4TB SATA * 2
l 管理網(wǎng)絡(luò):1Gb * 2
l 存儲網(wǎng)絡(luò):10Gb * 2
MySQL版本為8.0.14,使用InnoDB作為存儲引擎,innodb_flush_method設(shè)為O_DIRECT_NO_FSYNC ;Ceph版本為mimic,Ceph基于filestore;sysbench版本為1.0.17,基于50個表,每個表中包含100萬條數(shù)據(jù)的數(shù)據(jù)庫進(jìn)行oltp_write_only和oltp_read_write測試。
測試結(jié)果如下:


從測試結(jié)果看:
l 直接使用物理SSD時,由于是進(jìn)行本地SSD讀寫,延時很低;且MySQL應(yīng)用為了確保其操作的順序性,主要是采用有限線程低并發(fā)進(jìn)行順序追加寫,延時性能決定了單個MySQL的整體性能,因此無論YRCloudFile還是Ceph存儲集群對單個MySQL實(shí)例而言,會受到延時影響,性能不如本地SSD盤。
l 另一方面,我們看到基于RoCE的YRCloudFile的性能已經(jīng)接近本地SSD盤,基于TCP的YRCloudFile集群所提供的性能略低于RoCE的性能。
l 基于RoCE的YRCloudFile性能高于基于TCP的YRCloudFile性能,是CephRBD或CephFS性能的將近一倍。這是因?yàn)椋?)YRCloudFile集群的元數(shù)據(jù)保存在本地SSD,相對于CephFS的元數(shù)據(jù)保存在RADOS中而言,其元數(shù)據(jù)讀延時明顯低于CephFS;2)基于RDMA的YRCloudFile繞過了系統(tǒng)內(nèi)核,直接訪問集群中的磁盤數(shù)據(jù),進(jìn)一步降低了延遲。
也許有讀者會問,從單個MySQL實(shí)例的測試性能看,YRCloudFile分布式存儲系統(tǒng)的優(yōu)勢如何體現(xiàn)呢?通過使用YRCloudFile,可以充分發(fā)揮集群中所有磁盤的性能,使整個集群支持更多的MySQL實(shí)例,而單塊SSD盤的性能可以支撐的MySQL實(shí)例就有限得多了。此外,YRCloudFile也正在通過硬件offload,NVMe優(yōu)化等方式,進(jìn)一步縮短集群IO的延時,使集群IO的延時盡可能接近本地SSD的延時,從而使單MySQL實(shí)例的性能更加接近使用本地SSD運(yùn)行MySQL的性能。
在這篇文章中,我們介紹了如何通過設(shè)置MySQL InnoDB的innodb_flush_method參數(shù),使用YRCloudFile獲得很好的MySQL運(yùn)行性能,并對比了在同等環(huán)境下,使用SSD、CephRBD、CephFS所獲得的性能。在后續(xù)文章里,我們還會分享更多基于YRCloudFile運(yùn)行各種中間件應(yīng)用的很好實(shí)踐,以及相關(guān)的技術(shù)細(xì)節(jié)。