美團云混合存儲系統(tǒng):成本及性能優(yōu)化路徑(美團云是什么意思)
前言
在過去60年間,機械硬盤的容量呈指數(shù)級增長的同時體積也越來越小。1956年IBM一塊 5兆的巨型硬盤需要數(shù)人推上車去運輸,到2016年一塊3.5寸的機械硬盤就有10TB的大小,60年增長了9個數(shù)量級。但與容量和體積的變化相比,機械硬盤的性能增長非常緩慢,吞吐率基本保持在200兆每秒上下。IOPS增長更慢,一塊7200轉(zhuǎn)的硬盤在不同的iodepth下的IOPS次數(shù)大概在100-200范圍內(nèi)。這是容量與性能上的失衡。
而另一方面,目前市場上固態(tài)硬盤和機械硬盤報價,單GB的成本可以相差10倍,巨大的差價就是巨大的優(yōu)化空間。
容量與性能、成本的失衡促使美團云存儲研發(fā)團隊開始推進混合存儲系統(tǒng)的研究。
設計混合存儲系統(tǒng)的意義
通常,根據(jù)成本和性能這兩個維度,我們可以將云硬盤分成3檔:
① 容量型云硬盤:成本比較低,性能也比較低的產(chǎn)品
② 效率型云硬盤:成本及性能適中的產(chǎn)品
③ 性能型云硬盤:性能比較高,價格也比較高
容量型 | 效率型 | 性能型 | |
IOPS | 數(shù)百 | 小幾千 | 兩萬 |
吞吐率(MB/s) | 數(shù)十 | 一百多 | 兩百多 |
延遲(ms) | <10 | <3 | <3 |
單價(元/GB/月) | 低 | 中 | 高 |
因為性價比適中,所以我們在云平臺上給用戶創(chuàng)建最多就是效率型的云硬盤。
我們不妨計算一下,如果要求云平臺為100個云硬盤同時提供4000并發(fā)IOPS能力的話,我需要準備一個什么樣的系統(tǒng)。有兩種實施方案:
第一種,如果用傳統(tǒng)的機械硬盤去搭建這個系統(tǒng),大致需要6千塊硬盤,產(chǎn)生48千瓦的功耗,3年TCO就會達到千萬元。
第二種,用單盤性能3萬(保守估計)IOPS的固態(tài)硬盤,則只需40塊,功耗是0.1千瓦,3年TCO只有20萬。
兩種方案同樣達到目標的情況下呈現(xiàn)出50倍的成本差距,固態(tài)硬盤性價比優(yōu)勢更明顯。
因此,當我們設計存儲系統(tǒng)的時候,性能和容量主要為滿足需求,當這需求確定了之后,就會有一個最優(yōu)成本方案。這也是我們設計混合存儲系統(tǒng)的一個主要思路。下面具體講一下如何通過對混合存儲系統(tǒng)進行成本優(yōu)化和性能優(yōu)化來實現(xiàn)這一想法。
混合存儲-成本優(yōu)化路徑
緩存優(yōu)化
在如何平衡需求與成本獲得最優(yōu)解的思考中,我們很自然地想到將機械硬盤的很多flash組合起來形成混合存儲,并讓每一塊flash都發(fā)揮出比較顯著的優(yōu)勢。那么如何優(yōu)化呢?
優(yōu)化的方式有以下兩種:
一種是RAID卡緩存,把閃存當作機械硬盤的混存。如果要是這樣混存的話,其實最簡單的就是在RAID卡上面有加一個小的閃存給做緩存;
另一種是內(nèi)核緩存,為內(nèi)核增加了一些模塊,如用flash給機械硬盤做緩存。
緩存的優(yōu)化方案有很高的性價比,加上去之后效果是立竿見影。但是有一些缺陷,優(yōu)化效果受限于緩存的命中率,對隨機讀測試無效,無法實現(xiàn)產(chǎn)品承諾。所以我們沒有放棄了這一方案。
糾刪碼
降低成本還有一種方式就是糾刪碼,傳統(tǒng)的分布式存儲一般是3塊數(shù)據(jù),每一塊數(shù)據(jù)分3個副本,一共要存12塊。換了糾刪碼的話,3塊數(shù)據(jù)通過數(shù)據(jù)運算產(chǎn)生兩個校驗塊,則是存6塊,達到空間下降一半的效果。
但是糾刪碼分布式存儲條件下,尤其是熱的分布式可讀可寫的情況下,實現(xiàn)糾刪碼是一個非常復雜的過程。而且它在寫作的時候?qū)π阅苁怯杏绊?,因為寫的時候有編碼,而編碼會對IO流程產(chǎn)生一些影響,會對性能產(chǎn)生負面效果。
所以我們嘗試了一些其他的方案。首先我們進行了一個性能測試,用不同的測試方式對SSD隨機寫的性能IOPS和機械硬盤順序?qū)懙腎OPS分別進行了測試。
測試結(jié)果顯示,機械硬盤隨機IO非常差,但是順序IO結(jié)果不錯,大致可以達到跟一塊SSD的水平。這一結(jié)果啟發(fā)了我們,可以在機械硬盤上用順序?qū)懙姆绞街匦聦憽?/p>
當客戶端要讀數(shù)據(jù)的時候,數(shù)據(jù)就直接從閃存里面去讀;當寫的時候,寫到閃存里,同時順序的寫到兩塊機械硬盤上面。這樣的話,讀是從固態(tài)硬盤讀,可以保證良好性能;寫的時候固態(tài)硬盤隨機寫性能也好,換了這方式以后整個系統(tǒng)的性能就實現(xiàn)了均衡。
前文提到在機械硬盤上是順序?qū)?,順序?qū)懹幸粋€問題,因為順序?qū)懴喈斢谂帕嘘犃?,讀的時候就需要知道到隊列的位置去讀。所以這種方式對讀很不利,我們還是要把專用的順序?qū)懙綄S脭?shù)據(jù),回寫到所謂數(shù)據(jù)塊里面。所以,這需要系統(tǒng)允許在比較閑置的時機,將數(shù)據(jù)回寫到Journal,保證這順序有高有低的。實測,線上workload存在明顯的波峰波谷現(xiàn)象,所以也證明了通過糾刪碼實現(xiàn)混合存儲這一方案實現(xiàn)成本優(yōu)化的可行性。
上述混合存儲的思路是基于美團云的塊存儲系統(tǒng)得以實現(xiàn)的,整個系統(tǒng)是美團云存儲團隊完全自主研發(fā)。關(guān)于該存儲系統(tǒng)的詳解,可點擊http://tech.meituan.com/block-store.html《分布式塊存儲系統(tǒng)Ursa的設計與實現(xiàn)》了解詳情。后續(xù)我們還將分享糾刪碼的相關(guān)內(nèi)容,請持續(xù)關(guān)注美團云官方微信的更新。
混合存儲-性能優(yōu)化路徑
固態(tài)硬盤的性能非常好,如果想要把固態(tài)硬盤性能發(fā)揮出來的話,需要在軟件上做很多的優(yōu)化。第一個方面是優(yōu)化代碼效率,第二是發(fā)覺利用并行性。
代碼效率
在代碼效率方面的優(yōu)化,有幾個方面:
-
避免使用Iostream
Stack vs new/delete
Resource poling&caching
Logging
SSE/AVX(CRC、EC)
避免使用Sendfile()
保持可維護性
上述幾種方式中,Sendfile有一個非常大的問題,它不支持異步文件讀取,這樣的話會影響服務端的并發(fā)處理,反而會降低性能,所以我們不建議用sendfile。還有iostream,我們注意到有些開源存儲系統(tǒng)在使用,雖然在IO提升方面可能是比較方便的方式,但是效率比較低,因此我們也不建議使用。
并行
在并行的方面,有四個優(yōu)化方向:
① 無關(guān)任務獨立并行執(zhí)行
在服務端把無關(guān)的每一個Disk都有一個或多個進程進行服務,客戶端每virtual disk 一個進程;
② 盤內(nèi)并行
使用異步API;
③ 任務流出:流水化處理
磁盤和網(wǎng)絡并行運行。
從這圖上可以看出來網(wǎng)絡的流水化對IOPS提升非常明顯。
④ 任務完成:亂序完成
慢請求不阻塞其他請求。
SubChunk
IOPS方面,機械硬盤吞吐率表現(xiàn)較差一些。所以我們會把機械硬盤上面做SubChunk來提高吞吐率。
確定優(yōu)化方案后,我們對該方案進行了一些性能評估。測試環(huán)境中我們用了三臺服務器,其中一臺服務器配了12塊SSD,另外配了12塊HDD。
-
在吞吐率方面我們的混合存儲方案性能可以跟SSD性能相差不大;
在IOPS方面可以說兩種方式基本上是沒有什么顯著區(qū)別的;
在延遲上,我們首先用了ping-4KB做測試,大概是一百多us的延遲,然后按照SSD ping-4KB、SSD-Hybrid、SSD3R分別去讀寫數(shù)據(jù)測延遲,SSD-Hybrid與SSD3R的延遲基本持平。這個延遲對于TCP網(wǎng)絡加以太網(wǎng)還是不錯的。
因此這一混合存儲方案從性能和成本是上能夠滿足產(chǎn)品需求的。性能上面還有一些潛力可挖,比如說用RDMA等,對此,我們今后還將持續(xù)優(yōu)化。