我們使用的計(jì)算機(jī)的全稱叫電子計(jì)算機(jī),前面有電子兩個(gè)字央拖,這說(shuō)的是整個(gè)計(jì)算機(jī)中的核心元器件基本上都是電子單元組成的祭阀。但機(jī)械硬盤(pán)卻是一個(gè)特殊的例外,它更多是用機(jī)械技術(shù)做出來(lái)的一個(gè)產(chǎn)品鲜戒。當(dāng)把帶有機(jī)械技術(shù)基因的磁盤(pán)搭到計(jì)算機(jī)专控,尤其是再應(yīng)用到服務(wù)器領(lǐng)域的時(shí)候,暴露出了機(jī)械技術(shù)的兩個(gè)嚴(yán)重問(wèn)題:
- 第一遏餐,速度慢伦腐。 如果把內(nèi)存和CPU的速度比作汽車和飛機(jī)的話,這個(gè)大哥毫秒級(jí)別的延遲幾乎就是牛車級(jí)別的失都。
- 第二柏蘑,容易壞。 經(jīng)常聽(tīng)說(shuō)誰(shuí)誰(shuí)的磁盤(pán)壞了粹庞,很少有聽(tīng)說(shuō)過(guò)誰(shuí)的內(nèi)存條咳焚,CPU壞了。筆者就有在讀研期間實(shí)驗(yàn)室里正在拷貝資料信粮,突然一個(gè)斷電直接廢了一塊硬盤(pán)的經(jīng)歷黔攒。
要想保證服務(wù)器運(yùn)轉(zhuǎn)的穩(wěn)定和高速,就必須解決硬盤(pán)從娘胎里帶出來(lái)的這兩個(gè)缺陷。
多硬盤(pán)連接
問(wèn)題簡(jiǎn)單明了督惰,我們要解決速度慢不傅、容易壞兩個(gè)問(wèn)題。很自然赏胚,單兵作戰(zhàn)不行访娶,那我們就想到往上懟一個(gè)班,多塊硬盤(pán)一起上觉阅。但問(wèn)題是崖疤,假如給你N塊硬盤(pán),讓你來(lái)出一個(gè)技術(shù)方案典勇,你會(huì)怎么設(shè)計(jì)呢劫哼?
第一個(gè)方案就是,把一個(gè)文件分成N片割笙,每一片都散列在不同的硬盤(pán)上权烧。這樣當(dāng)文件進(jìn)行讀取的時(shí)候,就可以N塊硬盤(pán)一起來(lái)工作伤溉,從而達(dá)到讀取速度提高到N倍的效果般码,這就是RAID 0。
不過(guò)這個(gè)方案沒(méi)有解決容易壞的問(wèn)題乱顾,任何一塊硬盤(pán)壞了都會(huì)導(dǎo)致存儲(chǔ)系統(tǒng)故障板祝。
第二個(gè)方案就是,仍然把文件分片走净,但是所有的分片都存在一塊硬盤(pán)上券时,其它的硬盤(pán)只存拷貝。 這既提高了硬盤(pán)的訪問(wèn)速度温技,也解決了壞的問(wèn)題革为。任意一塊硬盤(pán)壞了,存儲(chǔ)系統(tǒng)都可以正常使用舵鳞,只不過(guò)速度會(huì)打一點(diǎn)折扣。
不過(guò)這個(gè)方案又帶來(lái)了新的問(wèn)題琢蛤,那就是實(shí)現(xiàn)成本有點(diǎn)高了蜓堕。假如我們用256G硬盤(pán)想實(shí)現(xiàn)512G的存儲(chǔ)容量的話,最少得需要4塊硬盤(pán)才能實(shí)現(xiàn)博其。
有沒(méi)有折中一點(diǎn)的方案呢套才?有,而且很多慕淡。我們這里只說(shuō)下最常見(jiàn)的raid5
RAID 5同樣要對(duì)文件進(jìn)行分片背伴,但是不對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行備份,而是會(huì)再單獨(dú)存一個(gè)校驗(yàn)數(shù)據(jù)片。
假如文件分為A1 A2 A3傻寂,然后需要再存一個(gè)校驗(yàn)片到別的磁盤(pán)上息尺。這樣不管A1,A2還是A3那一片丟失了疾掰,都可以根據(jù)另外兩片和校驗(yàn)片合成出來(lái)搂誉。 既保證了數(shù)據(jù)的安全性,又只用了一塊磁盤(pán)做冗余存儲(chǔ)静檬。
假如我們有8塊256GB的硬盤(pán)炭懊,那么RAID5方案下的磁盤(pán)陣列從用戶角度來(lái)看可用的存儲(chǔ)空間是7*256GB,只“浪費(fèi)”了一塊盤(pán)的空間拂檩,所以目前RAID5應(yīng)用比較廣泛~~
Raid卡緩存
硬盤(pán)延遲是毫秒級(jí)別的侮腹,即使是多快硬盤(pán)并行,也只能提升數(shù)倍而已稻励,不能夠達(dá)到量級(jí)的提升凯旋。和CPU內(nèi)存的納秒級(jí)別工作頻率比起來(lái),還是太慢了钉迷。
在計(jì)算機(jī)界至非,沒(méi)有緩存解決不了的速度問(wèn)題,如果有糠聪,那就再加一層』耐郑現(xiàn)代磁盤(pán)本身也基本都帶了緩存,另外在一些比較新的raid卡里舰蟆,硬件開(kāi)發(fā)者們又搞出來(lái)了一層“內(nèi)存”趣惠,并且還自己附帶一塊電池,這就是RAID卡緩存身害。 我們看下幾款主流RAID卡的配置:
- PERC S120 入門(mén)軟件陣列卡味悄,主板集成無(wú)緩存 支持RAID0 1
- PERC H330 入門(mén)硬件RAID卡,無(wú)板載緩存, 支持RAID 0 1 5 10 50
- PERC H730 主流硬件RAID卡帶有1G緩存和電池 支持RAID 0 1 5 6 10 50 60
- PERC H730P 高性能硬件RAID卡帶有2G緩存和電池 支持RAID 0 1 5 6 10 50 60
- PERC H830 同H730P,沒(méi)有內(nèi)置接口塌鸯,使用外置接口連接附加存儲(chǔ)磁盤(pán)柜用
拿目前服務(wù)器端出鏡率比較高的H730和H730P來(lái)看侍瑟,他們分別帶了1G和2G的緩存卡,并且自帶電池丙猬。 電池的作用就是當(dāng)發(fā)現(xiàn)主機(jī)意外斷電的時(shí)候涨颜,能夠快速把緩存中的數(shù)據(jù)寫(xiě)回到磁盤(pán)中去。對(duì)于寫(xiě)入茧球,一般操作系統(tǒng)寫(xiě)到這個(gè)RAID卡里就完事了庭瑰,所以速度快。對(duì)于讀取也是抢埋,只要緩存里有弹灭,就不會(huì)透?jìng)鞯酱疟P(pán)的機(jī)械軸上督暂。
另外想再補(bǔ)充說(shuō)一點(diǎn)的就是文件相關(guān)函數(shù)里設(shè)置DIRECT I/O僅僅只能繞開(kāi)操作系統(tǒng)本身的Page Cache,而RAID卡里的緩存,對(duì)于Linux來(lái)說(shuō)穷吮,可以說(shuō)算是一個(gè)黑盒逻翁。換句話說(shuō),就是操作系統(tǒng)并不清楚RAID卡是從緩存里吐的數(shù)據(jù)酒来,還是真正從硬盤(pán)里讀的卢未。
動(dòng)手查看你的RAID配置
了解了raid基本原理以后,我們可以實(shí)際動(dòng)手查看一下機(jī)器上的raid情況堰汉。這里拿我手頭的一臺(tái)服務(wù)器舉例辽社。
通過(guò)cat /proc/scsi/scsi
,我們可以查看到raid卡的型號(hào)
Host: scsi10 Channel: 02 Id: 01 Lun: 00
Vendor: DELL Model: PERC H730 Mini Rev: 4.27
Type: Direct-Access ANSI SCSI revision: 05
可以看到我的這臺(tái)服務(wù)器raid卡使用的是PERC H730翘鸭, 這塊RAID卡帶有1G緩存和電池滴铅。
再看我們的硬盤(pán)陣列
# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL
Virtual Drive: 1 (Target Id: 1)
Name :
RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3
Size : 1.633 TB
Sector Size : 512
Is VD emulated : No
Parity Size : 278.875 GB
State : Optimal
Strip Size : 128 KB
Number Of Drives : 7
Span Depth : 1
RAID Level列標(biāo)明的就是當(dāng)前RAID組的RAIN級(jí)別。對(duì)照下面
- RAID 1: Primary-1, Secondary-0, RAID Level Qualifier-0 RAID 1
- RAID 0: Primary-0, Secondary-0, RAID Level Qualifier-0 RAID 0
- RAID 5: Primary-5, Secondary-0, RAID Level Qualifier-3 RAID 5
- RAID 10: Primary-1, Secondary-3, RAID Level Qualifier-0 RAID 10
可以看到就乓,本機(jī)RAID Level是RAID5汉匙。
另外Strip Size
叫做條帶大小,我機(jī)器上的配置是128KB生蚁。假如有一個(gè)512KB的文件噩翠,它就會(huì)被分成4個(gè)條帶,每個(gè)128KB邦投。這些條帶可能會(huì)分散在不同的磁盤(pán)上伤锚,如果一次性讀取的話,多個(gè)硬盤(pán)就可以一起轉(zhuǎn)動(dòng)機(jī)械軸志衣,讀取速度就會(huì)提高到原來(lái)的數(shù)倍屯援。不過(guò)要說(shuō)明的是,如果文件小于這個(gè)條帶大小念脯,小于128K狞洋,那么RAID下的多塊硬盤(pán)對(duì)于該文件的讀取耗時(shí)也不會(huì)有幫助。
繼續(xù)查看組成RAID的所有的磁盤(pán)的狀況
#/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL
......
Drive's position: DiskGroup: 1, Span: 0, Arm: 0
Device Id: 1
...
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]
Sector Size: 512
Logical Sector Size: 512
Physical Sector Size: 512
Inquiry Data: SEAGATE ST300MM0008 TT31S42310JR
...
...
...
Drive's position: DiskGroup: 1, Span: 0, Arm: 6
Device Id: 7
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]
看到屬于DiskGroup 1的總共有7塊硬盤(pán)绿店,每塊的大小都是278GB左右吉懊。6塊盤(pán)的總?cè)萘看笮【褪?.6T左右,確實(shí)是只“浪費(fèi)”了一塊硬盤(pán)的容量來(lái)保障數(shù)據(jù)的安全性惯吕!
另外Inquiry Data
也顯示了硬盤(pán)的制造商惕它,已經(jīng)型號(hào)。這些磁盤(pán)都是希捷的300G的機(jī)械硬盤(pán)废登,經(jīng)Google查詢其轉(zhuǎn)速為1萬(wàn)轉(zhuǎn)每分鐘。
本文小節(jié)
機(jī)械技術(shù)和電子技術(shù)比較起來(lái)郁惜,穩(wěn)定性要差很多堡距。所以機(jī)械背景出身的硬盤(pán)既慢又容易壞甲锡。為了解決這個(gè)問(wèn)題,RAID技術(shù)應(yīng)運(yùn)而生羽戒。通過(guò)一定的冗余原始存儲(chǔ)或者校驗(yàn)數(shù)據(jù)提供安全性的保障缤沦,通過(guò)增加帶電子基因的緩存,合理調(diào)度多塊磁盤(pán)的機(jī)械軸易稠,提高了磁盤(pán)IO的讀寫(xiě)速度缸废。在Linux下可以通過(guò)MegaCli工具來(lái)查看你的RAID組情況,強(qiáng)烈你建議實(shí)際動(dòng)手查看一下驶社!
歡迎搜索微信公眾號(hào):開(kāi)發(fā)內(nèi)功修煉