魚和熊掌如何兼得?一文解析RDS數據庫存儲架構升級

2024年2月6日 22点热度 0人点赞

在2023年雲棲大會上,阿裡雲數據庫產品事業部負責人李飛飛在主題演講中提到,瑤池數據庫推出“DB 存儲”一體化能力,結合人工智能、機器學習、存儲等方法和創新能力,實現Buffer Pool Extension能力和智能冷溫熱數據分層能力。在大會的《雲數據庫RDS年度發佈與最佳實踐》演講中,阿裡雲RDS及OLAP開源產品部負責人彭祥表示,面對當前越來越豐富且復雜的數據環境,性能、彈性、成本是數據庫用戶的三大重點訴求;阿裡雲RDS產品在業界率先推出新型存儲類型——通用雲盤將雲盤的IOPS與容量徹底解耦,增加緩存擴展的能力,用技術提升RDS產品IO性能,降低存儲降本。

RDS通用雲盤IO加速功能現已全網公測,歡迎點擊【RDS MySQL IO加速公測活動_雲數據庫 RDS(RDS)-阿裡雲幫助中心】直達體驗。


1. 什麼是通用雲盤?

介紹通用雲盤前,我們先來說說存儲。眾所周知,數據庫架構設計由下至上可分為存儲層、引擎層、服務層、網絡層。存儲層負責數據的持久化存儲和讀取,處於整個數據庫系統架構的最底層。數據存儲和數據檢索讀取是它的兩大功能。在數據庫中,存儲層常見的存儲類型,往往有基於物理機本地硬盤的本地盤和基於分佈式存儲架構的雲盤。本地盤存儲,數據存儲與計算資源位於同一物理服務器節點上,由於數據讀寫不需要經過網絡傳輸,因此IO延遲通常較低,隨機讀寫性能高,但本地盤的存儲容量受限於單個服務器的硬件配置,一旦服務器出現故障,可能影響數據的安全性和可用性,且本地盤存儲容量難以獨立擴展;雲盤基於分佈式存儲架構,數據存儲與計算資源分離,用戶可獨立地按需調整計算和存儲資源,提高了資源的利用率和靈活度,但雲盤通過網絡為計算節點提供存儲服務,多少會對IO延時有所影響,而且,雲盤的性能,往往跟其容量綁定,提升性能大部分情況下勢必需要提升雲盤容量,除此之外,雲盤不支持縮容。

而在調研和分析用戶業務場景的過程中,我們發現,在多個行業,例如電商行業、新零售行業、遊戲行業等,用戶業務流量並不是一直持續一個水位,有明顯的波峰波谷特征,如何讓性能不受容量影響,順應峰值的到來而提升,如何得到性能(低延遲、高持久)的同時做到完美的成本控制(低成本),已然成為大部分客戶在數據庫選型中的關註點。阿裡雲RDS產品,率先推出了通用雲盤,同時滿足用戶關於低成本、低延遲、高持久性的訴求

通用雲盤,首先是一種雲盤。但與當前業界主流雲盤的區別在於,通用雲盤深度融合PaaS層和IaaS層的技術創新,改變了傳統的數據存儲結構,將原有的單一數據存儲劃分為了三層存儲結構:緩存層、數據層、冷存層。熱數據存入緩存盤(High Performance Disk),溫數據存入數據盤(ESSD雲盤),歸檔數據存入冷存盤(OSS對象存儲)。這樣的存儲結構設計中,將緩存盤作為可擴展的一部分,達到IO加速的效果;基於AliSQL獨有的內核能力,輕松應對讀寫數據庫過程中的IO突發情況發生,並支持最小10GB,最大64T的容量空間、雲盤縮容以及自動秒級擴容的功能;同時,將不常用的冷數據歸檔存儲於對象存儲上,又實現使用成本的節約。通用雲盤將IO性能與雲盤容量解耦,使得數據層在IO性能與雲盤容量兩個方面都實現了極致彈性。

2. 三層存儲是怎樣的一種架構?

通用雲盤的架構設計如上圖所示,從左至右依次是緩存層、數據層、冷存層。各層存儲各司其職,選擇不同的存儲介質,在對應存儲層中發揮價值最大化。

  • 緩存層:處理高IOPS和超低IO時延需求,一般百萬級IOPS和微秒級IO時延需求。采用阿裡雲高速緩存盤(High Performance Disk),結合RDS數據庫引擎的緩存技術,實現查詢數據庫過程中的IO加速功能,帶來更高的查詢性能。
  • 數據層:處理低IO時延和數據可靠性需求,一般萬級IOPS和毫秒級IO時延需求。采用阿裡雲ESSD雲盤,保障數據的高可靠性和安全性,並借助基礎設施和AliSQL內核的創新能力,以及RDS數據庫的管控架構升級,達到IO性能與雲盤容量的解耦,實現數據庫讀寫過程的IO突發功能,提升了IO性能與雲盤容量的極致彈性。
  • 冷存層:處理數據持久化和存儲低成本需求,一般存儲在冷存層的數據不常被訪問,但有超高的數據庫可靠性和持久性需求。采用阿裡雲對象存儲(Object Storage Service,OSS),結合RDS數據庫引擎的歸檔技術,實現了數據庫的歸檔功能,並支持通過ALTER TABLE實現表文件在數據層和冷存層的切換,為不常訪問的數據表提供了更低成本的存儲選擇

表1:RDS通用雲盤三層存儲介質對比

3. 通用雲盤有哪些特征?

在詳解特性技術前,我們整理了一張通用雲盤三層存儲的特性對比表,如下:

表2:RDS通用雲盤三層存儲特性對比

3.1 緩存層特性——IO加速

IO加速是指提升數據庫查詢性能的一種特性。該特性主要體現在通用雲盤的緩存層,發揮出高速緩存盤的高IO性能優勢,從整體上提升數據庫的查詢性能。相比於ESSD雲盤,高速緩存盤具備更高的IOPS上限和帶寬上限,以及更低的IO時延。

緩存層通過兩種方式實現IO加速:

  • 緩存池擴展(Buffer Pool Extension, BPE):利用高速緩存盤進行緩存池擴展,提高緩存命中率,減少數據層ESSD的訪問次數,加快數據庫查詢速度。
  • 存放臨時表/文件:利用高速緩存盤存放臨時表/文件,提高臨時表/文件的訪問速度,進而提高數據庫查詢性能。

基於此,IO加速特性較適合讀負載較高、臨時表/文件使用較多的業務場景。當前,RDS的MySQL引擎已支持上述兩種方式,RDS的PostgreSQL引擎暫僅支持存放臨時表/文件的方式來實現IO加速。

3.1.1 緩存池擴展(Buffer Pool Extension, BPE)

緩存池(Buffer Pool,簡稱BP)是數據庫引擎內存區域的一部分,用於臨時存儲常用的數據和索引頁,從而減少對磁盤的訪問次數,提高數據庫操作的性能和效率。因此,緩存池越大,緩存命中率就越高,數據庫對磁盤的訪問次數就越少,整體的查詢性能和效率就越高。

但是,緩存池的大小受限於內存資源,而對於數據庫系統來說,內存資源的使用往往是比較緊張的。為了能夠在不增加內存資源的情況下擴大緩存,並且充分利用高速緩存盤高IO性能的優勢,RDS的MySQL引擎實現了緩存池擴展的功能,對內存中的緩存池進行擴充,進一步提高緩存命中率,提升數據庫整體查詢性能。

圖1:緩存池擴展工作原理

緩存池擴展作用原理如上圖,一次數據頁讀取的過程:

  1. 客戶端側發起讀取數據頁的請求。
  2. 請求進入內存的緩存池中查找指定數據頁:
  • 如果在緩存池中找到數據頁,則返回結果給客戶端側,查詢和讀取結束。
  • 如果在緩存池中未找到數據頁,則執行步驟3。
  1. 請求進入緩存盤的緩存池拓展中查找指定數據頁:
  • 如果在緩存池拓展中找到數據頁,則返回數據頁給緩存池,再返回結果給客戶端側,查詢和讀取結束。
  • 如果在緩存池拓展中未找到數據頁,則執行步驟4。
  1. 請求進入ESSD的數據表文件中查找指定數據頁。找到數據頁後返回給緩存池,再返回結果給客戶端側。
  2. 查詢和讀取請求結束。

3.1.2 存放臨時表/文件

對於數據庫引擎來說,內存中的緩存池、磁盤中的臨時表/文件都會影響數據庫的查詢性能。臨時表/文件用於當前會話或者查詢中,存放數據查詢過程中產生的中間結果或者超出內存的結果,一般不需要持久化存儲到數據文件中,使用後便會被刪除。

基於臨時表/文件在業務中的無持久化需求,RDS通用雲盤,有別於當前的ESSD雲盤,更改了臨時表/文件的存儲位置。之前,RDS數據庫的臨時表/文件存放於ESSD數據盤中;而推出通用雲盤後,臨時表/文件可存儲於高速緩存盤中,提升了數據庫對臨時表/文件的訪問效率,進而加快數據庫查詢速度。

以8核16GB規格為例,IO加速功能測試結果如下:

  • read_only QPS提升80%
  • write_only QPS提升33%
  • read_write QPS提升103%

3.2 數據層特性——IO突發和雲盤縮容

通用雲盤的數據層采用雲盤ESSD作為存儲介質,借助ESSD雲盤的創新能力實現雲盤的IO性能與容量解耦,並結合數據庫RDS的管控架構優勢和數據拷貝能力實現雲盤的縮容,為數據庫實現IO性能和雲盤容量兩方面的極致彈性。

3.2.1 IO突發

高IO負載、波動IO負載是較為常見的兩種業務場景。RDS數據庫之前接入的ESSD雲盤(PL1-3),其雲盤IO性能與容量深度綁定,IOPS和帶寬上限深受存儲容量的限制。在這個限制下,應對高IO負載、波動IO負載的高IO洪峰場景時,雲盤擴容成為了獲得更高雲盤IO性能的唯一解。

RDS的通用雲盤在數據庫通過技術創新,將雲盤的IO性能與存儲容量解耦,提供IO性能突發能力,並可根據實際業務的使用量動態調整雲盤的IO上限。高IO負載時,自動觸發IO突發,提升IO上限,IO負載回落後,自動恢復IO上限,實現IO性能的極致彈性,避免IO性能和成本浪費。

如下測試圖例,當開啟IO突發後,業務IO高峰時,RDS實例的IOPS使用率會突破100%。

圖2:RDS通用雲盤IO突發測試

目前,RDS通用雲盤IO突發功能已支持RDS MySQL、PostgreSQL和SQL Server三款引擎。

3.2.2 雲盤縮容

眾所周知,雲盤不支持縮容。但RDS通用雲盤,借助RDS數據庫管控架構和AliSQL內核的優勢,結合數據拷貝功能,實現了RDS雲盤縮容。同時,基於雲盤本身的秒級擴容能力,可以讓客戶根據業務需求自由地調整雲盤容量,實現雲盤容量的極致彈性。

3.3 冷存層特性——數據歸檔

通用雲盤的冷存層數據層采用對象存儲OSS作為存儲介質,將表級別數據歸檔於OSS中,並不影響用戶正常查詢OSS中歸檔表數據。開啟數據歸檔功能後,客戶可通過ALTER TABLE將表文件在ESSD數據盤與OSS對象存儲之間切換,同時在OSS中的歸檔表支持正常的查詢。

OSS存儲成本遠低於ESSD,所以數據歸檔功能可以為客戶不常訪問的表大幅度降低存儲成本。

數據歸檔特性較適用於有不常訪問或修改的表的業務場景。冷存層通過數據庫內核直接訪問對象存儲和借助JuiceFS訪問對象存儲OSS兩種方式實現數據歸檔。

3.3.1 數據庫內核直接訪問對象存儲

數據庫內核直接訪問對象存儲是指歸檔表數據put到OSS中,並通過get訪問OSS歸檔表數據。RDS的MySQL引擎主要采用這種方式。值得註意的是,為確保歸檔表的兼容性,AliSQL內核采用InnoDB引擎存儲格式。因此,緩存池擴展能力(BPE)仍然能夠作用於歸檔表,對其查詢性能進行加速。

開啟數據歸檔功能後,可通過執行ALTER TABLE,將正常表上傳至OSS轉變成歸檔表,也可通過ALTER TABLE將歸檔表轉為正常表。歸檔表目前僅支持讀操作,用戶可通過SELECT語句訪問歸檔表中的內容。MySQL內核會對用戶指定的歸檔表執行具體操作如下:

  • 將數據表對應的ibd文件,按照oss_block_size指定的大小(默認2MB)切分成文件塊。
  • 利用OSS的sdk將切分後的文件塊上傳到OSS中。
  • 在ESSD數據盤上保留space header文件,加速實例的啟動和表文件的掃描速度。

圖3:RDS MySQL冷存歸檔數據流

3.3.2 借助JuiceFS訪問對象存儲

借助JuiceFS訪問對象存儲OSS的數據歸檔方式,主要用於RDS PostgreSQL引擎。

這種方式下,開啟數據歸檔功能後,RDS PostgreSQL實例除了數據目錄外,會增加歸檔目錄/cold-jfs及對應的表空間rds_oss。客戶可通過ALTER TABLE語句將對應的表轉移到rds_oss表空間中。處於rds_oss表空間中的數據會借助JuiceFS文件系統上傳到OSS上,並不占用ESSD數據盤空間。rds_oss表空間中的所有表均為歸檔表,客戶可以用正常的查詢語句查詢歸檔表中的數據。

圖4:RDS PostgreSQL冷存歸檔數據流

RDS MySQL冷存表隻讀性能測試結果如下:

相比於正常表,冷存表的QPS是正常表的15%左右。

4. 總結

性能、彈性、成本,是客戶實際使用數據庫過程中關註的三個重要方面。RDS業界率先推出的通用雲盤,是PaaS層和IaaS層的深度融合的技術最佳實踐,通過三層存儲架構設計(緩存層、數據層和冷存層),每一層采用使用不同的存儲介質,為客戶提供同時滿足低成本、低延遲、高持久性的體驗。