性能優化——存儲性能優化

核心知識點:算法

存儲性能優化無非從磁盤類型、數據結構以及存儲備份方式來進行,根據業務場景選擇最合適的方案。數據庫

1.機械vsSSD(磁盤類型)安全

  a.機械:因爲每次訪問數據,都須要移動磁頭臂,所以連續訪問和隨機訪問性能差異比較大。快速順序讀寫、慢速隨機讀寫性能優化

  b.SSD:使用硅晶體存儲數據,所以像內存同樣隨機訪問,功耗和噪音也比較小,可是可靠性和性價比有待提升。服務器

2.B+樹 vs LSM樹(數據結構)數據結構

  a.爲了優化磁盤的隨機讀寫能力,文件系統或數據庫系統會先將數據排序,保證數據更新、插入、刪除以後依然有序,加快檢索速度。併發

  b.B+樹:傳統的關係型數據庫使用,N叉排序樹,通常兩級索引,最多三層樹,須要5次才能更新一條數據。負載均衡

  c.LSM樹:非關係型使用,N階排序樹,數據寫在內存中完成,所以讀寫性能可能會因爲B+框架

  d.LSM存儲步驟:先往內存排序中寫,到達閥值與磁盤最新排序樹合併,再次到達閥值,與上下級排序樹合併。分佈式

  e.讀:先訪問內存,內存沒有再訪問磁盤;寫:在內存中進行

 3.RAID vs HDFS(存儲和備份方式)

1)RAID{關鍵詞:條帶(striping)、鏡像(mirroring)、奇偶校驗(XOR)}

  a.RAID0:將數據分段存儲在多個磁盤上,沒有冗餘(條帶)

  b.RAID1:將數據同時存儲在兩個或多個磁盤上,寫的速度低,讀的速度快,磁盤利用率低。(鏡像)

  c.RAID01:先作條帶(0),再作鏡像(1);RAID10:先作鏡像(1),在作條帶(0);可是RAID10的安全性能高於RAID01。(條帶+鏡像)

  d.RAID3:拿出一塊磁盤作奇偶校驗塊,可是對於數據修改較多的場景,奇偶校驗塊的壓力比較大,更換頻繁。(XOR)

  e.RAID5:數據條帶分佈在磁盤上,奇偶校驗數據分佈在全部磁盤上。(XOR)

  f.RAID6:與RAID5惟一不一樣的是,使用不一樣算法有兩份校驗數據,能在兩塊磁盤損壞的狀況下恢復數據。(XOR)

 2)HDFS:

  a.在整個集羣上進行數據讀寫和備份,不是一磁盤爲單位,而是以服務器爲存儲單位。

  b.1個名稱節點和多個數據節點。一份數據寫完以後會自動存儲兩份。

 

 

在網站應用中,海量的數據讀寫對磁盤訪問形成巨大壓力,雖然能夠經過Cache解決一部分數據讀壓力,

可是不少時候,磁盤仍然是系統最嚴重的瓶頸。並且磁盤中存儲的數據是網站最重要的資產,磁盤的可用性和容錯性也相當重要。

 

1、機械硬盤 vs 固態硬盤

機械硬盤是目前最經常使用的一種硬盤,經過馬達驅動磁頭臂,帶動磁頭到指定的磁盤位置訪問數據,

因爲每次訪問數據都須要移動磁頭臂,所以機械硬盤在數據連續訪問(要訪問的數據存儲在連續的磁盤空間上)

隨機訪問(要訪問的數據存儲在不連續的磁盤空間)時,因爲移動磁頭臂的次數相差巨大,性能表現差異也很是大。

 

 

固態硬盤又稱做SSD或Flash硬盤,這種硬盤沒有機械裝置,數據存儲在可持久記憶的硅晶體上,

所以能夠像內存同樣快速隨機訪問。並且SSD具備更小的功耗更少的磁盤震動與噪音

 

在網站應用中,大部分應用訪問數據都是隨機的,這種狀況下SSD具備更好的性能表現。

可是目前SSD磁盤還不太成熟,可靠性、性價比都有待提高,所以SSD的使用還在摸索階段。

 

2、B+樹 vs LSM樹

因爲傳統的機械磁盤具備快速順序讀寫、慢速隨機讀寫的訪問特性,這個特性對磁盤存儲結構和算法的選擇影響甚大。

 

爲了改善數據訪問特性,文件系統數據庫系統一般會對數據排序後存儲加快數據檢索速度

這就須要保證數據在不斷更新、插入、刪除後依然有序,傳統關係數據庫的作法是使用B+樹。

B+樹是一種專門針對磁盤存儲而優化的N叉排序樹,以節點爲單位存儲在磁盤中,

從根開始查找所需數據所在節點編號和磁盤位置,將其加載到內存中而後繼續查找,直到找到所需的數據。

 

目前數據庫多采用兩級索引的B+樹,樹的層次最多三層,所以可能須要5次磁盤訪問才能更新一條記錄

(三次磁盤訪問獲取數據索引及行ID,而後再進行一次數據文件讀操做及一次數據文件寫操做。)

 

可是因爲每次磁盤訪問都是隨機的,而傳統機械硬盤可能在數據隨機訪問時性能較差

每次數據訪問都須要屢次訪問磁盤,影響數據訪問性能。

 

目前許多NoSQL產品採用LSM樹做爲主要數據結構。

 

LSM 樹能夠看做是一個N階合併樹。數據寫操做(包括插入、修改、刪除)都在內存中進行

而且都會建立一個新紀錄(修改會建立新的數據值,而刪除會記錄一個刪除一個標誌),

這些數據在內存中仍然是一棵排序樹,當數據量超過設定的內存閥值後,會將這顆排序樹和磁盤上最新的排序合併。

當這棵排序樹的數據量也超過設定閥值後,和磁盤上下一級的排序樹合併。合併過程當中,會用最新更新的數據覆蓋舊的數據(或者記錄爲不一樣版本)。

 

在須要進行操做時,老是從內存的排序樹開始搜索,若是沒有找到,就從磁盤上的排序樹順序查找。

 

在LMS樹上進行一次數據更新不須要磁盤訪問,在內存便可完成,速度遠快於B+樹。

當數據訪問以寫操做爲主,而都操做集中在最近寫入的數據上是,使用LSM樹能夠極大程度地減小磁盤的訪問次數,加快訪問速度。

 

做爲存儲結構,B+樹不是關係數據庫所獨有的,NoSQL數據庫也可使用B+樹。

同理,關係數據庫有也可使用LSM,並且隨着SSD磁盤的日趨成熟及大容量持久存儲的內存技術的出現,相信B+樹這一古老的存儲結構會再次算法青春。

 

3、RAID vs HDFS

1.RAID

 RAID全稱爲獨立磁盤冗餘陣列(Redundant Array of Independent Disks),

基本思想就是把多個相對便宜的硬盤組合起來,成爲一個硬盤陣列組,使性能達到甚至超過一個價格昂貴、 容量巨大的硬盤。(目的)

RAID一般被用在服務器電腦上,使用徹底相同的硬盤組成一個邏輯扇區,所以操做系統只會把它當作一個硬盤。

RAID分爲不一樣的等級,各個不一樣的等級均在數據可靠性及讀寫性能上作了不一樣的權衡。 在實際應用中,能夠依據本身的實際需求選擇不一樣的RAID方案。

1).RAID0

RAID0稱爲條帶化(Striping)存儲,將數據分段存儲於 各個磁盤中,讀寫都可以並行處理。所以其讀寫速率爲單個磁盤的N倍(N爲組成RAID0的磁盤個數),可是卻沒有數 據冗餘,單個磁盤的損壞會致使數據的不可修復。

 

2).RAID1

鏡像存儲(mirroring),沒有數據校驗。數據被同等地寫入兩個或多個磁盤中

可想而知,寫入速度會比較 慢,但讀取速度會比較快。讀取速度能夠接近全部磁盤吞吐量的總和,寫入速度受限於最慢 的磁盤。 RAID1也是磁盤利用率最低的一個。

 

 3).RAID3

通常狀況下,一臺服務器上不會出現同時損壞兩塊磁盤的狀況,在只損壞一塊磁盤的狀況下,

若是能利用其它磁盤的數據恢復損壞磁盤的數據,這樣在保證可靠性和性能的同時,磁盤利用率也獲得大幅提高。

 

RAID3在數據寫入的時候,將數據分爲N-1份,併發寫入N-1塊磁盤,並在第N塊磁盤記錄校驗數據

任何一塊磁盤損壞(包括校驗數據磁盤),均可以利用其它N-1塊磁盤的數據恢復。

但在數據修改較多的場景中,修改任何磁盤數據都會致使第N塊磁盤重寫校驗數據,

頻繁寫入的後果是第N塊磁盤比其餘磁盤容易損壞,容易頻繁更換,所以RAID3在實踐中不多使用。

 

4).RAID5

奇偶校驗(XOR),數據以塊分段條帶化存儲。校驗信息交叉地存儲在全部的數據盤上

RAID5把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁盤上,

而且奇偶校驗信息和 相對應的數據分別存儲於不一樣的磁盤上,其中任意N-1塊磁盤上都存儲完整的數據,

也就是 說有至關於一塊磁盤容量的空間用於存儲奇偶校驗信息。

所以當RAID5的一個磁盤發生損壞 後,不會影響數據的完整性,從而保證了數據安全。

當損壞的磁盤被替換後,RAID還會自動利用剩下奇偶校驗信息去重建此磁盤上的數據,來保持RAID5的高可靠性。

 

RAID 5能夠理解爲是RAID 0和RAID 1的折衷方案。RAID 5能夠爲系統提供數據安全保障,但 保障程度要比鏡像低而磁盤空間利用率要比鏡像高

RAID 5具備和RAID 0相近似的數據讀取速度,只是由於多了一個奇偶校驗信息,寫入數據的速度相對單獨寫入一塊硬盤的速度略慢。

 

5).RAID6

 相似RAID5,可是增長了第二個獨立的奇偶校驗信息塊,兩個獨立的奇偶系統使用不一樣的算法數據的可靠性很是高,即便兩塊磁盤同時失效也不會影響數據的使用

但RAID 6須要分配給奇偶校驗信息更大的磁盤空間,同時須要計算,相對於RAID 5有更大的「寫損失」,所以「寫性能」很是差。

由圖所知,每一個硬盤上除了都有同級數據XOR校驗區外,還有一個針對每一個數據 塊的XOR校驗區。

固然,當前盤數據塊的校驗數據不可能存在當前盤而是交錯存儲的。

從數 學角度來講,RAID 5使用一個方程式解出一個未知變量,而RAID 6則能經過兩個獨立的線性 方程構成方程組,從而恢復兩個未知數據。

伴隨着硬盤容量的增加,RAID6已經變得愈來愈重要。

TB級別的硬盤上更容易形成數據丟失, 數據重建過程(好比RAID5,只容許一塊硬盤損壞)也愈來愈長,甚至到數週,這是徹底不可接受的。

而RAID6容許兩 塊硬盤同時發生故障,因此漸漸受到人們的青睞。

 

6).RAID 01

RAID0和RAID1的結合。先作條帶(0),再作鏡像(1)。

RAID01中塊做爲獨立的個體,所以一個塊中的部分發生損壞,整個塊都不能訪問。

 

7).RAID10

相對於RAID01來講,先作鏡像(1),再作條帶(0)。

RAID01和RAID10很是類似,兩者在讀寫性能上沒有什麼差異。可是在安全性上RAID10要好於 RAID01

如圖中所示,假設DISK0損壞,在RAID10中,在剩下的3塊盤中,只有當DISK1故障, 整個RAID纔會失效。

但在RAID01中,DISK0損壞後,左邊的條帶將沒法讀取,在剩下的3快盤 中,只要DISK2或DISK3兩個盤中任何一個損壞,都會致使RAID失效。

2.HDFS

RAID技術能夠經過硬件實現,好比專用的RAID卡或者主板直接支持,也能夠經過軟件實現。

RAID在傳統關係數據庫及文件系統中應用比較普遍,可是大型網站比較喜歡用NoSQL,以及分佈式文件系統。

 

在HDFS(Hadoop分佈式文件系統中),系統在整個存儲集羣的多臺服務器上進行數據併發讀寫和備份

能夠看做在服務器集羣規模上上實現了相似RAID的功能,所以不須要磁盤RAID。

 

HDFS以塊(Block)爲單位管理文件內容,一個文件被分割成若干個Block,當應用程序寫文件時,

每寫完一個Block,HDFS就將其自動恢復到另外兩臺機器上,保證每一個Block有三個副本,

即便有兩臺服務器宕機,數據依然能夠訪問,至關於實現了RAID1的數據恢復功能。

 

當對文件進行處理計算時,經過MapReduce併發計算任務框架,能夠啓動多個計算子任務(MapReduce Task),

同時讀取文件的多個Block,併發處理,至關於實現了RAID0的併發訪問能力。

 

在HDFS中有兩種重要的服務器角色:NameNode(名稱服務節點)和DataNode(數據存儲節點)。

在整個HDFS中只部署一個實例,提供元數據服務。至關於操做系統中的文件分配表(FAT),

管理文件名Block的分配,維護整個文件系統的目錄樹結構。

DAtaNode則部署在HDFS集羣中其它服務器上,提供真正的數據存儲服務。

 

和操做系統同樣,HDFS對數據存儲空間的管理以數據塊(Block)爲單位,只是比操做系統中的數據塊(512字節)要大的多,默認爲64MB。

HDFS將DataNode上的磁盤空間分紅N個這樣的塊,供應用程序使用。

 

應用程序(Client)須要寫文件時,首先訪問NameNode,請求分配數據塊,

NameNode根據管理的DataNode服務器的磁盤空間,按照必定的負載均衡策略,分配若干數據供Client使用。

 

當Client寫完一個數據塊時,HDFS會將這個數據塊再複製兩份存儲在其餘DataNode服務器上,HDFS默認同一份數據有三個副本,保證數據可靠。

所以在HDFS中,即便DataNode服務器有多塊磁盤,也不須要使用RAID進行數據備份,而是在整個集羣上進行數據備份,

並且系統一旦發現某臺服務器宕機,會自動利用其它機器上的數據將這臺服務器上存儲的數據塊自動再備份一份,從而得到更高的數據可靠性。

 

HDFS配合MapReduce等並行計算框架進行大數據處理時,能夠在整個集羣上併發訪問全部的磁盤,無需RAID支持。

相關文章
相關標籤/搜索