自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

海量數(shù)據(jù)存儲(chǔ)之新存儲(chǔ)設(shè)備性能優(yōu)化

開發(fā) 后端
本文主要講述NoSQL在Flash設(shè)備上的可以選擇的其中一種優(yōu)化策略,并粗略提了一下SSD設(shè)備的特性。

本文主要講述NoSQL在Flash設(shè)備上的可以選擇的其中一種優(yōu)化策略,并粗略提了一下SSD設(shè)備的特性。

對(duì)Flash設(shè)備的性能優(yōu)化,微軟曾經(jīng)做過(guò)一份paper,但是里面很多東西比較局限:比如paper中將SSD作為了寫入的buffer,而眾所周知,寫性能不會(huì)是任何一款NoSQL的瓶頸;比如SSD的索引采用了Hash的數(shù)據(jù)結(jié)構(gòu),這樣在進(jìn)行cache evict的時(shí)候,粒度的控制也很有問(wèn)題。本文對(duì)其進(jìn)行了改進(jìn),羅列如下:

Features of SSD

SSD對(duì)于傳統(tǒng)硬盤的優(yōu)勢(shì)在于它沒(méi)有機(jī)械裝置,介質(zhì)也由磁介質(zhì)變?yōu)榱穗娊橘|(zhì),因此它具備直接按地址讀取數(shù)據(jù)的能力,沒(méi)有了尋道時(shí)間,這也是為什么SSD的IOPS可以達(dá)到數(shù)萬(wàn)的原因。

而SSD的寫操作比較特殊,其最小寫入單元是4K,當(dāng)寫入空白位置的時(shí)候可以直接寫入,但是當(dāng)需要改寫某個(gè)單元時(shí),則需要一個(gè)額外的擦出操作,擦除的操作一般是128個(gè)page,每個(gè)擦出的單元稱為一個(gè)塊。

Wear Leveling

因?yàn)镾SD的存儲(chǔ)單元壽命有限,因此,當(dāng)某個(gè)特定的部位被頻繁擦寫,不僅會(huì)造成性能問(wèn)題,而且使得SSD壽命大幅降低,所以SSD做了Wear Leveling,即損耗均衡算法。這樣,當(dāng)需要改寫某個(gè)page時(shí),并不寫入原有位置,而是讀取現(xiàn)有塊,合并需要改寫的數(shù)據(jù),然后一起寫入新的空閑塊,原有的塊被標(biāo)記為invalid,等待被擦除回收。這樣做的好處在于,一是不會(huì)反復(fù)擦寫同一個(gè)block,二是寫入的速度會(huì)比較快(省略了擦除的動(dòng)作)。

Write amplification

因?yàn)镾SD的erase-before-write的特性,所以就出現(xiàn)了一個(gè)寫入放大的概念,比如你想改寫4K的數(shù)據(jù),必須首先將整個(gè)擦除塊(512KB)中的數(shù)據(jù)讀出到緩存中,改寫后,將整個(gè)塊一起寫入,這時(shí)你實(shí)際寫入了512KB的數(shù)據(jù),寫入放大系數(shù)是128。寫入放大最好的情況是1,就是不存在放大的情況。

Conclustion

綜合SSD的特性,我們需要做到以下兩點(diǎn)來(lái)合理使用SSD并且提高其使用壽命:

1. 盡量避免隨機(jī)寫。由于損害均衡算法的存在,隨機(jī)寫特定page將造成寫入放大。

2. 避免每次寫入過(guò)少的數(shù)據(jù)。如果每次寫入的數(shù)據(jù)不足SSD的一個(gè)page大,那么當(dāng)前寫入的數(shù)據(jù)將導(dǎo)致該page有浪費(fèi),并且接下來(lái)對(duì)該文件邏輯上的append將導(dǎo)致,之前寫的不足一個(gè)page的數(shù)據(jù)被讀取出來(lái),并合并到新的page中去。

3. 不要使用完全部的空間。SSD的損耗均衡算法雖然一定程度上減少了對(duì)特定部位的頻繁擦寫,但是如果空間不夠,這個(gè)還是很難避免,因此,最好預(yù)留至少50%的空間。

可以看到,不得不說(shuō),絕大部分的NoSQL產(chǎn)品都做到了上述兩個(gè)特性。因此,在新型存儲(chǔ)設(shè)備上的嘗試將是NoSQL時(shí)代的主題。

SSD as Level2 Cache

雖然當(dāng)前SSD相比內(nèi)存便宜了很多,但目前SSD每存儲(chǔ)單元在價(jià)格上仍然比普通硬盤要貴很多,因此,在這個(gè)過(guò)渡時(shí)期,普遍的想法是把SSD當(dāng)做二級(jí)Cache。像Flashcache這樣利用Linux Device Mapper,將SSD等設(shè)備當(dāng)做Write Back block cache。關(guān)于其詳細(xì)介紹,這里就不多說(shuō)了,可以去https://github.com/facebook/flashcache 看看官方的介紹。這里講述另外一種可能比較簡(jiǎn)單易實(shí)現(xiàn)的方式。

根據(jù)上面描述的SSD的性能特點(diǎn),可以采用下面的設(shè)計(jì):

 

 

上圖是邏輯上的結(jié)構(gòu),物理的實(shí)現(xiàn)已經(jīng)把很多東西都合并了,比如讀cache和寫buffer,以及SSD的索引B-tree,都可以進(jìn)行合并成為一顆B-tree(Berkeley Db的方式),另外,我需要強(qiáng)調(diào)的一點(diǎn)是,這里的SSD索引使用了B-Tree,相比于Hash是為了提供更粗粒度的SSD Cache失效機(jī)制,這一點(diǎn)的原因在上面的SSD特性中已經(jīng)講過(guò)了,下面講述get以及set操作的流程。

Get

首先,邏輯上先查詢內(nèi)存中的Read Cache,如果不存在,則查詢Write Buffer,然后是SSD Cache的B-Tree Index,然后是Bloom Filter確認(rèn)key的確在硬盤存在,最后查詢到硬盤。

Set

插入的時(shí)候,先寫到write buffer里面,當(dāng)buffer到達(dá)一個(gè)臨界值的時(shí)候?qū)⑵渌⒌絊SD上,當(dāng)SSD到達(dá)一個(gè)臨界值的時(shí)候,將其踢出并移到硬盤,當(dāng)然整個(gè)過(guò)程Bloom Filter也要保持一致。

Delete

刪除操作首先檢查內(nèi)存中的各buffer和cache有沒(méi)有該值,如果有,直接在內(nèi)存中刪除其父節(jié)點(diǎn)對(duì)它的引用,隨后直接返回;如果沒(méi)有,那么先查看Bloom Filter是否該key存在,如果存在則去硬盤上刪掉。

這里需要強(qiáng)調(diào)的是,刪除操作只是一個(gè)標(biāo)記刪除,物理文件上的刪除會(huì)有后臺(tái)線程定時(shí)掃描,這樣能夠保證每次SSD的擦除操作能更加有效。

Evict strategy

既然SSD做為了二級(jí)Cache,那么其必然存在一個(gè)evict操作,evict操作的憑據(jù)是每個(gè)節(jié)點(diǎn)的generation,generation會(huì)在每次節(jié)點(diǎn)被訪問(wèn)的時(shí)候+1,這里的+1是一個(gè)全局的+1,即整顆樹維護(hù)一個(gè)long型的generation,A節(jié)點(diǎn)被訪問(wèn)一次則其generation為1,那么過(guò)一會(huì)B節(jié)點(diǎn)被訪問(wèn)那么generation為2,以此類推。

Evict的時(shí)候?qū)⑤^小的generation的節(jié)點(diǎn)刪除,將其踢到硬盤,這里需要注意,這里的節(jié)點(diǎn)我指的是非頁(yè)節(jié)點(diǎn),因此,一般情況下,每次evict至少有默認(rèn)128個(gè)葉節(jié)點(diǎn)被踢出,即使這128個(gè)節(jié)點(diǎn)物理上的位置不連續(xù),由于我們有后臺(tái)的clean線程(參加海量數(shù)據(jù)存儲(chǔ)之Key-value存儲(chǔ)簡(jiǎn)介的過(guò)期數(shù)據(jù)清理一章)的參與,因此,我們總能保證,每次SSD的擦除操作都是連續(xù)并且是大塊的。

最后,很顯然,這樣的設(shè)計(jì)L1 Cache、L2 Cache以及Disk組成了一套完整的數(shù)據(jù),因此,在掉電的時(shí)候,SSD的cache無(wú)需失效,當(dāng)然,前提是由于我們的系統(tǒng)有Write-ahead-log保證了內(nèi)存中的數(shù)據(jù)掉電不丟失。

References

http://www.hellodba.net/2010/10/ssd-database-2.html

http://research.microsoft.com/apps/pubs/default.aspx?id=131572

【編輯推薦】

  1. 面向海量服務(wù)的設(shè)計(jì)原則和策略總結(jié)
  2. 每天50TB 淘寶海量數(shù)據(jù)輕松漫游記
  3. 程序員必須養(yǎng)成良好的代碼習(xí)慣
  4. 數(shù)據(jù)庫(kù)中海量文件的批量轉(zhuǎn)移方法
  5. 海量監(jiān)控的現(xiàn)狀及發(fā)展趨勢(shì)研究
責(zé)任編輯:金賀 來(lái)源: JavaEye博客
相關(guān)推薦

2011-04-28 09:36:22

海量數(shù)據(jù)存儲(chǔ)

2019-08-27 15:00:09

MySQL數(shù)據(jù)庫(kù)存儲(chǔ)

2018-01-31 08:44:20

數(shù)據(jù)存儲(chǔ)存儲(chǔ)設(shè)備存儲(chǔ)系統(tǒng)

2018-01-02 20:00:28

數(shù)據(jù)庫(kù)MySQL分布式存儲(chǔ)

2016-11-23 15:13:06

數(shù)據(jù)存儲(chǔ)評(píng)價(jià)系統(tǒng)京東

2020-05-28 16:28:34

華為OceanStor存儲(chǔ)

2017-12-15 09:05:55

對(duì)象存儲(chǔ)塊存儲(chǔ)文件存儲(chǔ)

2015-07-09 13:19:17

Ceph分布式存儲(chǔ)性能調(diào)優(yōu)

2022-09-22 16:21:29

宏杉科技

2017-02-23 10:27:59

2024-10-16 10:35:52

2012-06-13 09:35:41

存儲(chǔ)虛擬化

2017-08-14 09:05:50

SIOC存儲(chǔ)負(fù)載

2012-06-06 09:03:24

曙光存儲(chǔ)大數(shù)據(jù)

2015-07-22 11:03:25

網(wǎng)絡(luò)存儲(chǔ)海量數(shù)據(jù)

2012-06-21 10:35:01

2013-05-14 13:37:46

華為UDS存儲(chǔ)系統(tǒng)

2018-04-27 09:03:57

Redis數(shù)據(jù)存儲(chǔ)

2011-05-31 17:32:32

Android SharedPref
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)