閃存存儲(chǔ)當(dāng)前越來越多的應(yīng)用于企業(yè)級(jí)環(huán)境,特別是提升數(shù)據(jù)庫性能方面。本次分享主要介紹閃存的特性,閃存的劣勢(shì)及其解決機(jī)制,以及采用閃存存儲(chǔ)時(shí)數(shù)據(jù)庫的一些優(yōu)化思路。
目錄
閃存的特性
閃存的劣勢(shì)及其解決機(jī)制
數(shù)據(jù)庫場(chǎng)景測(cè)試
一.閃存的特性
凡是采用Flash Memory的存儲(chǔ)設(shè)備,可以統(tǒng)稱為閃存存儲(chǔ)。我們經(jīng)常談的固態(tài)硬盤(SSD),可以由volatile/non-volatile memory構(gòu)成,其實(shí)固態(tài)硬盤的范疇是大于閃存的,只是當(dāng)前的固態(tài)硬盤大多數(shù)采用閃存介質(zhì),所以很多時(shí)候我們默認(rèn)固態(tài)硬盤就是閃存盤。
除了閃存以外,還有其它多種快速存儲(chǔ)技術(shù),如DRAM ,NVRAM, MRAM and Spin-Torque(自旋力矩磁阻式隨機(jī)存取內(nèi)存), Carbon Nanotube( 碳納米管 ), Phase Change Memory(相變內(nèi)存),Memristor ( 憶阻器 )等等。
未來存儲(chǔ)設(shè)備的創(chuàng)新其實(shí)就是存儲(chǔ)材料的創(chuàng)新,這也是國外很多初創(chuàng)的半導(dǎo)體公司一個(gè)研發(fā)的方向。
從半導(dǎo)體的角度來看,閃存屬于非易失性存儲(chǔ),但是屬于不可靠介質(zhì)。因?yàn)殚W存是采用電子驅(qū)動(dòng),因此具有電子元器件所固有的缺陷,電子泄露,衰減等等。
決定閃存存儲(chǔ)大規(guī)模應(yīng)用的主要因素是量產(chǎn)規(guī)模、穩(wěn)定性以及經(jīng)濟(jì)性。
閃存設(shè)備隨著使用時(shí)間和數(shù)據(jù)量的增長(zhǎng),壞塊會(huì)逐漸增加,會(huì)產(chǎn)生大量的ECC Error,這時(shí)設(shè)備性能和可靠性會(huì)大幅度下降,對(duì)應(yīng)用性能和數(shù)據(jù)安全帶來影響。閃存產(chǎn)品在使用過程中往往會(huì)存在性能衰減和可靠性下降的問題。這里提醒一下,如果我們使用閃存產(chǎn)品,一定要使用工具監(jiān)控閃存產(chǎn)品的健康狀態(tài),防止老化,數(shù)據(jù)丟失。
通過對(duì)閃存產(chǎn)品的良好設(shè)計(jì)和質(zhì)量控制,也可以避免性能衰減和可靠性下降的問題,但是往往會(huì)帶來成本的增加和性能的下降(相比于直寫閃存)。
對(duì)于企業(yè)級(jí)應(yīng)用而言,穩(wěn)定是第一位,其次是易用性,第三才是性能。閃存設(shè)備的性能相比于應(yīng)用的需要是足夠的。
閃存在企業(yè)級(jí)以及數(shù)據(jù)中心的應(yīng)用,實(shí)際上也是依賴于互聯(lián)網(wǎng)以及大數(shù)據(jù)的興起。
互聯(lián)網(wǎng)的分布式架構(gòu)以及多副本保護(hù)機(jī)制,消除了集中式存儲(chǔ)的瓶頸,滿足了海量用戶以及應(yīng)用的請(qǐng)求,帶來了更高的性能需求。同時(shí)多副本的保護(hù)機(jī)制,又解決了閃存作為不可靠介質(zhì)可能帶來的數(shù)據(jù)存儲(chǔ)安全的問題。
但是由于閃存的可靠性問題,其實(shí)互聯(lián)網(wǎng)客戶也是有選擇地在特定業(yè)務(wù)上使用閃存,并不是在所有業(yè)務(wù)上都使用閃存設(shè)備。
有的時(shí)候我們還會(huì)發(fā)現(xiàn)意外斷電后,閃存設(shè)備故障,這往往是由于電路保護(hù)機(jī)制不完善或固件bug造成的。
二. 閃存的劣勢(shì)及其解決機(jī)制
在使用閃存設(shè)備的時(shí)候,我們需要考慮的問題要比使用磁盤多。
當(dāng)前我們碰到的很多問題是,相比于IOPS,閃存比磁盤性能高上幾十甚至上百倍,但是我們將數(shù)據(jù)放置到閃存上,性能提升并沒有這么高,甚至沒有提高。
原因是閃存主要解決的是IO性能問題,并且主要隨機(jī)寫的性能,而順序讀寫性能并不如多塊磁盤匯聚之后的性能。
Linux文件系統(tǒng)
以Linux為例,Linux ext4屬于日志型文件系統(tǒng),為了保護(hù)數(shù)據(jù)安全,通過Journal機(jī)制提供一致性保護(hù)。那么我們?cè)诓渴疬^程中可以將Journal日志放置到閃存上,可以提升IO性能。因?yàn)閼?yīng)用的IO操作還是通過OS層面完成的,因此OS層面的IO性能提升也可以帶來應(yīng)用性能提升。
另外,操作系統(tǒng)以及應(yīng)用的IO層往往是針對(duì)磁盤的特性進(jìn)行了優(yōu)化,這些優(yōu)化往往不適用于閃存設(shè)備,甚至還有副作用。例如OS層面IO scheduler有三種模式,CFQ、Deadline和noop,其中前兩種模式是針對(duì)磁盤低IO特性和物理尋道機(jī)制進(jìn)行優(yōu)化的,例如做IO合并、尋道算法等等,會(huì)有默認(rèn)的等待嚴(yán)實(shí)以等到更多的IO block進(jìn)行合并和處理。對(duì)于閃存而言,是不存在尋道處理的,因此前兩種處理機(jī)制反而會(huì)造成延時(shí)增加。如果我們?cè)谙到y(tǒng)中使用了SSD,需要將IO scheduler調(diào)整為noop模式。
三. 數(shù)據(jù)庫場(chǎng)景測(cè)試
剛才談到為了保證數(shù)據(jù)安全,我們需要在Linux采用Journal模式,但是MySQL也有double write的機(jī)制,我們需要怎么既保證數(shù)據(jù)安全,又不會(huì)增加過多的機(jī)制造成性能下降。我們?cè)谖覀兊拈W存產(chǎn)品上做了這方面的測(cè)試。
上面是mySQL的寫入機(jī)制。當(dāng)系統(tǒng)意外斷電時(shí),數(shù)據(jù)庫16K的頁面可能沒有完成,就會(huì)出現(xiàn)partial write,而partial write會(huì)造成數(shù)據(jù)庫損壞。
MySQL 的Double write就是為了解決partial write造成的問題,但是DW也會(huì)帶來兩個(gè)問題,性能懲罰和對(duì)SSD的磨損增加。
我們按照上面的場(chǎng)景在我們的閃存卡上進(jìn)行了測(cè)試。
在安全性層面,只要Metadata Journal+DW或Metadata Journal+Data Journal,都可以保護(hù)數(shù)據(jù)庫數(shù)據(jù)的安全,也就是意外掉電數(shù)據(jù)不會(huì)損壞,數(shù)據(jù)庫可以正常啟動(dòng),數(shù)據(jù)不丟失。
但是在CPU bound的情況下,前個(gè)組合的性能衰減(8%)要小于后面的保護(hù)組合(10%)。如果是在IO bound的情況下,前個(gè)組合的性能衰減(10%)要小于后面的保護(hù)組合(34%)。但是DW下的數(shù)據(jù)寫入量會(huì)比后者增加23%,也就是會(huì)增加SSD的磨損。這個(gè)是我們?cè)趹?yīng)用時(shí)需要注意的。
另外,我們?cè)谧鯠B2的測(cè)試時(shí)也發(fā)現(xiàn)幾個(gè)問題:
閃存存儲(chǔ)在非分區(qū)表的簡(jiǎn)單的查詢統(tǒng)計(jì)條件的查詢方面具有明顯的優(yōu)勢(shì)和性能提升,性能提升3到4倍,但是在分區(qū)表的統(tǒng)計(jì)和加限制條件的查詢方面的性能提升并不明顯。而且對(duì)相應(yīng)的復(fù)雜的存儲(chǔ)過程的統(tǒng)計(jì)計(jì)算未能體現(xiàn)出優(yōu)勢(shì)。這可能是由于分區(qū)表設(shè)計(jì)機(jī)制主要是面向磁盤性能優(yōu)化,在閃存上反而有負(fù)面影響。
另外我們?cè)贠racle數(shù)據(jù)庫上應(yīng)用閃存測(cè)試時(shí)發(fā)現(xiàn),帶子查詢的多表關(guān)聯(lián)查詢語句的存儲(chǔ)過程的調(diào)用性能表現(xiàn)很差,查看AWR發(fā)現(xiàn)大量的cache latch,出現(xiàn)長(zhǎng)時(shí)間等待, 而在磁盤存儲(chǔ)上沒有這種情況。我們分析是由于閃存的性能比磁盤高很多,造成cursor數(shù)據(jù)量大,緩存內(nèi)的latch沖突增加。通過增大share pool和將復(fù)雜查詢處理簡(jiǎn)化為多個(gè)小查詢處理可以解決這個(gè)問題,性能也得到明顯提升。
Q & A
Q1 : 請(qǐng)問閃存和磁盤的比較中MTBF是什么意思?
A1:MTBF(Mean Time Before Failure),失敗前平均工作時(shí)間。閃存其實(shí)是沒有MTBF的概念的,因?yàn)殚W存有擦寫次數(shù)的限制,數(shù)據(jù)擦寫到一定數(shù)量后,閃存介質(zhì)就會(huì)物理性地?fù)p壞,閃存的壽命是可以通過監(jiān)控使用狀況推算出來的。而磁盤的損壞其實(shí)是概率,會(huì)有MTBF指標(biāo)。
Q2 : 請(qǐng)問在測(cè)試db2的時(shí)候,是dpf環(huán)境,還是單機(jī)?
A2:?jiǎn)螜C(jī)。
Q3:mysql是基于xfs測(cè)試的嗎?
A3:Mysql測(cè)試時(shí)是基于ext4的。
Q4:閃存產(chǎn)品有沒有不同的系列,類似傳統(tǒng)的高中低端存儲(chǔ)那樣的分類?
A4:閃存也分高中低的,用于企業(yè)級(jí)高性能的一般以PCIe NVMe卡的形式為主。其實(shí)閃存產(chǎn)品的質(zhì)量標(biāo)準(zhǔn)還有很多細(xì)分,這里就不細(xì)說了。
Q5:請(qǐng)問能談?wù)凷pacex用的閃存產(chǎn)品嗎?
A5:SpaceX用的是我們嵌入式閃存產(chǎn)品,和我們企業(yè)級(jí)閃存采用同樣的技術(shù)架構(gòu)和閃存顆粒。主要用于控制代碼存儲(chǔ)和運(yùn)行狀態(tài)數(shù)據(jù)存儲(chǔ)。
Q6:請(qǐng)問您有測(cè)過云主機(jī)的ssd 嗎?
A6 : 云主機(jī)的SSD基本上都采用SATA SSD,當(dāng)前云計(jì)算平臺(tái)在數(shù)據(jù)庫應(yīng)用方面還是個(gè)弱項(xiàng)。我們下一步計(jì)劃在ceph分布式存儲(chǔ)上進(jìn)行數(shù)據(jù)庫測(cè)試,這也是嘗試在云計(jì)算平臺(tái)上運(yùn)行關(guān)鍵數(shù)據(jù)庫應(yīng)用。
Q7:寫放大,和抖動(dòng)的問題現(xiàn)在已經(jīng)改善了很多吧?
A7 :寫放大和抖動(dòng)問題是考驗(yàn)閃存廠商的一個(gè)關(guān)鍵指標(biāo),在產(chǎn)品設(shè)計(jì)的時(shí)候就要考慮。各家處理的方式都不一樣。我們能做到最大的WAF是6。而在性能抖動(dòng)方面自認(rèn)為處理最好的是我們的產(chǎn)品,因?yàn)樾阅芏秳?dòng)主要是由垃圾回收處理和磨損平衡處理引起的。而我們采用的分區(qū)擦除算法和三重磨損平衡算法是完全基于對(duì)閃存顆粒底層的特性了解和經(jīng)驗(yàn)積累。另外SSD還有一個(gè)很大的問題是性能衰減。使用1,2年后,性能可能只有原來的一半或者更低,性能波動(dòng)也會(huì)頻繁出現(xiàn)。