2018年12月12日,2018中國(guó)存儲(chǔ)與數(shù)據(jù)峰會(huì)的閃存存儲(chǔ)與應(yīng)用論壇上,阿里巴巴資深技術(shù)專家石超介紹了阿里巴巴在分布式存儲(chǔ)方面的技術(shù)積累,一方面服務(wù)于阿里巴巴自己的電商業(yè)務(wù),一方面以阿里云的方式向外界提供服務(wù)。
阿里巴巴做存儲(chǔ)可能跟其他公司不太一樣,我們真的做了一個(gè)存儲(chǔ)平臺(tái),把各個(gè)業(yè)務(wù)統(tǒng)一起來,然后用同一套系統(tǒng)去支持這個(gè)業(yè)務(wù)。十年前我們開始做這個(gè)系統(tǒng),隨后在2010年、2011年我們基于盤古系統(tǒng)發(fā)布了公有云的產(chǎn)品,像大數(shù)據(jù)的ODPS、ECS,還有我們的對(duì)象存儲(chǔ)OSS服務(wù)。
在2013年有一個(gè)關(guān)鍵事件——阿里巴巴的飛天5K項(xiàng)目落成。同一時(shí)代在阿里內(nèi)部還有其他的存儲(chǔ)系統(tǒng)在用,還有云梯1和云梯2系統(tǒng),2013年把這兩個(gè)系統(tǒng)合并了,這是離線大數(shù)據(jù)上的標(biāo)志性事件。2016年,盤古2.0項(xiàng)目啟動(dòng)等等。
阿里巴巴可能和其他做云產(chǎn)品的公司不一樣,對(duì)于我們來說,我們做這些新的技術(shù),并不是讓大家去做小白鼠,阿里巴巴自己內(nèi)部關(guān)鍵的電商業(yè)務(wù)也是跑在同一套系統(tǒng)上。
比如電商交易的核心系統(tǒng),比如雙11和雙12,大家在淘寶上下單,淘寶的數(shù)據(jù)庫、消息界面系統(tǒng),都是由同一套系統(tǒng)來支撐的。我們的主力云產(chǎn)品包括ECS和OSS的存儲(chǔ),也都是在我們的系統(tǒng)上。對(duì)于統(tǒng)一存儲(chǔ),我覺得有幾個(gè)關(guān)鍵的業(yè)務(wù)特點(diǎn):
第一,我們的規(guī)模非常大,應(yīng)該說阿里集團(tuán)大部分的數(shù)據(jù)都在這個(gè)系統(tǒng)上。
第二,我們支持了非常核心的系統(tǒng),內(nèi)部系統(tǒng)會(huì)和外部系統(tǒng)業(yè)務(wù)稍微有一些區(qū)別。
一方面,比如我們的業(yè)務(wù)系統(tǒng)的分布式架構(gòu)做的很好,因?yàn)樗鎸?duì)雙11的沖擊,所以,要求系統(tǒng)能夠在短時(shí)間內(nèi)承受非常高的流量沖擊,需要你的系統(tǒng)有非常好的彈性。
一方面,云產(chǎn)品又稍微有點(diǎn)不一樣,云產(chǎn)品面對(duì)的是很多架構(gòu)上沒有那么好的公司,比如創(chuàng)業(yè)公司,他們的架構(gòu)比較簡(jiǎn)單,但是對(duì)我們單個(gè)存儲(chǔ)或者單個(gè)OSS的可用性要求非常高,所以這兩個(gè)需求又有點(diǎn)不一樣。
同時(shí)受到這兩方面的驅(qū)動(dòng),我們做統(tǒng)一的存儲(chǔ),用統(tǒng)一的技術(shù)服務(wù)這兩種類型的應(yīng)用。
為什么我們?nèi)ビ梅植际酱鎯?chǔ)解決這些問題?
我講一個(gè)實(shí)踐例子,講一個(gè)今年我們用存儲(chǔ)技術(shù)支持雙11大促的例子。
上圖,今年雙11零點(diǎn)高峰期,數(shù)據(jù)庫對(duì)于分布式存儲(chǔ)的讀寫的圖,我們可以看到零點(diǎn)是一個(gè)標(biāo)志,到了0點(diǎn)之后流量開始上來了,到了0點(diǎn)30分流量開始下跌,是和之前差不多的情況。
所以,電商面臨這樣一個(gè)場(chǎng)景,我們到底要準(zhǔn)備多少臺(tái)機(jī)器去撐這個(gè)高峰,如果我們準(zhǔn)備了很多機(jī)器去滿足這個(gè)流量,那么這個(gè)流量只持續(xù)個(gè)把小時(shí),那么這就是一種浪費(fèi)。
所以,阿里在這兩三年一直在做一個(gè)叫做混部的技術(shù),具體來說我們有很多應(yīng)用服務(wù)器是跑在線的業(yè)務(wù),有另一些應(yīng)用服務(wù)器跑離線的業(yè)務(wù)。一般公司的做法都是在線業(yè)務(wù)比如數(shù)據(jù)庫、Web服務(wù)器都是延時(shí)敏感的業(yè)務(wù),不能和離線業(yè)務(wù)放在一起。但是在阿里來說,面對(duì)電商雙11我們需要一個(gè)非常有彈性的系統(tǒng),這兩年為了應(yīng)對(duì)雙11,我們能夠把離線業(yè)務(wù)的機(jī)器讓出來,讓它去跑在線應(yīng)用,等雙11這個(gè)高峰過去之后在線的應(yīng)用可以縮回來,讓離線的業(yè)務(wù)利用在線的機(jī)器完成自己的工程。
這樣一件事有很多挑戰(zhàn),對(duì)于存儲(chǔ)來說意味著什么?挑戰(zhàn)在哪里?
我覺得有兩點(diǎn):一個(gè)是在線應(yīng)用和離線應(yīng)用對(duì)于存儲(chǔ)要求完全不一樣。在線應(yīng)用現(xiàn)在SSD可以做到幾十微秒的延遲,離線應(yīng)用只要吞吐大、容量大就好。
有一些應(yīng)用是沒有狀態(tài)的,比如跑一個(gè)Web服務(wù)器,它在本地存儲(chǔ)的數(shù)據(jù)就是它的程序文件,運(yùn)行時(shí)它可能有一些文件緩存,程序運(yùn)行起來可能會(huì)打日志,這些東西都是當(dāng)程序從一個(gè)機(jī)器遷到另一臺(tái)機(jī)器做擴(kuò)展時(shí)可以丟掉的,是可以重新從遠(yuǎn)程拉起來的。
另一些程序是有狀態(tài)的,比如說數(shù)據(jù)庫,數(shù)據(jù)庫在本地有它的數(shù)據(jù),消息隊(duì)列有它的數(shù)據(jù)文件,如果要做擴(kuò)展,你需要把這個(gè)數(shù)據(jù)遷移到另一臺(tái)機(jī)器,過程很耗時(shí),并且沒有什么彈性,你需要事先準(zhǔn)備很長(zhǎng)時(shí)間。這兩點(diǎn)使得我們?cè)谧龌觳繒r(shí),對(duì)存儲(chǔ)提出了很大挑戰(zhàn)。
怎么解決這個(gè)問題呢?
我們有一個(gè)概念叫做存儲(chǔ)和計(jì)算分離。老話說30年河西30年河?xùn)|,以前用企業(yè)存儲(chǔ)天然就是存儲(chǔ)和計(jì)算分離,現(xiàn)在我們又回到了這樣一個(gè)架構(gòu)。我們的在線服務(wù)器也不去寫本地的盤,單獨(dú)搭一個(gè)存儲(chǔ)的機(jī)器,把這些機(jī)器分成存儲(chǔ)和計(jì)算兩種,存儲(chǔ)專門放數(shù)據(jù),上面不跑業(yè)務(wù)。計(jì)算上面跑業(yè)務(wù),用計(jì)算節(jié)點(diǎn)的CPU資源、內(nèi)存,但是它不去寫本地的盤。這樣高峰到來,我們很輕松地把一些計(jì)算任務(wù)從一個(gè)計(jì)算的節(jié)點(diǎn)去彈性彈到離線的服務(wù)器上,峰值過去之后再縮回來。
有了存儲(chǔ)和計(jì)算分離后,數(shù)據(jù)就不用寫本地盤了,而是寫到遠(yuǎn)程分布式存儲(chǔ),這對(duì)于分布式存儲(chǔ)來說不太容易做到,但還好,隨著業(yè)界技術(shù)的進(jìn)步,我們有了高性能的網(wǎng)絡(luò)和閃存,分布式存儲(chǔ)在一些方面上做的并不比本地的盤差,甚至在某些方面做的更好。
具體在哪些地方比較好呢?
首先,可靠性來說,分布式存儲(chǔ)天然就在做機(jī)器之間的冗余,可以打造更好的可靠性。
從性能來說,我們用了一些比較新的技術(shù),用戶態(tài)的一些技術(shù),能夠使分布式存儲(chǔ)和本地的盤達(dá)到差不多的水平,同時(shí),因?yàn)榉植际酱鎯?chǔ)后臺(tái)是一個(gè)大的資源池,對(duì)于特定的應(yīng)用,比如說當(dāng)IO集中在一塊盤上或者幾塊盤上,小部分的盤的時(shí)候,可以利用更多的機(jī)器來完成這個(gè)。在這種場(chǎng)景下,會(huì)比本地的盤更好。
成本方面也有彈性,當(dāng)你去用本地盤的時(shí)候,你會(huì)面臨容量規(guī)劃的問題,可能1%的情況下,某個(gè)程序有問題把盤用滿了,可能會(huì)引起整個(gè)系統(tǒng)的崩潰。在分布式存儲(chǔ)的情況下,它是一個(gè)資源池,容量規(guī)劃的時(shí)候更簡(jiǎn)單。可以把不同用戶的盤,放在一個(gè)大的池子里,這樣一來,空閑的空間就會(huì)比較少。
我挑幾點(diǎn)詳細(xì)介紹一下。
第一點(diǎn),當(dāng)我們做大規(guī)模糾刪碼的實(shí)踐,在傳統(tǒng)存儲(chǔ)對(duì)應(yīng)的就是做Raid的糾刪碼,但是Raid給人的印象是,這個(gè)東西比較慢,恢復(fù)的比較慢,恢復(fù)的過程會(huì)有損等等。當(dāng)你把這個(gè)問題放在跨機(jī)器的集群很多事會(huì)變得比較好辦。我們可以跨機(jī)器去做糾刪碼,我們可以跨網(wǎng)絡(luò)交換機(jī)做糾刪碼,甚至跨可用區(qū)做糾刪碼。我們會(huì)找一個(gè)城市,找三個(gè)地方,在三個(gè)地方之間搭機(jī)房,用比較快的網(wǎng)絡(luò)??梢园岩徊糠?jǐn)?shù)據(jù)做糾刪碼,分在三個(gè)地方。
做糾刪碼的時(shí)候可以用更多的數(shù)據(jù)塊等等把這個(gè)做的更安全。我們線上基本采用的都是N+3,任何三塊盤死機(jī)我都不損失數(shù)據(jù)。同時(shí)因?yàn)槌刈幼兇罅?,所以,我們是在幾百、幾千臺(tái)機(jī)器的規(guī)模上去做糾刪碼。當(dāng)你一個(gè)節(jié)點(diǎn)死機(jī)的時(shí)候,我會(huì)有成百上千的機(jī)器做恢復(fù),所以,可以解決傳統(tǒng)陣列恢復(fù)時(shí)間慢、有損的問題。
下面講分布式存儲(chǔ)的可靠性給業(yè)務(wù)帶來什么。
我們知道,在阿里自己的業(yè)務(wù)和云不太一樣,阿里自己的電商業(yè)務(wù)本身就是分布式的,是一個(gè)多地域、分布式的很多小應(yīng)用組成的系統(tǒng)。為什么這個(gè)時(shí)候還需要做存儲(chǔ)的分布式?以數(shù)據(jù)庫為例,數(shù)據(jù)庫非常有代表性,很多人首先覺得做分布式數(shù)據(jù)庫很難,基于MySQL做存儲(chǔ)計(jì)算分離也不太容易。
阿里在很多年之前就開始了去IOE進(jìn)程,去IOE之后就走向了MySQL分庫、分表的架構(gòu)上。為什么做分庫分表?這因?yàn)镸ySQL單機(jī)的性能是受限的,隨著業(yè)務(wù)的增長(zhǎng)必須用多臺(tái)機(jī)器去做,與此同時(shí),為了解決單機(jī)的可靠性、可用性的問題,MySQL還去做主備,當(dāng)主死機(jī)以后可以馬上切備庫。同時(shí)在MySQL用本地盤的時(shí)候,還會(huì)給盤做Raid,進(jìn)一步增加盤的可靠性。轉(zhuǎn)到分布式存儲(chǔ)之后,其實(shí)它解決的是數(shù)據(jù)可靠性問題,但是并沒有解決業(yè)務(wù)的可用性問題。
在業(yè)務(wù)層和存儲(chǔ)層,大家各司其職去擴(kuò)展。存儲(chǔ)層專注于解決數(shù)據(jù)本身的高可靠、高可用問題。而MySQL應(yīng)用層,專注解決事物處理、擴(kuò)展一致性的問題。
通常認(rèn)為分布式存儲(chǔ)是要走網(wǎng)絡(luò),傳統(tǒng)本地存儲(chǔ)是直接用PCIe這樣的高速連接去連到存儲(chǔ),分布式存儲(chǔ)然的弱點(diǎn)就是接入網(wǎng)絡(luò),分布式存儲(chǔ)因?yàn)閿?shù)據(jù)要寫多份,要跨故障率去寫多份,網(wǎng)絡(luò)的鏈路就會(huì)更長(zhǎng)。
得益于現(xiàn)在用戶態(tài)技術(shù)的發(fā)展,前面雖然分布式存儲(chǔ)有很多好處,但是性能是一個(gè)硬的限制,一旦性能滿足不了要求,前面各種優(yōu)勢(shì),在業(yè)務(wù)方面都沒有體現(xiàn)。
具體來說,我們用用戶的軟件棧做的事情就是采用Run-to-Completion的線程模型,這個(gè)過程中單機(jī)內(nèi)部沒有線程切換,沒有鎖、沒有口,我們把這些東西都去掉了,能夠達(dá)到非常好的性能。
同時(shí)因?yàn)榉植际酱鎯?chǔ)自身的特點(diǎn),它是基于這些不穩(wěn)定的硬件搭建出一個(gè)穩(wěn)定的系統(tǒng)。
評(píng)論