云時(shí)代的來臨導(dǎo)致很多同學(xué)不在那么關(guān)心基礎(chǔ)硬件的選型上面了,很慶幸的玩過了各種磁盤介質(zhì),1w 轉(zhuǎn)企業(yè)級(jí) STAT * 8 Raid 10 「BBU、內(nèi)置閃存」到 SSD 到 Pcie SSD,也算見證了在不優(yōu)化任何代碼的前提下,我們用磁盤抗住了一波波的進(jìn)攻?!冈茣r(shí)代對(duì)應(yīng)的是啥,升配啊。。?!?/p>
機(jī)械硬盤
看圖就能看出這個(gè)就是一個(gè)完全拼轉(zhuǎn)速,拼多碟的冬冬,可以提高的空間也能想象要么盤更多,要么提高單次磁頭旋轉(zhuǎn)的效率 「傳統(tǒng)優(yōu)化數(shù)據(jù)庫所有很多系統(tǒng)批量操作,隨機(jī)轉(zhuǎn)順序很大程度上面是存儲(chǔ)介質(zhì)的限制了太多的想象。」,為了提高存儲(chǔ)的可用性,自然而然的出現(xiàn)了 Raid 卡這樣一個(gè)東西,raid卡通過多盤綁定 raid0、raid10、raid6 等實(shí)現(xiàn)了性能與安全性的平衡,raid 并非上了就高枕無憂了,需要考慮 BBU 充放電的情況,此時(shí)基本上就無法利用raid卡本身的cache 「這個(gè)也是可以監(jiān)控的」,所以后來出現(xiàn)了直接在 raid 卡上面放一個(gè)小閃存的東西?!付嗄昵霸跍y試 MySQL 的時(shí)候還發(fā)現(xiàn)了當(dāng)STAT * 8 Raid 10,基本上就已經(jīng)到達(dá)Raid卡的瓶頸了,而且之后在高性能 MySQL 一書中作者也提高了這個(gè)情況」

SSD
第一次接觸這個(gè)東西,也是在公司 DB 到達(dá)瓶頸,又不想拆的情況下,我們直接上了一批 SSD 接著么什么 Slow Query 不存在的。
SSD 全稱 Solid State Disk,就是大家平時(shí)提到的固態(tài)硬盤,是一種完全由電子元器件組成的持久化存儲(chǔ)設(shè)備,這是和傳統(tǒng)機(jī)械硬盤(Hard Disk Drive,簡稱 HDD)的重要區(qū)別。SSD 和機(jī)械硬盤相比,有著更高的 IOPS,更高的帶寬,更低的訪問 latency,還兼容目前主流的 HDD 接口,比如 SATA SAS 等?,F(xiàn)在市場上的 SSD 主要都是基于 NAND Flash 的。
? ? SSD 主要組件
? ? 1. 控制器芯片
? ? 2. NAND 芯片
? ? 3. 電容,掉電保護(hù),保證數(shù)據(jù)安全性
? ? 4. DRAM,緩存元數(shù)據(jù)
? ? 5. 對(duì)外接口,圖中是 SATA 接口
? ? 6. NOR Flash,引導(dǎo) SSD

? ? NAND 芯片
? ? NAND 是存儲(chǔ)最終數(shù)據(jù)的介質(zhì),NAND 實(shí)際上是一種 EEPOM(加電可擦除可編程 ROM),最基本的組成單位稱作 cell,而 cell是一種類似 MOSFET(金屬-氧化層 半導(dǎo)體場效晶體管)的電子元件。主要的部分是 ControlGate(控制閘,簡稱 CG)和 Floating Gate(浮動(dòng)閘,簡稱 FG)。CG 的作用就是通過加不同電壓來對(duì) FG 進(jìn)行充放電,改變 cell 存儲(chǔ)的 bit FG是一個(gè)與周圍絕緣的氧化物層,電子可以在 FG 里長久保存而不會(huì)輕易泄露,這也是 NAND存儲(chǔ)數(shù)據(jù)非易失的原因。

? ? 上圖也介紹了針對(duì) cell 的三種操作,分別是讀操作 寫操作和擦除操作,先假設(shè)每個(gè) cell 只 存儲(chǔ)一個(gè) bit
? ? ? ? 讀操作,在 CG 上加 5V 的電壓,然后根據(jù)讀到電壓值去判斷這個(gè) cell 存儲(chǔ)的 是 0 還是 1
? ? ? ? 寫操作,在 CG 上加 20V 電壓,電子被 FG 捕獲,相當(dāng)于一個(gè)充電過程。一般 寫之后還會(huì)進(jìn)行讀校驗(yàn),判斷寫入是否成功,正常寫入完應(yīng)該是 0
? ? ? ? 擦除操作,加電壓的方向和寫操作正好是相反的,作用也是相反的,相當(dāng)于對(duì) FG 的一個(gè)放電過程,擦除完成 cell 代表的是 1

? ? Cell 組成 Page,Page 組成 Block,Block 組成 Plane,Plane 組成 Die,多個(gè) Die 最終封裝成我 們之前看到的 NAND 芯片。從上面組成中我們重點(diǎn)分析一下 Page 和 Block。Page 主要由兩部分組成,Main 和 OOB 兩部分,Main 主要是存儲(chǔ)實(shí)際寫的數(shù)據(jù),而 OOB 主要存儲(chǔ)一些元數(shù)據(jù)信息和 ECC 信息,Page 在出廠時(shí)一般是 0xFF,也就是全部擦出過一遍。 Block 是由一組 Page 來組成。并且還有很重要的一點(diǎn)就是,Page 是 SSD 最小的讀寫單位,而 Block 是最小的擦除單位,這 就造成了所謂的寫入放大問題(Write Amplification)。SSD 按照 Block 去擦除,這樣做的原因一 方面是由于底層電路設(shè)計(jì)限制,另一方面原因是為了 SSD 本身壽命和響應(yīng)時(shí)間考慮。
? ? Garbage collection
? ? ? ? 垃圾回收指的是回收已經(jīng)失效的數(shù)據(jù)頁,當(dāng)然最終回收的時(shí)候還是以 block 為單位的。為什么 SSD 需要垃圾回收,而傳統(tǒng)硬盤不需要呢。主要有兩點(diǎn)原因構(gòu)成:不支持 In Place Update 和擦除單位最小是 block。我們先引入一個(gè)概念 Write amplification 「寫入放大」

上面的公式右邊被稱為寫入放大因子,公式是放大因子計(jì)算方法。寫入放大的原因也是我們之前提到的 SSD 不支持?jǐn)?shù)據(jù)覆蓋寫。從 SSD 寫入原理來看,寫入放大因子一般是大于 1 的,目前企業(yè)級(jí) SSD 的寫入放大因子一般都在 1.1 左右。

? ? 1.首先在數(shù)據(jù)塊 X 的四個(gè)可 用頁里寫入 A-D 現(xiàn)在垃圾回收一般都是在后臺(tái)去執(zhí)行,垃圾回收對(duì) 讀寫影響還是會(huì)比較大的,所以要控制好這個(gè)速度,既要保證當(dāng)前可用空閑塊比 例,也要保證盡可能不要影響 寫入能力。 提到垃圾回收,還涉及到另外 兩個(gè)概念:
? ? 1) Trim
? ? ? ? Trim 是一個(gè) ATA 指令。由操作系統(tǒng)發(fā)送給 SSD 主控制器,告訴它哪些數(shù)據(jù)占的地址是“無效”的,避免不必要的垃圾回收遷移數(shù)據(jù)。
? ? 2) Over-provisioning
? ? ? ? OP 簡單來說就是預(yù)留空間,SSD 出廠時(shí)候一般都有預(yù)留,出廠 OP 空間比例在 10%左右,用戶也可以自己預(yù)留 OP。OP 可以用于磨損調(diào)度和垃圾回收,OP 空 間越大,性能越好越穩(wěn)定,壽命越久,寫入放大比例越低。上面的 Trim 和 OP 都是對(duì)垃圾回收效率和提高壽命有好處的?!溉绻枰^高性能、建議越大越好 個(gè)人建議 20%」
? ? 2.在數(shù)據(jù)塊 X 寫入 E-H,然后 對(duì) A-D 進(jìn)行更新,然后把新 數(shù)據(jù)寫入到 A’-D’,A-D 標(biāo)記 為無效
? ? 3.為了使 A-D 數(shù)據(jù)頁可用, 就只能把 E-H 和 A‘-D’復(fù)制到 數(shù)據(jù)塊 Y,然后擦除數(shù)據(jù)塊 X
? ? Bad Block Management(壞塊管理)和 ECC
? ? ? ? 關(guān)于壞塊管理,同樣可以監(jiān)控也必須要監(jiān)控,先說一下壞塊的來源,第一是出廠時(shí)候有一定的壞塊比例,這個(gè)比例 MLC 一般控制在 5%,SLC 一般控制在 2%。第二是隨著讀寫次數(shù)增加,導(dǎo)致 cell電子泄漏,無法修復(fù)就變成壞塊??刂破鲿?huì)維護(hù)一張壞塊表,記錄哪些數(shù)據(jù)塊是不可用的。ECC 算法是保證 SSD 數(shù)據(jù)可靠性和壽命的一個(gè)非常重要的特性。尤其在 NAND 制程越來越低的情況下,cell 之間的距離越來越小,讀寫都有可能造成對(duì)鄰近 cell 的狀態(tài)變化。
個(gè)人總結(jié)
? ? 目前企業(yè)級(jí) SSD 主要是兩種類型,分別是 SATA SSD 和 Pcie SSD,建議在核心實(shí)例上面「前提自建IDC」直接考慮Pcie SSD「自帶Raid 5」,在高吞吐量的分布式數(shù)據(jù)庫中,自帶緩存層或者冷熱數(shù)據(jù)分離功能的數(shù)據(jù)庫,直接將類似數(shù)據(jù)丟到 SSD 中去,提高瞬時(shí)抗壓能力,提高穩(wěn)定性?!钙鋵?shí) STAT SSD 和 Pcie SSD 最最底層的閃存顆粒是一樣的,只是在接口、與內(nèi)置調(diào)度器算法上面有巨大的差異」。很多數(shù)據(jù)庫廠商與硬件廠商已經(jīng)在各種嘗試軟硬結(jié)合的解決方案了,在計(jì)算存儲(chǔ)分離的趨勢(shì)下,其實(shí)可以將大量的計(jì)算操作下沉到最最底層的硬件服務(wù)器上面去執(zhí)行,來幫助計(jì)算節(jié)點(diǎn)提高效率,同樣在云上面的大量架構(gòu)都是類似的邏輯,沒有絕對(duì)的計(jì)算存儲(chǔ)分離都是相對(duì)的、是互助的。重復(fù)利用基礎(chǔ)軟件設(shè)計(jì) & 底層硬件的優(yōu)勢(shì)發(fā)揮最大的效能「是不是也是一種提高效率的表現(xiàn)」。
感謝 微博 zolker 的分享 「漫談SSD原理與應(yīng)用實(shí)踐」,借鑒學(xué)習(xí)了很多。