溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

發(fā)布時間:2020-08-08 10:44:30 來源:ITPUB博客 閱讀:179 作者:技術瑣話 欄目:數(shù)據(jù)庫

雙11已圓滿落幕,但技術的探索,仍未止步。

“阿里巴巴數(shù)據(jù)庫技術” 特此推出《贏戰(zhàn)2018雙11——阿里數(shù)據(jù)庫 & 存儲技術揭秘》系列干貨文章,為你講述2135億這個超級數(shù)字背后的故事,敬請關注!

導讀:面對數(shù)據(jù)庫實例和存儲規(guī)模的不斷增長,大促成本、調(diào)度效率等難題,2017年阿里就開始小范圍應用新型技術架構——“存儲計算分離”,以更低成本支撐彈性大促。

2018年,我們實現(xiàn)了全單元規(guī)?;渴鸫鎯τ嬎惴蛛x。不過在此之前,各個業(yè)務都需要根據(jù)自身業(yè)務特性進行大量優(yōu)化。數(shù)據(jù)庫領域更是如此,而且要求更加苛刻,難度更大。阿里巴巴存儲技術事業(yè)部高級技術專家呂健詳細解讀在2018雙11大促中,阿里如何打破存儲與計算之間的技術壁壘,從而實現(xiàn)無需搬動數(shù)據(jù)即可靈活彈性擴容的技術突破。

一、2017年我們做了什么?

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

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

二、2018技術突破

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

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

2018年,為了使得在存儲計算分離下數(shù)據(jù)庫的I/O達到最高性能和吞吐,我們自研了用戶態(tài)集群文件系統(tǒng)DADI DBFS。我們通過將技術沉淀到DADI DBFS用戶態(tài)集群文件上,賦能集團數(shù)據(jù)庫交易全單元規(guī)?;鎯τ嬎惴蛛x。那么成為存儲中臺級產(chǎn)品,DBFS又做了那些技術上的創(chuàng)新呢?

2.1 用戶態(tài)技術

2.1.1 “ZERO” copy

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

過去使用kernel態(tài)時,會有兩次數(shù)據(jù)copy,一次由業(yè)務的用戶態(tài)進程copy數(shù)據(jù)到核內(nèi),一次由核內(nèi)copy到用戶態(tài)網(wǎng)絡轉發(fā)進程。這兩次copy會影響整體吞吐和時延。

切到純用戶態(tài)之后,我們使用polling模型進行I/O request請求的發(fā)送。另外對于polling mode下CPU的消耗,我們使用了adaptive sleep技術,使得空閑時,不會浪費core資源。

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

2.1.2 RDMA

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

2.2 Page cache

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

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

  • 基于touch count進行page的冷熱端遷移

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

  • page size可配置,結合數(shù)據(jù)庫頁進行最優(yōu)化配置

  • 多shard,提高并發(fā);總體容量可配置

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

2.3 異步I/O

為了提高數(shù)據(jù)庫的I/O吞吐能力,大部分數(shù)據(jù)庫都使用了異步I/O。我們?yōu)榱思嫒萆蠈訑?shù)據(jù)庫的I/O特性,實現(xiàn)了異步I/O。異步I/O特性:

  • 無鎖隊列實現(xiàn)

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

  • polling adaptive,減少CPU消耗


干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

2.4 原子寫

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

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

2.5 Online Resize

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

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

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


干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

2.6 TCP與RDMA互切

RDMA在集團數(shù)據(jù)庫大規(guī)模的引入使用也是一個非常大的風險點,DBFS與盤古一起實現(xiàn)了RDMA與TCP互切的功能,并在全鏈路過程中進行了互換演練,使得RDMA的風險在可控的范圍內(nèi),穩(wěn)定性保障更加完善。

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

2.7 2018年大促部署

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

三、存儲中臺利器DBFS

除了以上做為文件系統(tǒng)必須實現(xiàn)的功能以外,DBFS還實現(xiàn)了諸多的特性,使得業(yè)務使用DBFS更加的通用化,更加易用性,更加穩(wěn)定以及安全。

3.1 技術沉淀與賦能

我們將所有的技術創(chuàng)新和功能以產(chǎn)品的形式沉淀在DBFS中,使得DBFS能夠賦能更多的業(yè)務實現(xiàn)以用戶態(tài)的形式訪問不同的底層存儲介質(zhì),賦能更多數(shù)據(jù)庫實現(xiàn)存儲計算分離。

3.1.1 POSIX兼容

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

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

// glibc interface

FILE *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實現(xiàn)

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

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

3.1.3 服務化能力

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

shmQ基于無鎖實現(xiàn),性能和吞吐表現(xiàn)優(yōu)異,從目前測試來看,在16K等數(shù)據(jù)庫大頁下能控制在幾個us以內(nèi)的訪問時延。服務化以及多進程架構的支持,目前性能與穩(wěn)定性符合預期。

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

3.1.4 集群文件系統(tǒng)

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

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

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

  • 業(yè)務監(jiān)控指標探測發(fā)現(xiàn)M 節(jié)點出現(xiàn)無法訪問或者異常的時候,進行決策,是否要進行切換。

  • 如果發(fā)生切換,由管控平臺發(fā)起切換命令,切換命令完成,代表DBFS和上層數(shù)據(jù)庫都已經(jīng)完成角色切換。

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

DBFS在多點寫入時,對所有節(jié)點進行全局的metalock控制,blockgroup allocation優(yōu)化等。另外也會涉及到基于disk的quorum算法等,內(nèi)容比較復雜,暫不做詳細陳述。

3.2 軟硬件結合

隨著新存儲介質(zhì)的出現(xiàn),數(shù)據(jù)庫勢必需要借其發(fā)揮更好的性能或者更低成本優(yōu)化,并且做到對底層存儲介質(zhì)的自主可控。

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

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

3.2.1 持久化file cache

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

  • 穩(wěn)定可靠的故障處理

  • 支持動態(tài)enable和disable

  • 支持負載均衡

  • 支持性能指標采集和展示

  • 支持數(shù)據(jù)正確性scrub

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

以下為file cache的架構圖:

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

以下是測試所得讀寫性能收益數(shù)據(jù):

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

干貨 | 阿里如何將“高峰前擴容、高峰后縮容”的夢想照進現(xiàn)實?

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

3.2.2 Open Channel SSD

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

四、總結與展望

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

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

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI