本文主要講述nosql在flash裝置上的可以選擇的其中一種優化策略,並粗略提了一下ssd裝置的特性。
對flash裝置的效能優化,微軟曾經做過乙份*****,但是裡面很多東西比較侷限:比如*****中將ssd作為了寫入的buffer,而眾所周知,寫效能不會是任何一款nosql的瓶頸;比如ssd的索引採用了hash的資料結構,這樣在進行cache evict的時候,粒度的控制也很有問題。本文對其進行了改進,羅列如下:
ssd對於傳統硬碟的優勢在於它沒有機械裝置,介質也由磁介質變為了電介質,因此它具備直接按位址讀取資料的能力,沒有了尋道時間,這也是為什麼ssd的iops可以達到數萬的原因。
而ssd的寫操作比較特殊,其最小寫入單元是4k,當寫入空白位置的時候可以直接寫入,但是當需要改寫某個單元時,則需要乙個額外的擦出操作,擦除的操作一般是128個page,每個擦出的單元稱為乙個塊。
因為ssd的儲存單元壽命有限,因此,當某個特定的部位被頻繁擦寫,不僅會造成效能問題,而且使得ssd壽命大幅降低,所以ssd做了wear leveling,即損耗均衡演算法。這樣,當需要改寫某個page時,並不寫入原有位置,而是讀取現有塊,合併需要改寫的資料,然後一起寫入新的空閒塊,原有的塊被標記為invalid,等待被擦除**。這樣做的好處在於,一是不會反覆擦寫同乙個block,二是寫入的速度會比較快(省略了擦除的動作)。
因為ssd的erase-before-write的特性,所以就出現了乙個寫入放大的概念,比如你想改寫4k的資料,必須首先將整個擦除塊(512kb)中的資料讀出到快取中,改寫後,將整個塊一起寫入,這時你實際寫入了512kb的資料,寫入放大係數是128。寫入放大最好的情況是1,就是不存在放大的情況。
綜合ssd的特性,我們需要做到以下兩點來合理使用ssd並且提高其使用壽命:
1.盡量避免隨機寫。由於損害均衡演算法的存在,隨機寫特定page將造成寫入放大。
2. 3.不要使用完全部的空間。ssd的損耗均衡演算法雖然一定程度上減少了對特定部位的頻繁擦寫,但是如果空間不夠,這個還是很難避免,因此,最好預留至少50%的空間。
可以看到,不得不說,絕大部分的nosql產品都做到了上述兩個特性。因此,在新型儲存裝置上的嘗試將是nosql時代的主題。
看看官方的介紹。這裡講述另外一種可能比較簡單易實現的方式。
根據上面描述的ssd的效能特點,可以採用下面的設計:
上圖是邏輯上的結構,物理的實現已經把很多東西都合併了,比如讀cache和寫buffer,以及ssd的索引b-tree,都可以進行合併成為一顆b-tree(berkeley db的方式),另外,我需要強調的一點是,這裡的ssd索引使用了b-tree,相比於hash是為了提供更粗粒度的ssd cache失效機制,這一點的原因在上面的ssd特性中已經講過了,下面講述get以及set操作的流程。
首先,邏輯上先查詢記憶體中的read cache,如果不存在,則查詢write buffer,然後是ssd cache的b-tree index,然後是bloom filter確認key的確在硬碟存在,最後查詢到硬碟。
插入的時候,先寫到write buffer裡面,當buffer到達乙個臨界值的時候將其刷到ssd上,當ssd到達乙個臨界值的時候,將其踢出並移到硬碟,當然整個過程bloom filter也要保持一致。
刪除操作首先檢查記憶體中的各buffer和cache有沒有該值,如果有,直接在記憶體中刪除其父節點對它的引用,隨後直接返回;如果沒有,那麼先檢視bloom filter是否該key存在,如果存在則去硬碟上刪掉。
這裡需要強調的是,刪除操作只是乙個標記刪除,物理檔案上的刪除會有後台執行緒定時掃瞄,這樣能夠保證每次ssd的擦除操作能更加有效。
既然ssd做為了二級cache,那麼其必然存在乙個evict操作,evict操作的憑據是每個節點的generation,generation會在每次節點被訪問的時候+1,這裡的+1是乙個全域性的+1,即整顆樹維護乙個long型的generation,a節點被訪問一次則其generation為1,那麼過一會b節點被訪問那麼generation為2,以此類推。
evict的時候將較小的generation的節點刪除,將其踢到硬碟,這裡需要注意,這裡的節點我指的是非頁節點,因此,一般情況下,每次evict至少有預設128個葉節點被踢出,即使這128個節點物理上的位置不連續,由於我們有後台的clean執行緒(參加海量資料儲存之key-value儲存簡介的過期資料清理一章)的參與,因此,我們總能保證,每次ssd的擦除操作都是連續並且是大塊的。
最後,很顯然,這樣的設計l1 cache、l2 cache以及disk組成了一套完整的資料,因此,在掉電的時候,ssd的cache無需失效,當然,前提是由於我們的系統有write-ahead-log保證了記憶體中的資料掉電不丟失。
IBMDS儲存儲存效能調優
ibm儲存適用,其他儲存有類似引數。1 調整全域性cache引數 1 1 start and stop cache flush 這兩個引數影響控制器處理cache區域的操作,在這中情況下是按照先進先出的原則往磁碟上寫資料。這只對開啟了寫cache的情況下適用。在一般的情況下,在決大多數時候start...
海量儲存之十四
這一次,我們來講講資料安全和讀寫高可用 oh no,親,於是我們又掉入了cap所描述的陷阱。好吧,那麼我們也就進入這個領域,來看看這資料安全所代表的一切。在20年以前,資料安全對於大部分使用者來說,只意味著資料庫acid中的 d 資料寫入到資料庫,並返回成功後,這個資料也就是安全的了,在老師教給我們...
MySQL 效能調優之儲存引擎
原文 mysql效能調優中,對myisam儲存引擎的優化。在優化myisam儲存引擎中,需要考慮的點如下 盡量索引,myisam只快取索引不快取資料 根據實際需求,調整讀寫優先順序 延遲插入,使用 insert delay,減少和 select 競爭 資料順序操作,讓insert全部到尾部,減少和s...