阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?

一、2017年我們做了什麼?

記得早在2017年的時候,王堅博士就曾召大家就關於“IDC As a Computer”是否能做到,進行過激烈的討論。而要做到此,必須要實現存儲計算分離,分離後由調度對計算和存儲資源進行獨立自由調度。而在實現存儲計算分離的所有業務中,數據庫是最難的。因為數據庫對I/O的時延和穩定性有著極高的要求。但是從業界來看,存儲計算分離又是一個未來的技術趨勢,因為像Google spanner以及Aurora都已經實現了。

所以2017年,我們抱著堅定的信念,去實現數據庫的存儲計算分離。事實上,2017年我們做到了,基於盤古和AliDFS(ceph分支) ,在張北單元存儲計算分離承擔10%的交易量。2017年是數據庫實現存儲計算分離的元年,為2018年大規模實現存儲計算分離打下了堅實的基礎。

二、2018技術突破?

如果說2017年是數據庫實現存儲計算分離的突破之年的話,那麼2018年就是追求極致性能的一年,也是由試驗走向大規模部署的一年,其技術的挑戰可想而知。在2017年的基礎上,2018年的挑戰更為巨大,需要讓存儲計算分離更加的高性能、普適、通用以及簡單。


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


2018年,為了使得在存儲計算分離下數據庫的I/O達到最高性能和吞吐,我們自研了用戶態集群文件系統DADI DBFS。我們通過將技術沉澱到DADI DBFS用戶態集群文件上,賦能集團數據庫交易全單元規模化存儲計算分離。那麼成為存儲中臺級產品,DBFS又做了那些技術上的創新呢?

2.1 用戶態技術

2.1.1 “ZERO” copy

我們直接通過用戶態,旁路kernel,實現I/O路徑的“Zero”copy。避免了核內核外的copy,使得吞吐和性能都有了非常大的提高。

過去使用kernel態時,會有兩次數據copy,一次由業務的用戶態進程copy數據到核內,一次由核內copy到用戶態網絡轉發進程。這兩次copy會影響整體吞吐和時延。

切到純用戶態之後,我們使用polling模型進行I/O request請求的發送。另外對於polling mode下CPU的消耗,我們使用了adaptive sleep技術,使得空閒時,不會浪費core資源。


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


2.1.2 RDMA

另外,DBFS結合RDMA技術與盤古存儲直接進行數據交換,達到接近於本地SSD的時延和更高的吞吐,從而使得今年跨網絡的極低時延I/O成為可能,為大規模存儲計算分離打下了堅強的基礎。今年集團參加大促的RDMA集群,可以說是在規模上為業界最大的一個集群。

2.2 Page cache

為了實現buffer I/O的能力,我們單獨實現了page cache。Page cahce採用touch count based LRU算法實現。引入touch count的意義是為了更好的與數據庫的I/O特性結合。因為數據庫中時常會有大表掃描等行為,我們不希望這種使用頻率低的數據頁沖刷掉LRU的效率。我們會基於touch count將page在hot端和cool端進行移動。

Page cache的頁大小可配置,與數據庫的頁大小進行結合時,會發揮更好的cache效率。總體上DBFS的page cache具備以下的能力:

● 基於touch count進行page的冷熱端遷移

● 冷熱端比例可配置,目前為熱冷比例為2:8

● page size可配置,結合數據庫頁進行最優化配置

● 多shard,提高併發;總體容量可配置


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


2.3 異步I/O

為了提高數據庫的I/O吞吐能力,大部分數據庫都使用了異步I/O。我們為了兼容上層數據庫的I/O特性,實現了異步I/O。異步I/O特性:

● 無鎖隊列實現

● 可配置的I/O depth,能夠使得針對數據庫不同的I/O類型進行精確時延控制

● polling adaptive,減少CPU消耗


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


2.4 原子寫

為了保證數據庫頁寫出的時候不出現partial write,DBFS實現了原子寫功能。基於DBFS的Innodb,可以安全的將double write buffer關掉,從而使得在存計分離下數據庫帶寬節省100%。

另外,如PostgreSQL使用的是buffer I/O,也避免了PG在dirty page flush時偶發性遇到的缺頁問題。

2.5 Online Resize

為了避免擴容而帶來的數據遷移,DBFS結合底層盤古實現volume的在線resize。DBFS有自己的bitmap allocator,用於實現底層存儲空間的管理。我們對bitmap allocator進行了優化,在文件系統層級做到了lock free的resize,使得上層業務可以在任何時候進行對業務無損的高效擴容,完全優於傳統的ext4文件系統。

Online Resize的支持,避免了存儲空間的浪費,因為不用reserve如20%的存儲空間了,可以做到隨擴隨寫。

以下為擴容時的bitmap變化過程:


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


2.6 TCP與RDMA互切

RDMA在集團數據庫大規模的引入使用也是一個非常大的風險點,DBFS與盤古一起實現了RDMA與TCP互切的功能,並在全鏈路過程中進行了互換演練,使得RDMA的風險在可控的範圍內,穩定性保障更加完善。

另外,DBFS,盤古以及網絡團隊,針對RDMA進行了非常多的容量水位壓測,故障演練等工作,為業界最大規模RDMA上線做了非常充足的準備。

2.7 2018年大促部署

在做到了技術上的突破和攻關後,DBFS最終完成艱鉅的任務通過大促全鏈路的考驗以及雙“十一”大考,再次驗證了存儲計算分離的可行性和整體技術趨勢。

三、存儲中臺利器DBFS

除了以上做為文件系統必須實現的功能以外,DBFS還實現了諸多的特性,使得業務使用DBFS更加的通用化,更加易用性,更加穩定以及安全。

3.1 技術沉澱與賦能

我們將所有的技術創新和功能以產品的形式沉澱在DBFS中,使得DBFS能夠賦能更多的業務實現以用戶態的形式訪問不同的底層存儲介質,賦能更多數據庫實現存儲計算分離。

3.1.1 POSIX兼容

目前為了支撐數據庫業務,我們兼容了大多數常用的POSIX文件接口,以方便上層數據庫業務的對接。另外也實現了page cache,異步I/O以及原子寫等,為數據庫業務提供豐富的I/O能力。另外,我們也實現了glibc的接口,用於支持文件流的操作和處理。這兩種接口的支持,大大簡化了數據庫接入的複雜度,增加了DBFS易用性,使得DBFS可以支撐更多的數據庫業務。

posix部分大家比較熟悉就不再列出,以下僅為部分glibc接口供參考:

// glibc interfaceFILE *fopen(constchar*path,constchar*mode);FILE *fdopen(int fildes,constchar*mode);size_t fread(void*ptr, size_t size, size_t nmemb, FILE *stream);size_t fwrite(constvoid*ptr, size_t size, size_t nmemb, FILE *stream);intfflush(FILE *stream);intfclose(FILE *stream);intfileno(FILE *stream);intfeof(FILE *stream);intferror(FILE *stream);voidclearerr(FILE *stream);intfseeko(FILE *stream, off_t offset,int whence);intfseek(FILE *stream,long offset,int whence);off_t ftello(FILE *stream);longftell(FILE *stream);voidrewind(FILE *stream);

3.1.2 Fuse實現

另外,為了兼容Linux生態我們實現了fuse,打通VFS的交互。Fuse的引入使得用戶在不考慮極致性能的情況下,可以不需要任何代碼改動而接入DBFS,大大提高產品的易用性。另外,也大大方便了傳統的運維操作。


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


3.1.3 服務化能力

DBFS自研了shmQ組件,基於內享內存的IPC通信,從而拉通了對於PostgreSQL基於進程架構和MySQL基於線程架構的支持,使得DBFS更加的通用化和安全,為以後在線升級提供堅實的基礎。

shmQ基於無鎖實現,性能和吞吐表現優異,從目前測試來看,在16K等數據庫大頁下能控制在幾個us以內的訪問時延。服務化以及多進程架構的支持,目前性能與穩定性符合預期。


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


3.1.4 集群文件系統

集群功能是DBFS的又一大明顯特性,賦能數據庫基於shared-disk模式,實現計算資源的線性擴展,為業務節省存儲成本。另外,shared-disk的模式也為數據庫提供了快速的彈性能力,也大大提高了主備快速切換的SLA。集群文件系統提供一寫多讀以及多點寫入的能力,為數據庫shared-disk和shared nothing架構打下堅實的基礎。與傳統的OCFS相比,我們在用戶態實現,性能更好,更加自主可控。OCFS嚴重依賴於Linux的VFS,如沒有獨立的page cache等。

DBFS 支持一寫多讀模式時,提供多種角色可選(M/S),可以存在一個M節點多個S節點使用共享數據,M 節點和S節點共同訪問盤古數據。上層數據庫對M/S節點進行了限制,M節點的數據訪問是可讀可寫的,S節點的數據訪問是隻讀的。如果主庫發生故障,就會進行切換。主從切換步驟:


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


● 業務監控指標探測發現M 節點出現無法訪問或者異常的時候,進行決策,是否要進行切換。

● 如果發生切換,由管控平臺發起切換命令,切換命令完成,代表DBFS和上層數據庫都已經完成角色切換。

● 在DBFS 切換的過程中,最主要的動作就是IO fence,禁止掉原本的M節點IO能力,防止雙寫情況。

DBFS在多點寫入時,對所有節點進行全局的metalock控制,blockgroup allocation優化等。另外也會涉及到基於disk的quorum算法等,內容比較複雜,暫不做詳細陳述。

3.2 軟硬件結合

隨著新存儲介質的出現,數據庫勢必需要借其發揮更好的性能或者更低成本優化,並且做到對底層存儲介質的自主可控。

從Intel對存儲介質的規劃來看,從性能到容量,會形成AEP,Optane和SSD這三種產品,而在向大容量方向上,又會有QLC的出現。所以綜合性能和成本來看,我們覺得Optane是一個比較不錯的cache產品。我們選擇它作為DBFS 機頭持久化filecache的實現。


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


3.2.1 持久化file cache

DBFS實現了基於Optane的local持久化cache功能,使得在存計分離下更近一步提升數據庫的讀寫性能。File cache為了達到生產可用性,做了非常多的工作,如:

● 穩定可靠的故障處理

● 支持動態enable和disable

● 支持負載均衡

● 支持性能指標採集和展示

● 支持數據正確性scrub

這些功能的支撐,為線上穩定性打下堅實的基礎。其中,針對Optane的I/O為SPDK的純用戶態技術,DBFS結合Fusion Engine的vhost實現。File Cache的頁大小可以根據上層數據庫的block大小進行最佳配置,以達到最好的效果。

以下為file cache的架構圖:


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


以下是測試所得讀寫性能收益數據:


阿里如何將“高峰前擴容、高峰後縮容”的夢想照進現實?


其中帶有“cache”的為基於filecache所得。整體表現隨著命中率提高,讀時延開始下降。另外,我們針對file cache,進行了諸多性能指標的監控。

3.2.2 Open Channel SSD

X-Engine和DBFS以及Fusion Engine團隊展開合作,基於object SSD進一步打造存儲自主可控的系統。在降低SSD磨損,提高SSD吞吐,降低讀寫相互干擾等領域,進行了深度探索與實踐,都取得了非常不錯的效果。目前已經結合X-Engine的分層存儲策略,打通了讀寫路徑,我們期待下一步更加深入的智能化存儲研發。

四、總結與展望

2018年DBFS已經大規模支持了X-DB以存儲計算分離形態支持“11.11”大促;與此同時也賦能ADS實現一寫多讀能力以及Tair等。

在支持業務的同時,DBFS本身已經拉通了PG進程與MySQL線程架構的支持,打通了VFS接口,做到了與Linux生態的兼容,成為真正意義上的存儲中臺級產品——集群用戶態文件系統。未來結合更多的軟硬件結合、分層存儲、NVMeoF等技術賦能更多的數據庫,實現其更大的價值。


分享到:


相關文章: