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