大話存儲系列之月光寶盒(塊存儲)
塊存儲設(shè)備
互聯(lián)網(wǎng)越來越發(fā)達(dá),網(wǎng)速越來越快(管制也越來越嚴(yán)),很多事情都可以通過聯(lián)網(wǎng)解決。很多存儲行業(yè)商家也get到了這個點。下圖是個極簡的模型,商家存儲設(shè)備(黑盒子),用戶一個筆記本電腦,通過TCP/IP承載的iSCSI協(xié)議,對于Linux用戶,可以看到一個塊設(shè)備/dev/sdax,就像使用本地硬盤(如/dev/sda)一樣,可以對其進行分區(qū),格式化為文件系統(tǒng),亦或直接裸設(shè)備讀寫。
對于用戶,這就夠了,著實方便,付錢就行。
對于一個有追求的碼農(nóng),我們是有必要看看這個黑盒子里面是什么。下圖是黑盒子里面的東西,再次強調(diào),包括本文之前或之后的插圖及描述,都是十分宏觀的。篇幅有限不能說的太細(xì),符合本文主旨;另外,說的太細(xì)就會和具體商家產(chǎn)品很像,咱不能那么干。
圖9 塊存儲設(shè)備
拋開硬件、驅(qū)動、OS等,直接看軟件邏輯,首先將系統(tǒng)上的硬盤組成多個RAID,如何組,組成哪種RAID,哪幾塊盤組成RAID等等,這些都是可以通過管理員配置。有人問了(對,還是前面問問題的那個人):“就一個RAID行不行?”
可以,但是有風(fēng)險,如果一個盤出現(xiàn)故障,RAID就暫時不能提供服務(wù)了,整個系統(tǒng)所有用戶會受到影響。如果組成多個RAID,那么,僅僅有故障盤的RAID暫時無法服務(wù),其它RAID是可以繼續(xù)工作,不至于影響所有用戶。套用某相聲表演藝人的話說,用戶就是衣食父母。
繼續(xù)看圖,軟件對下要管理RAID,對上要為用戶提供服務(wù),它給用戶提供的是LUN(全稱是Logical Unit Number,也就是邏輯單元號),當(dāng)然啦,用戶(人)不必去理解什么是LUN,就如上面所說,頂多是一個/dev/sdax,LUN是軟件、協(xié)議層面的東西。怎么理解呢?每個LUN關(guān)聯(lián)了一組物理存儲資源,你擁有了這個LUN,就擁有了這組物理存儲資源,凡是使用物理存儲資源,需要提供你的LUN ID。有過編程經(jīng)驗的人很容易理解,十分類似一個文件或socket句柄??蛻舳耍ㄟ@里不使用用戶這個詞,這里偏只程序)對LUN的讀寫,至少需要提供”LUN ID+R/W+Offset+Length[+data]”這些信息。
為什么需要LUN,而不是把RAID直接“丟給”用戶?
圖10 塊存儲設(shè)備內(nèi)部
因為每個用戶的需求是不一樣。
碼農(nóng)李二狗,全部身家800G代碼,做開發(fā)的時候谷歌一下然后復(fù)制粘貼來的。某宅男,擁有海量高清大片,4TB+不在話下。按照圖10,我們可以給李二狗分配LUN 1,給某宅男分配LUN 2。軟件邏輯層負(fù)責(zé)做映射,事實上,一個LUN可以映射到多個RAID,多個LUN也可以映射到一個RAID上(不常用,因為RAID故障影響多個用戶),用戶數(shù)據(jù)都會準(zhǔn)確的保存到屬于該LUN的物理存儲資源中,不會出現(xiàn)張冠李戴的情況。當(dāng)用戶需求改變的時候,如李二狗也開始收集高清大片了,需要的空間就大了,那么可以將LUN1資源進行擴充,十分靈活。***,LUN的大小和該LUN所映射的物理存儲資源大小以及用戶查看/dev/sdax的大小是一致的。
帶文件系統(tǒng)的存儲設(shè)備
其實在大多數(shù)場景,用戶都是將設(shè)備格式化成某個文件系統(tǒng)使用。那么設(shè)備廠商就對用戶說:“我有一個辦法,你們可以不用自己格式化,我直接提供一個文件系統(tǒng),直接mount就行了,NFS,簡單吧?!?/p>
“好??!好啊!”
“不過,得加錢?!?/p>
“……”
商業(yè)上的事我們先不管,看下圖。用戶交好錢,被告知一個地址,直接mount到本地,確實方便。
圖11 帶文件系統(tǒng)的存儲設(shè)備
這回,黑盒子里面又是什么東西呢?
圖12 帶文件系統(tǒng)的存儲設(shè)備
看圖之后,是不是和我一樣的感覺?MMP奸商。 就多了一個文件系統(tǒng)層,內(nèi)部格式化LUN,然后就多收了不少錢。
如果你以為只有這些就錯了!
我們假設(shè),你付費買了1TB的空間,服務(wù)商是沒有真的給你預(yù)留1TB物理存儲資源的,當(dāng)你用的時候,再去申請物理存儲資源。你很憤憤,就存滿1TB,此時你以為真的消耗服務(wù)商1TB物理存儲資源了?不見得!有可能只消耗了0.8TB甚至更少。
拋開商業(yè)成見,但從技術(shù)角度來看,這里有兩個技術(shù)需要提到壓縮 和 去重,這在文件系統(tǒng)層面很容易做到。
壓縮(Compress)
您可能知道,文件系統(tǒng)在進行IO時候是以一定大小數(shù)據(jù)塊(block)為單位進行的,以4KB為例。壓縮也是以這個數(shù)據(jù)塊為單位,在寫入磁盤之前進行壓縮,原本4KB的數(shù)據(jù),壓縮之后可能就變成2KB,多個壓縮之后的數(shù)據(jù)塊再次拼成4KB,然后保存到物理磁盤。這個操作,節(jié)省了物理資源。用戶讀數(shù)據(jù)的時候,如果是壓縮的,需要首先解壓縮,然后返回給用戶。壓縮、解壓縮操作是純算法的,主要消耗CPU資源,因此在系統(tǒng)負(fù)載很高的時候,不建議啟用壓縮機制。另外,數(shù)據(jù)是否壓縮,需要額外的元數(shù)據(jù)(metadata)記錄,這增加了系統(tǒng)復(fù)雜度。有的設(shè)備會將壓縮、解壓縮操作交給硬件去完成,減少CPU的消耗。
去重(Deduplicate)
上傳一個大的高清影片到網(wǎng)盤,秒傳,遇到過吧?這說明服務(wù)商存儲系統(tǒng)存在了一個和你一模一樣的文件,你遇到了一個志同道合的宅友。為了節(jié)省空間,系統(tǒng)就僅僅給你做個標(biāo)記(或類似一個軟鏈接),然后增加文件的引用計數(shù),免得別人刪除了影響到你。這個還是從文件層面的去重,也十分容易理解。我們做個極端假設(shè),如果兩個1G大小的文件,僅僅有一個字節(jié)不同,按照上面方式是不能做到去重的,還是得上傳。文件的一部分一樣就不能進行去重了嗎?
答案是有。數(shù)據(jù)塊(block)級別的去重。
圖13 數(shù)據(jù)塊級別去重
我們看圖13說話。最初,硬盤神馬都沒有,文件1數(shù)據(jù)全部寫入硬盤,這沒什么好說的。然后,文件2,其中BEF三個塊,硬盤已經(jīng)存在,不必寫入了,剩下的塊需要寫入。***再看文件3,前面3個塊,XYZ不存在于硬盤中,需要寫。后面的XY就不必寫了,***的E也是不必寫。
去重技術(shù)確實節(jié)約物理存儲資源,但也存在一些問題。
比如:如何確定當(dāng)前要寫的塊硬盤中已經(jīng)存在?
不可能去硬盤中逐一比較!
一個做法是將早期寫入的塊進行HASH計算,將HASH值以及塊信息保存到內(nèi)存中,作為Cache,新預(yù)寫的塊計算HASH值,如果HASH值在Cache中存在,則取出Cache中塊信息,做去重操作,記錄信息。內(nèi)存有限,Cache不能足夠大到保存所有硬盤中的塊信息,因此去重是有限度的,另外Cache的更新也是一個技術(shù)要點,何種Cache更新算法能夠得到好的去重效率是一個值得深入研究的話題。
好了,以上簡要介紹了兩種存儲設(shè)備。接下來……
有人問了(對,依舊是前面問問題的那個人):
“我替碼農(nóng)李二狗他父親王老爺子問個問題,是軟件就有BUG,如果你這軟件崩潰了,是不是所有用戶都不能正常訪問了?”
“沒錯!”
“弱爆了吧?”
在前面RAID的描述中,可以體會到一個詞“冗余”,冗余起到保險、保護作用。既然說軟件存在缺陷,可能掛,那么就放兩份在那,兩個物理獨立的設(shè)備運行同樣的軟件,互為主備。主用設(shè)備工作時備用設(shè)備待命,主備共享系統(tǒng)中RAID、LUN等配置及狀態(tài),主用設(shè)備掛了,備用設(shè)備上。用戶無感知。這類方案在很多領(lǐng)域(如通信設(shè)備)也是常見的。
圖14 主備備份
“看起來有用,你這主備設(shè)備都放在哪里?”
“服務(wù)商機房或數(shù)據(jù)中心?!?/p>
“如果數(shù)據(jù)中心著火了或其它情況,這些設(shè)備就不能提供服務(wù)了吧?”
“沒錯!”
“弱爆了吧?”
數(shù)據(jù)中心可是個有網(wǎng)、有電、有空調(diào),有外賣宅男向往的好地方,是具備基本的防火、防盜(防師兄?)等防災(zāi)害的地方,但凡事預(yù)則立不預(yù)則廢,萬一出現(xiàn)差錯可就是大事了。
其實數(shù)據(jù)中心也有“備份”。一般在同城的其它地方,也會有一個數(shù)據(jù)中心,用于備份當(dāng)前數(shù)據(jù)中心的數(shù)據(jù),同城較近拉光纖,備份效率杠杠的,甚至是實時備份。
圖15 數(shù)據(jù)中心
“如果城市發(fā)生較大地震,兩個數(shù)據(jù)中心都損毀了,數(shù)據(jù)就丟了吧?”
“沒錯!”
“弱爆了吧?”
兩地三中心。即生產(chǎn)數(shù)據(jù)中心、同城災(zāi)備中心、異地災(zāi)備中心建設(shè)方案。兩個城市的三個數(shù)據(jù)中心互聯(lián),如果一個數(shù)據(jù)中心發(fā)生故障或災(zāi)難,其他數(shù)據(jù)中心可以正常運行并對核心業(yè)務(wù)或全部業(yè)務(wù)實現(xiàn)接管。
圖16 兩地三中心
“那如果兩個城市都……”
“你稍等,我打個電話?!?/p>
喂,代罵公司嗎?這是我的個人資產(chǎn)證明,幫我罵個人,罵道我破產(chǎn)。
……
天下無不散宴席。本次分享就到此結(jié)束了,還是那句話,能力有限水平一般,蜻蜓點水的啰嗦了這些,萬一有那么一句半句勾起了您的興趣,我就十分欣慰。
注:我們尊重對知識刨根問底的精神,以上代罵公司有關(guān)說辭純屬扯淡。
尾聲
“你可嚇壞我了,在看Linuxer公眾號的文章呢,向大牛們學(xué)習(xí)學(xué)習(xí),我一直覺得技術(shù)沒啥長進,內(nèi)心挺虛的。”
“看你體格應(yīng)該不只是心虛吧?確實,這些文章質(zhì)量都很高,值得學(xué)習(xí),除了那篇《大話存儲》有點打醬油。在說,學(xué)習(xí)沒必要偷偷摸摸的吧?”
“習(xí)慣了,沒辦法,看感興趣的東西就這樣。”
“我只能呵呵了。我關(guān)注的主播要上線了,先走了,這個移動硬盤放這借你用用?!?/p>
“里面是什么?”
“當(dāng)然也是你感興趣的東西——你懂的”。