在容器中運行數據庫,能幫助用戶提高服務器利用效率,降低基礎架構成本,更快速地部署、更便捷地管理數據庫服務。
根據云監控供應商Datadog的調查報告, Postgres、MongoDB和MySQL等數據庫技術都位于容器上運行的十大技術之中——并且使用量還在增長。
MySQL容器化需要容器存儲的有力支持
數據庫實際上由兩大組件組成:讀取、寫入和查詢數據的應用,以及數據存儲,我們通常稱之為數據卷。MySQL等數據庫應用所需的計算資源完全可以通過容器技術提供,是否能流暢運行MySQL數據庫的關鍵在于容器存儲方案。國內大多數用戶在選擇容器存儲時,通常有以下幾種方案:
l 新版本的Kubernetes可以支持塊設備掛載至容器內部(該塊設備可以來自服務器的物理磁盤,也可以來自傳統的SAN陣列)
l 通過Ceph提供的CSI插件使用CephRBD或者CephFS
l 使用焱融云的YRCloudFile提供的容器存儲
大多數客戶對容器存儲的以下幾點尤為關注:
l 數據可靠性
l 是否能通過容器編排平臺快速完成存儲資源的生命周期管理(創建、擴容、刪除和回收等)
l MySQL在容器化環境中的容災備份
l MySQL容器故障后,在新節點重新啟動,其數據是否能快速訪問
l MySQL使用容器存儲的實際性能如何,是否能滿足業務需求
關于用戶關注的上述特性,我們在之前的文章中都有過介紹,在以后的文章里也會進一步描述。本文針對用戶最關注的,MySQL基于不同存儲的實際性能進行了實際測試和對比。
MySQL存儲引擎和數據寫入策略
在介紹實際測試性能之前,有必要介紹一下MySQL數據庫的存儲引擎,以及相關的寫入策略,這對于數據庫的實際使用性能有非常關鍵的影響。
MySQL存儲引擎
MySQL數據庫提供插件式的存儲引擎,這個存儲引擎提供了一系列標準的管理和數據讀寫服務的支持,不同的存儲引擎有不同的特點,存儲引擎對于業務開發人員而言是透明的。其中,InnoDB是著名的第三方存儲引擎,后被Oracle收購,是MySQL數據庫OLTP(Online Transaction Processing,在線事務處理)應用中使用最廣的存儲引擎,也是5.5.8版本后,MySQL默認的存儲引擎,以下的測試就基于InnoDB存儲引擎進行。
InnoDB刷數據策略
InnoDB中有一項設置——innodb_flush_method,這項設置負責控制InnoDB刷數據時所使用的系統調用。所謂刷數據,即將緩存在內存中或臨時磁盤存儲區域中的數據寫入特定的日志及數據文件(log,如ib_logfile和數據庫data file),完成持久化。
刷數據動作可能是因為內存區域已滿并且系統需要釋放一些空間而觸發,或是因為事務完成更改的commit操作而觸發,或者由需要終結所有未完成工作的關閉操作而觸發。
innodb_flush_method的值對應著不同的系統調用,從而會觸發不同的系統行為,經常使用的值包括:
l fsync:InnoDB使用fsync()系統調用將MySQL的數據和日志文件都刷到持久化存儲中,fsync是InnoDB的模式設置。
l O_DIRECT:InnoDB使用O_DIRECT標識打開MySQL的數據文件,意味著MySQL數據將繞過pagecache,直接寫入磁盤,并使用fsync()系統調用將MySQL數據和日志文件的元數據信息更新刷入磁盤。
l O_DIRECT_NO_FSYNC:只使用O_DIRECT方式,繞過pagecache,將數據直接寫入磁盤,并在寫操作時跳過fsync()更新日志的元數據信息。在8.0.14版本之后, MySQL會在創建文件、增加文件長度以及關閉文件時自動調用fsync()來更新MySQL文件在文件系統中的元數據信息。
YRCloudFile可以支持這種刷數據方式,即可以很好地確保每個數據都直接落盤,同時減少頻繁調用fsync帶來的開銷,極大提升性能。
sysbench性能對比測試
在下面進行的性能對比的測試中,我們在MySQL容器中使用了以下幾種存儲方案進行對比:
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集群都采用以下四臺相同的物理服務器進行搭建:
l CPU:Intel 4112 * 2
l 內存:64GB
l 系統盤:240GB * 2
l 元數據盤:960GB SSD * 2(CephRBD時不需要元數據盤)
l 緩存盤:960GB SSD * 2
l 數據盤:4TB SATA * 2
l 管理網絡:1Gb * 2
l 存儲網絡:10Gb * 2
MySQL版本為8.0.14,使用InnoDB作為存儲引擎,innodb_flush_method設為O_DIRECT_NO_FSYNC ;Ceph版本為mimic,Ceph基于filestore;sysbench版本為1.0.17,基于50個表,每個表中包含100萬條數據的數據庫進行oltp_write_only和oltp_read_write測試。
測試結果如下:
從測試結果看:
l 直接使用物理SSD時,由于是進行本地SSD讀寫,延時很低;且MySQL應用為了確保其操作的順序性,主要是采用有限線程低并發進行順序追加寫,延時性能決定了單個MySQL的整體性能,因此無論YRCloudFile還是Ceph存儲集群對單個MySQL實例而言,會受到延時影響,性能不如本地SSD盤。
l 另一方面,我們看到基于RoCE的YRCloudFile的性能已經接近本地SSD盤,基于TCP的YRCloudFile集群所提供的性能略低于RoCE的性能。
l 基于RoCE的YRCloudFile性能高于基于TCP的YRCloudFile性能,是CephRBD或CephFS性能的將近一倍。這是因為:1)YRCloudFile集群的元數據保存在本地SSD,相對于CephFS的元數據保存在RADOS中而言,其元數據讀延時明顯低于CephFS;2)基于RDMA的YRCloudFile繞過了系統內核,直接訪問集群中的磁盤數據,進一步降低了延遲。
也許有讀者會問,從單個MySQL實例的測試性能看,YRCloudFile分布式存儲系統的優勢如何體現呢?通過使用YRCloudFile,可以充分發揮集群中所有磁盤的性能,使整個集群支持更多的MySQL實例,而單塊SSD盤的性能可以支撐的MySQL實例就有限得多了。此外,YRCloudFile也正在通過硬件offload,NVMe優化等方式,進一步縮短集群IO的延時,使集群IO的延時盡可能接近本地SSD的延時,從而使單MySQL實例的性能更加接近使用本地SSD運行MySQL的性能。
在這篇文章中,我們介紹了如何通過設置MySQL InnoDB的innodb_flush_method參數,使用YRCloudFile獲得最佳的MySQL運行性能,并對比了在同等環境下,使用SSD、CephRBD、CephFS所獲得的性能。在后續文章里,我們還會分享更多基于YRCloudFile運行各種中間件應用的最佳實踐,以及相關的技術細節。