核心知識點:
存儲性能優化無非從磁盤類型、數據結構以及存儲備份方式來進行,根據業務場景選擇最合適的方案。
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解決一部分數據讀壓力,
但是很多時候,磁盤仍然是系統最嚴重的瓶頸。而且磁盤中存儲的數據是網站最重要的資產,磁盤的可用性和容錯性也至關重要。
一、機械硬盤 vs 固態硬盤
機械硬盤是目前最常用的一種硬盤,通過馬達驅動磁頭臂,帶動磁頭到指定的磁盤位置訪問數據,
由於每次訪問數據都需要移動磁頭臂,因此機械硬盤在數據連續訪問(要訪問的數據存儲在連續的磁盤空間上)
和隨機訪問(要訪問的數據存儲在不連續的磁盤空間)時,由於移動磁頭臂的次數相差巨大,性能表現差別也非常大。
固態硬盤又稱作SSD或Flash硬盤,這種硬盤沒有機械裝置,數據存儲在可持久記憶的硅晶體上,
因此可以像內存一樣快速隨機訪問。而且SSD具有更小的功耗和更少的磁盤震動與噪音。
在網站應用中,大部分應用訪問數據都是隨機的,這種情況下SSD具有更好的性能表現。
但是目前SSD磁盤還不太成熟,可靠性、性價比都有待提升,因此SSD的使用還在摸索階段。
二、B+樹 vs LSM樹
由於傳統的機械磁盤具有快速順序讀寫、慢速隨機讀寫的訪問特性,這個特性對磁盤存儲結構和算法的選擇影響甚大。
為了改善數據訪問特性,文件系統或數據庫系統通常會對數據排序后存儲,加快數據檢索速度,
這就需要保證數據在不斷更新、插入、刪除后依然有序,傳統關系數據庫的做法是使用B+樹。

B+樹是一種專門針對磁盤存儲而優化的N叉排序樹,以節點為單位存儲在磁盤中,
從根開始查找所需數據所在節點編號和磁盤位置,將其加載到內存中然后繼續查找,直到找到所需的數據。
目前數據庫多采用兩級索引的B+樹,樹的層次最多三層,因此可能需要5次磁盤訪問才能更新一條記錄
(三次磁盤訪問獲取數據索引及行ID,然后再進行一次數據文件讀操作及一次數據文件寫操作。)
但是由於每次磁盤訪問都是隨機的,而傳統機械硬盤可能在數據隨機訪問時性能較差,
每次數據訪問都需要多次訪問磁盤,影響數據訪問性能。
目前許多NoSQL產品采用LSM樹作為主要數據結構。

LSM 樹可以看作是一個N階合並樹。數據寫操作(包括插入、修改、刪除)都在內存中進行,
並且都會創建一個新紀錄(修改會創建新的數據值,而刪除會記錄一個刪除一個標志),
這些數據在內存中仍然還是一棵排序樹,當數據量超過設定的內存閥值后,會將這顆排序樹和磁盤上最新的排序合並。
當這棵排序樹的數據量也超過設定閥值后,和磁盤上下一級的排序樹合並。合並過程中,會用最新更新的數據覆蓋舊的數據(或者記錄為不同版本)。
在需要進行操作時,總是從內存的排序樹開始搜索,如果沒有找到,就從磁盤上的排序樹順序查找。
在LMS樹上進行一次數據更新不需要磁盤訪問,在內存即可完成,速度遠快於B+樹。
當數據訪問以寫操作為主,而都操作集中在最近寫入的數據上是,使用LSM樹可以極大程度地減少磁盤的訪問次數,加快訪問速度。
作為存儲結構,B+樹不是關系數據庫所獨有的,NoSQL數據庫也可以使用B+樹。
同理,關系數據庫有也可以使用LSM,而且隨着SSD磁盤的日趨成熟及大容量持久存儲的內存技術的出現,相信B+樹這一古老的存儲結構會再次算法青春。
三、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支持。
