数据库之存储
? ? ? ?無論是什么數據庫,其本質還是以數據的形式存儲在計算機的物理介質上的,所以,我們先來看看什么是物理存儲介質。
物理存儲介質:高速緩沖存儲器->主存儲器->快閃存儲器->磁盤->光盤->磁帶,從左到右性能由高到低,價格也由高到低。
?
1.磁盤性能的度量:容量,訪問時間,數據傳輸率和可靠性
? ? ? ?平均尋道時間:磁盤臂移動到正確的磁道花費的時間的平均值
? ? ? ?平均等待時間:磁盤等待旋轉到指定的扇區需要的平均時間,一般是旋轉一圈花費時間的一半
? ? ? ?訪問時間=平均尋道時間+平均旋轉等待時間
? ? ? ?數據傳輸率:數據寫入磁盤或者從磁盤中讀取的速率。目前磁盤系統支持25~100MB的數據最大傳輸率
? ? ? ?平均故障時間(可靠性)
?
2.磁盤塊訪問的優化
? ? ? ?2.1緩沖:從磁盤讀取的塊暫時存儲在內存緩沖區中,因為從緩沖中讀取數據需要的時間成本比一次磁盤讀寫小了幾個量級,基本上可以忽略不計。
?
? ? ? ?2.2磁盤預讀:當一個磁盤塊被訪問時,相同磁道的連續塊也會被讀入到內存緩沖區,即對還未被訪問的磁盤塊預先讀取到緩沖區中,為什么會設計磁盤預讀?這樣做能夠有什么好處?
在實際的磁盤使用中,人們總結出一個規律:當一個磁盤塊被訪問時,下一次訪問操作有80%的概率會讀取上一個磁盤塊周圍的磁盤塊(順序讀取的概率是遠遠大于隨機讀取的),針對這種規律,便設計出了磁盤預讀這種操作。需要注意的四,對于隨機塊的訪問,預讀的效率并不好。
?
? ? ? ?2.3調度:優化磁盤性能度量的指標中的訪問時間的影響因素之尋道時間
如果說當前需要訪問的道的次序分別是:1 5 8? 9 12 15,上一次訪問的磁道是10號磁道,那么接下來該怎么調度能夠在最少的時間內確保都能讀取的情況?
最短尋道優先磁盤調度算法:每次都讀取離當前磁道最近的磁道。這種算法思想下的確能夠優化整體上的尋道時間,但是該算法的特性導致離當前磁道越遠的磁盤讀取需要的時間越遠,這使得磁盤訪問出現兩極化(旱的旱死,澇的澇死)。
先來先服務:先請求的磁盤先訪問,這種情況下能夠確保很好的公平性,但是磁盤的訪問時間很難優化。
電梯調度算法:確定一個方向,每次都從該方向上找到最近的磁道,就像電梯一樣,每次都是朝著一個方向移動,電梯調度算法協調了效率和公平性這兩個相互沖突的目標。
?
? ? ? ?2.4文件組織:為了減少塊訪問時間,我們可以按照與預期的數據訪問方式最接近的方式來組織磁盤上的塊。例如,我們預計一個文件將順序訪問,那么在理想情況下我們應該使文件的所有塊存儲在連續的相鄰柱面上。
?
? ? ? ?2.5非易失性寫緩沖區:因為主存儲器中的內容在發生電源故障時將全部丟失,所以關于數據庫更新的信息必須記錄到磁盤上,這樣才能在系統崩潰時得以保存。因此,更新操作密集的數據庫應用的性能,如事務處理系統的性能,高度依賴于磁盤寫操作的速度,這也是問什么Mysql會使用B+樹結構存儲的原因(后面會有專門的文章進行介紹)。實際上可以通過飛翼式新隨機訪問存儲區大幅度家屬寫磁盤的操作。
?
? ? ? ?2.6日志磁盤:減少寫等待時間另一種方法就是使用日志磁盤,即一種專門用于寫順序日志的磁盤,這和非易失性RAM緩沖區的使用非常相似。對日志磁盤的所有訪問都是順序的,這從根本上消除了尋道時間,并且一次可以寫連續幾個的塊,使得寫日志磁盤比隨機的寫要快許多倍。
? ? 在數據庫系統中,不需要等待寫操作的完成,日志磁盤會在之后完成寫操作(操作延時),進一步說,日志磁盤可以為了最少化磁盤臂的移動而重排寫操作的順序(就是先收集一些寫操作,然后最這些寫操作進行重新排序,使得寫入性能提高)。支持這種日志磁盤的文件系統統稱為日志文件系統。
?
3.獨立磁盤冗余陣列RAID
? ? ? ?如果一個系統中使用大量的磁盤為提高數據讀寫速率提供了機會,如果并行訪問磁盤的話,很多獨立的讀和寫操作可以并發執行。此外,這種組織方式提供了提高數據存儲可靠性的潛力,因為可以在多張磁盤中存儲冗余信息,因此一個磁盤的故障不會導致數據的丟失。這種為了提高性能和可靠性而允許冗余的技術就是獨立磁盤冗余陣列RAID。
? ? ? ?通過冗余提高可靠性:首先從可靠性方面切入,N張磁盤集合中的某張磁盤發生故障的概率比特定的一張磁盤發生故障的概率要高。假設一張磁盤發生故障的平均時間是100小時,那么由100張磁盤組成的陣列發生磁盤故障的平均時間是1小時。引入冗余是解決這個可靠性問題的解決方法,實現冗余最簡單的方法就是鏡像:復制一張磁盤,這樣的話,一張邏輯磁盤對應兩張物理磁盤,并且每一次寫操作都要在兩張磁盤上執行。兩個磁盤同時故障的情況下才會導致數據丟失,忽略故障磁盤的恢復的話,發生磁盤故障的平均時間是100*100/2=5000小時,但實際上故障的發生的獨立性并不是那么高的。
?
? ? ??3.1.通過并行提高性能
通過磁盤鏡像,處理讀請求的速度將翻倍,因為讀請求可以發送到任意一張磁盤上(只要組成一對的兩張磁盤都有用),每個讀操作的操作速率和單一磁盤系統中的傳輸速率是一樣的,但是每單位時間內讀操作的數目將翻倍。
我們可以通過在多張磁盤上進行數據拆分來提高傳輸速率。數據拆分最簡單的形式是將每個字節按比特分開,存儲到多個磁盤上。這種拆分成為比特級拆分:例如,有8個磁盤的陣列中,將每一字節的第i位存儲到第i個磁盤中,這8張磁盤組成的陣列可以看做一個邏輯上的單獨的磁盤,這張邏輯磁盤的扇區大小將是一般扇區的8倍。
除了比特級拆分,還有塊級拆分,塊級拆分是將塊拆分到多張磁盤中,把磁盤陣列看做一個單獨的大磁盤。塊級拆分是最常用的數據拆分形式。
? ? ? ?磁盤系統中的并行有兩個主要的目的:
? ? ? ?? ? ? ?1.負載平衡多個小的訪問操作(塊訪問),以提高這種訪問操作的吞吐量。
? ? ? ?? ? ? ?2.并行執行大的訪問操作,以減少大訪問操作的響應時間。
? ? ? ?? ? ? ?數據拆分提供高傳輸率,但不確??煽啃?#xff1b;鏡像提供了高可靠性,但他十分昂貴(重復的寫操作的代價)
?
? ? ? 3.2RAID級別:
? ? ? ?通過結合“奇偶校驗位”和磁盤拆分思想,從而以較低的代價提供數據冗余,人們提出不同的方案,這些方案具有不同的成本和性能之間的權衡,并且分為若干RAID級別。
? ? ? ?? ? ? ?RAID0級:指塊級拆分但沒有任何冗余的磁盤陣列。
? ? ? ?? ? ? ?RAID1級:指的是使用塊級拆分的磁盤鏡像(每張磁盤都有鏡像)
? ? ? ?? ? ? ?RAID2級:內存風格的糾錯碼組織結構,使用奇偶檢驗位(漢明碼校驗)。
? ? ? ?? ? ? ?? ? ? ?以漢明碼(Hamming Code)的方式將數據進行編碼后分區為獨立的比特,并將數據分別寫入硬盤中。因為在數據? ? ? ?? ? ? ?中加入了錯誤修正碼(ECC,Error Correction Code),所以數據整體的容量會比原始數據大一些,RAID2最少要三臺磁? ? ? ?? ? ? ?盤驅動器方能運作。實際中并不使用此級別。? ? ? ???
? ? ? ?? ? ? ?RAID3級:位交叉的奇偶檢驗組織結構。數據內的比特分散在不同的硬盤上,每張磁盤都要參與I每個I/O請求,每秒鐘支? ? ? ? ?? ? ?持的I/O操作數較少,所以這種規格比較適于讀取大量數據時使用。如果一個扇區被破壞,系統能準確地知道是哪個扇區? ? ? ?? ? ? ?壞了,并且對扇區中的每一位,系統可以通過計算其他磁盤上的對應扇區的對應位的奇偶值來推斷出該位是1還是0。
? ? ? ?? ? ? ?如果 其余位的奇偶校驗位等于存儲的奇偶校驗位,則丟失的位是0,反之為1。
? ? ? ?? ? ? ?RAID4級:塊交叉的奇偶校驗組織結構。RAID4使用塊交叉的奇偶校驗組織結構,而RAID3是位交叉奇偶校驗組織結構。它像RAID0一樣使用塊級拆分,此外在一張獨立的磁盤上為其他N張磁盤上對應的塊保留一個奇偶校驗塊。它讀取一個塊只訪問一張磁盤,因此允許其他的請求在其他磁盤上執行,有較高的總I/O傳輸率。
? ? ?? ? ? ? ?RAID5級:塊交叉的分步奇偶檢驗位的組織結構。RAID5在RAID4的基礎上進行了改進,將數據和奇偶校驗位都分布到所有的N+1張磁盤中,而不是在N張磁盤上存儲數據并在一張磁盤上存儲奇偶校驗位。實際中一般用RAID5而不用RAID4。
?
? ? ? ? ? ?? ?RAID6級:P+Q冗余方案。與RAID 5相比,RAID 6增加了第二個獨立的奇偶校驗信息塊。兩個獨立的奇偶系統使用不同的算法,數據的可靠性非常高,即使兩塊磁盤同時失效也不會影響數據的使用。但RAID 6需要分配給奇偶校驗信息更大的磁盤空間,相對于RAID 5有更大的“寫損失”,因此“寫性能”非常差。較差的性能和復雜的實作方式使得RAID 6很少得到實際應用。
? ? ? ? ? ?? ?RAID1+0:RAID 1+0是先鏡像再拆分數據,再將所有硬盤分為兩組,視為是RAID 0的最低組合,然后將這兩組各自視為RAID 1運作。
? ? ? ?? ? ? ?RAID0+1:RAID 0+1則是跟RAID 1+0的程序相反,是先分區再將數據鏡射到兩組硬盤。它將所有的硬盤分為兩組,變成RAID 1的最低組合,而將兩組硬盤各自視為RAID 0運作。
性能上,RAID 0+1比RAID 1+0有著更快的讀寫速度。
可靠性上,當RAID 1+0有一個硬盤受損,其余三個硬盤會繼續運作。RAID 0+1 只要有一個硬盤受損,同組RAID 0的另一只硬盤亦會停止運作,只剩下兩個硬盤運作,可靠性較低。
?
3.3RAID級別的選擇:
應當考慮的因素:
1.所需的額外磁盤存儲帶來的花費
2.在I/O操作數量方面的性能需求
3.磁盤故障時的性能
4.數據重建過程
? ? ? ?RAID0級用于數據安全性不是很重要的高性能應用。因為RAID2和RAID4被RAID3和RAID5所包含,所以RAID級別的選擇只限于在剩下的級別中進行。比特級拆分(RAID3)不如塊級拆分(RAID5),這是因為塊級拆分對于大量數據的傳輸有與RAID3級同樣好的數據傳輸率,同時對于小量數據的傳輸使用更少的磁盤。對于小量數據傳輸,磁盤訪問時間占主要地位,所以并行讀取并沒有好處。RAID6提供比RAID5更高的可靠性,可以用于數據安全十分重要的應用。在RAID1和RAID5中選擇十分困難。RAID1(包括RAID0+1和RAID1+0)提供最好的寫操作性能。RAID5與RAID1相比具有較低的存儲負載,但寫操作需要更高的時間開銷。對于經常進行讀操作而很少進行寫操作的應用,RAID5是首選。隨著磁盤存儲容量快速的發展,RAID1應用變廣。
?
?
?
?
總結
- 上一篇: C#与.NET程序员面试宝典 封皮(非常
- 下一篇: CC2541