物理存儲介質概述
存儲介質的層次越高,成本越貴,速度越快。
基本存儲(primary storage):最快的存儲介質,如高速緩沖存儲器cache和主存儲器main memory;
輔助存儲(secondary storage)/聯機存儲(online storage): 如磁盤(magnetic disk);
三級存儲(tertiary storage)/脫機存儲(offline storage):如磁帶機(magnetic tapes)和自動光盤機(optical disk)。
易失性存儲(volatile storage):在設備端點后將丟失所有內容。在存儲介質層次結構中,從main memory向上的存儲系統都是易失性存儲,主存儲器之下的存儲都是非易失性存儲。
磁盤和快閃存儲器
1. 磁盤的物理特性
盤片(platter):表面覆蓋磁性物質的扁平圓盤,一個磁盤通常包括多個盤片;
磁道(track):盤片表面從邏輯上划分為磁道,外側磁道長度較大,比內側磁道擁有更多扇區;
扇區(sector): 從磁盤讀出和寫入信息的最小單位;
讀寫頭(read-write head):用於將信息磁化存儲到扇區。每個盤片的每個面都有一個讀寫頭,在盤片上移動以訪問不同磁道;
磁盤臂(disk arm):所有磁道的讀寫頭安裝在一個磁盤臂上並一起移動;
磁頭-磁盤裝置(head-disk assembly):安裝在轉軸上的所有磁盤盤片和安裝在磁盤臂上的所有讀寫頭的統稱;
柱面(cylinder):因為所有盤片上的讀寫頭一起移動,所以當某一個盤片的讀寫頭在第i條磁道上時,所有其他盤片的讀寫頭也都在各自盤片的第i條磁道上。所有盤片的第i條磁道合在一起成為第i個柱面。
磁盤控制器(disk controller):計算機系統和實際磁盤驅動器硬件之間的接口,在磁盤驅動單元內部實現。
2. 磁盤性能的度量
磁盤質量的主要度量指標:容量、訪問時間、數據傳輸率和可靠性。
訪問時間(access time):從發出讀寫請求到數據開始傳輸之間的時間。訪問時間是尋道時間和旋轉等待時間的總和;
尋道時間(seek time):為訪問磁盤上指定扇區的數據,磁盤臂重定位(移動以定位正確磁道)的時間。依賴於目的刺刀距離磁盤臂的初始距離,隨磁盤臂移動距離的增大而增大;
平均尋道時間(average seek time):尋道時間的平均值,通過在一個均勻分布的隨機請求序列上計算得到;
旋轉等待時間(rotational latency time):讀寫頭到達所需磁道后等待磁盤旋轉直到訪問的指定扇區出現在讀寫頭下的時間。磁盤的平均旋轉等待時間是磁盤旋轉一周時間的1/2;
數據傳輸率(data-transfer rate):從磁盤獲得數據或向存盤存儲數據的速率。對於磁盤的內側磁道,數據傳輸率明顯低於最大傳輸率;
平均故障時間(Mean Time To Failure, MTTF):平均可期望系統無故障連續運行的時間量,是磁盤可靠性的度量標准。
存儲介質的可靠性由兩個因素決定:電源故障或系統崩潰是否導致數據丟失,存儲設備發生物理故障的可能性有多大。
3. 磁盤塊訪問的優化
塊(block):數據在磁盤和主存儲器之間以塊為單位傳輸。一個塊是一個邏輯單元,包含固定數目的連續扇區。
來自磁盤的連續請求可分為順序訪問模式或隨機訪問模式:
順序訪問(sequential access)模式:連續的請求會請求與處於相同或相鄰磁道上連續的塊;
隨機訪問(random access)模式:相繼的請求會請求隨機位於磁盤上的塊,每次請求都需要一次磁盤尋道,數據傳輸率明顯低於順序訪問模式。
提高訪問塊速度可采用的技術:
·緩沖(buffering):從磁盤讀取的塊暫時存儲在內存緩沖區中,以滿足將來的要求;
·預讀(read-ahead):當一個磁盤塊被訪問時,相同磁道的連續塊也被讀入內存緩沖區找那個,即使沒有針對這些塊的即將來臨的請求;(順序訪問模式下可減少塊的訪問時間)
·調度(scheduling):如果所需的塊在同一柱面上,可按塊經過讀寫頭的順序發出訪問塊的請求;如果所需的塊在不同柱面上,按照使磁盤臂移動最短距離的順序發出訪問塊的請求。
磁盤調度算法(disk-arm-scheduling)將對磁道的訪問按能增加可以處理的訪問數量的方式排序。
·文件組織(file organization):按與預期數據的訪問方式最接近的方式來組織磁盤上的塊以減少塊的訪問時間;
非易失性寫緩沖區(nonvolatile write buffer):可使用非易失性隨機訪問存儲器(NonVolatile Random-Access Memory, NV-RAM)加速寫磁盤操作,NV-RAM的內容在發生電源故障時不會丟失。
·日志磁盤(log disk):一種專門用於寫順序日志的磁盤,對日志磁盤的所有訪問都是順序的。支持日至磁盤的文件系統稱作日志文件系統(journaling file system)。
4. 快閃存儲
快閃存儲器(flash memory)可分為兩種:NOR快閃和NAND快閃。
NOR快閃:允許隨機訪問閃存中的單個字,速度快;
NAND快閃:讀取時需要將整個數據頁取到主存儲器中,比NOR快閃便宜、存儲容量高,采用NAND快閃構建的存儲系統提供與磁盤存儲器相同的面向塊的接口。
擦除塊(erase block):寫入時閃存的頁面不能直接覆蓋,必須先擦除再重寫,一次擦除操作可在多個頁面執行,稱為擦除塊。
一個擦除塊的大小通常明顯比存儲系統的塊大很多;
一個閃存頁的可擦除次數存在限制,閃存存儲器適合緩存頻繁訪問但很少更新的數據;
閃存系統通過映射邏輯頁碼到物理頁碼,限制了慢擦除速度和更新限制的影響。邏輯頁更新時刻重新映射到任何已擦除的物理頁,原來的位置標記為已刪除,可隨后擦除。
每個物理也都有一個小的存儲區域以保存其邏輯地址。邏輯到物理頁面的映射被復制到內存的轉換表(translation table)中。
損耗均衡(wear leveling):在物理塊中均勻分布擦除操作的原則。包含多個刪除頁面的塊將會定期清除,並注意先復制這些塊中未刪除的頁面到其他塊(並在轉換表中進行更新),擦除多次的物理頁面被標記為很少更新的“冷數據”,沒有擦除多次的頁用於存儲頻繁更新的“熱數據”。
所有上述動作通過閃存轉換層(flash translation layer)完成,這一層上提供與磁盤存儲器相同的面向頁/扇區的接口。
混合硬盤驅動器(hybrid disk drive):結合了小容量閃存存儲器的硬盤系統,對頻繁訪問的數據作為緩存使用。
磁盤和快閃存儲器
獨立磁盤冗余陣列(Redundant Array of Independent Disk, RAID)多種磁盤組織技術具有高可靠性和執行效率,並且易於管理和操作。
RAID通過把數據拆分到多張磁盤上,可以提高大數據量訪問的吞吐率;通過引入多張磁盤上的冗余存儲,可以顯著提高可靠性。
1. 通過冗余提高可靠性
冗余(redundancy):解決可靠性問題的方法,存儲正常情況下不需要的額外信息,可在磁盤故障時用於重建丟失的信息。
鏡像(mirroring):實現冗余最簡單、昂貴的方法,一張邏輯磁盤由兩張邏輯磁盤組成,每一次寫操作都要在兩張磁盤上執行。采用鏡像技術的磁盤的平均故障時間依賴於單張磁盤的平均故障時間和平均修復時間。
平均修復時間(mean time to repair):替換發生故障的磁盤並且恢復這張磁盤上的數據所花費的平均時間。
對於磁盤鏡像,如果正在對兩張磁盤上相同的塊進行寫操作時發生電源故障問題,可能導致兩個塊處於不一致的狀態。
解決辦法:先寫一個拷貝,再寫另外一個,保證兩個拷貝中有一個總是一致的,並在電源重新啟動后做一些額外的動作以從不完全的寫操作中恢復。
2. 通過並行提高性能
磁盤系統中並行的兩個主要目的:
1)負載平衡多個小的訪問操作(塊訪問),以提高這種訪問操作的吞吐量;
2)並行執行大的訪問操作,以減少大訪問操作的響應時間。
可通過在多張磁盤上進行數據拆分(striping data)來提高傳輸速率。
比特級拆分(bit-level striping):數據拆分的最簡單形式,將每個字節按比特分開,存儲到多個磁盤上。
塊級拆分(block-level striping):將磁盤陣列看做一張單獨的大磁盤,將塊拆分到多張磁盤並對塊進行邏輯編號。
設塊的邏輯編號從0開始,對於n張磁盤的陣列,塊級拆分將磁盤陣列邏輯上第i個塊存儲到第(i mod n)+1張磁盤上(即用第[i/n]個物理塊存儲邏輯塊i)。
3. RAID級別
通過結合奇偶校驗位和磁盤拆分思想可以較低代價提供數據冗余,具有不同成本和性能權衡的替換方案可分為若干RAID級別(RAID level)。
不同的RAID組織形式具有不同的成本。性能和可靠性特征。最常用的是RAID 1級和RAID 5級。
e.g.不同RAID級別4張磁盤數據的冗余信息(P表示糾錯位,C表示數據的第二個拷貝。)
·RAID 0級:塊級拆分但沒有任何冗余的磁盤陣列;
·RAID 1級:使用塊級拆分的磁盤鏡像;
·RAID 2級:內存風格的糾錯碼(Error-Correcting-Code, ECC)組織結構。每個字節有都有一個與之聯系的奇偶校驗位,字節拆分存儲到多張磁盤上,糾錯位存儲在其余磁盤中。
如果其中一張磁盤發生了故障,可從其他磁盤中讀出字節的其余位和相關的糾錯位,並用於重建被破壞的數據;
·RAID 3級:位交叉的奇偶校驗組織結構。在RAID 2級的基礎上改進,可用單一的奇偶校驗位進行檢錯糾錯。
可用奇偶校驗位判斷哪個扇區出錯,通過計算其他磁盤上對應扇區的對應位的奇偶值來恢復被破壞扇區上的位。
RAID 3級和RAID 2級一樣好,但更節省額外磁盤的開銷,因此在實際中並不使用RAID 2。
相比RAID 1級減少存儲開銷、提高傳輸率,但每秒鍾支持的I/O操作數較少;
·RAID 4級:塊交叉的奇偶校驗組織結構。塊級拆分,並在一張獨立磁盤上為其他N張磁盤對應的塊保留一個奇偶校驗塊;
可使用奇偶校驗塊和其他磁盤上對應的塊來恢復故障磁盤上的塊;
·RAID 5級:塊交叉的分布奇偶校驗位的組織結構。在RAID 4的基礎上改進,將數據和奇偶校驗位分布到所有的N+1張磁盤中,而不是在N張磁盤上存儲數據並在一張磁盤上存儲奇偶校驗位。
注意奇偶校驗塊不能和其所對應的數據塊存儲在同一張磁盤上,否則磁盤發生故障時導致數據和奇偶校驗位的丟失。
RAID 5級和RAID 4級一樣好,但在相同成本下提供了更好的讀寫性能,因此再實際中並不使用RAID 4;
·RAID 6級:P+Q冗余方案。類似RAID5級,但存儲了額外的冗余信息以應對多張磁盤發生故障的情況。RAID 6級不適用奇偶校驗,而使用類似Reed-Solomon碼的糾錯碼。
4. RAID級別的選擇
選擇RAID級別應考慮的因素:所需額外磁盤存儲帶來的花費、I/O操作數量方面的性能需求、磁盤故障時的性能、數據重建過程中的性能。
對於大量數據傳輸,比特級拆分(RAID 3級)與塊級拆分(RAID 5級)的數據傳輸率同樣好;
對於小量數據傳輸。RAID5級性能更好,使用更少磁盤;
RAID 0級用於數據安全性不是很重要的高性能應用;
RAID 6級提供比RAID5級更高的可靠性,可用於數據安全十分重要的應用;
RAID 1級提供最好的寫操作性能,在數據庫系統日志文件的存儲等應用中使用廣泛,適合中等存儲需求和高I/O需求的應用;
RAID5級相比1具有較低存儲負載,但寫操作時間開銷更高,適合經常進行讀操作而很少進行寫操作的應用。
RAID系統一個陣列中磁盤越多,數據傳輸率越高,但系統越昂貴;
一個奇偶校驗位保護的數據位越多,存儲奇偶校驗位的空間開銷越小,但增加了數據丟失的可能。
5. 硬件問題
軟件RAID(software RAID)可在不改變硬件層,只修改軟件的基礎上實現的RAID。而具有專用硬件支持的系統稱為硬件RAID(hardware RAID)系統。
硬件RAID可使用非易失性RAM在執行寫操作之前記錄它們,如果發生電源故障,系統恢復時刻從非易失性RAM中獲得有關未完成的寫操作的信息並完成。
潛在故障(latent failure)/位腐(bit rot):個別扇區先前成功寫入的數據可能丟失的故障。
擦洗(scrubbing):為減少數據丟失的可能性,良好的RAID控制器會在磁盤空閑時期對每張磁盤的每一個扇區進行讀取,如果發現某個扇區無法讀取,則數據從RAID組織的其余磁盤中進行恢復,並寫回到扇區中。
熱交換(hot swapping):在不切斷電源的情況下將出錯磁盤用新的磁盤替換。(減少了平均恢復時間)
第三級存儲
常用的第三級存儲介質:光盤、磁帶。
1. 光盤
光盤的數據傳輸率用n×表示,指驅動器支持的傳輸速率是標准速率的n倍。
可記錄一次(不可重寫)的光盤(CD-R、DVD-R和DVD+R)適合於數據歸檔,存儲不應更改的信息;可多次重寫的光盤(CD-RW、DVD-RW、DVD+RW和DVD-RAM)也可用於數據歸檔。
自動光盤機(jukebox):存儲大量光盤的設備,可按需求自動將光盤裝載到少量驅動器中的一個上。
2. 磁帶
磁帶只能進行順序存取,不能提供隨機訪問。主要用於備份存儲不經常使用的數據、將數據從一個系統轉到另一個系統的脫機截止。
自動磁帶機(tape jukebox):存放大量的磁帶,並由少量可用於安裝磁帶的驅動器。
文件組織
文件(file):一個數據庫被映射到多個不同的文件,由底層操作系統維護。一個文件在邏輯上組織成為記錄的一個序列,這些記錄映射到磁盤塊上。
塊(block):存儲分配和數據傳輸的基本單元。每個文件分成定長的存儲單元,稱為塊。
一個塊可能包括多條記錄,由使用的物理數據組織形式決定;
一般假定沒有記錄比塊更大,比塊更大的大數據項通過指針處理單獨存儲;
要求每條記錄包含在單個塊中。
將數據庫映射到文件的兩種方法:
a. 定長記錄:使用多個文件,每個文件中只存儲固定長度的記錄。
b. 變長記錄:構造能夠容納多種長度的記錄的文件,使之能適應多種長度的記錄。
1. 定長記錄
移動記錄以占據被刪記錄所釋放空間的做法不理想,可采用讓隨后插入的新記錄重用被刪除記錄空間的做法。
文件頭(file header):在文件的開始出分配一定數量的字節作為文件頭,包含有關文件的各種信息。
空閑列表(free list):可在文件頭中存儲被刪除的第一個記錄的地址(指針),用這個記錄來存儲第二個可用記錄的地址,依次類推,被刪除的記錄形成一條鏈表。
插入一條新紀錄時,使用文件頭所指向的記錄,並改變文件頭的指針以指向下一個可用記錄。如果沒有可用空間,則將新紀錄添加到文件末尾。
2. 變長記錄
對於記錄中的定長屬性,分配存儲它們的值所需的字節數;
對於記錄中的變長屬性,在記錄的初始部分中存儲一個對(偏移量,長度)值,其中偏移量表示在記錄中該屬性的數據開始的位置,長度表示變長屬性的字節長度,然后在定長部分后連續存儲。
e.g. 變長記錄instructor的表示。
屬性ID、name和dept_name為變長字符串,屬性salary為定長數值用8個字節存儲;
每個屬性的偏移量和長度值共占4個字節。
空位圖(null bitmap):用於記錄哪個屬性是空值。在一些表示中空位圖存儲在記錄開頭,並且對於空屬性不存儲數據。
e.g. 記錄中有4個屬性,因此該記錄的空位圖只占1個字節。記錄中如果salary是空值,則空位圖的第4位置1,存儲在12~19字節的salary值將被忽略。
分槽的頁結構(slotted-page structure):一般用於在塊中組織記錄。
每個塊開始處有一個塊頭,包含信息1. 塊頭中記錄條目的個數;2. 塊中空閑空間的末尾處;3. 一個包含記錄位置和大小的記錄條目組成的數組。
實際記錄從塊的尾部開始連續排列;
塊中空閑空間是連續的,在塊頭數組的最后一個條目和第一條記錄之間。
如果插入一條記錄,在空閑空間尾部給這條記錄分配空間,將包含這條記錄大小和未知的條目添加到塊頭中,並修改塊頭中空閑空間末尾指針;
如果刪除一條記錄,釋放它占用的空間,並將它的條目設置成被刪除狀態(e.g. 大小設置為-1),移動塊中被刪除記錄之前的記錄,並修改塊頭中空閑空間末尾指針。
要求指針不能直接指向記錄,而必須指向塊頭中記有記錄實際位置的條目(指向記錄的間接指針)。
大對象通常不與記錄中其他短屬性存儲在一起,而是存儲到一個特殊文件或文件的集合中,並在包含該大對象的記錄中存儲一個指向大對象的邏輯指針。
文件中記錄的組織
因為數據以塊為單位在磁盤存儲器和主存儲器之間傳輸,所以才去用一個單獨的塊包含相關聯的記錄的方式,將文件記錄分配到不同的塊中是可取的。如果能夠僅使用一次塊訪問就可以存取想要的多個記錄,就能節省磁盤訪問次數。因為磁盤訪問通常是數據庫系統性能的瓶頸,所以仔細設計塊中記錄的分配可以獲得顯著的性能提高。
在文件中組織記錄的方法:
·堆文件組織(heap file organization):一條記錄可放在文件中的任何地方,只要那個地方有空間存放這條記錄。記錄是沒有順序的,通常每個關系(記錄的集合)使用一個單獨的文件;
·順序文件組織(sequential file organization):記錄根據其”搜索碼”的值順序存儲;
·散列文件組織(hashing file organization):在每條記錄的某些屬性上計算一個散列函數,散列函數的結果確定記錄應放到文件的哪個塊中。
通常每個關系的記錄用一個單獨的文件存儲。但在多表聚簇文件組織(multitable clustering file organization)中,幾個不同關系的記錄存儲在同一個文件中。
1. 順序文件組織
搜索碼(search key):任何一個屬性或屬性的集合,無須是主碼或超碼。
順序文件(sequential file):用於高效處理按某個搜索碼的順序排序的記錄。通過指針把記錄鏈接起來,每條記錄的指針指向搜索碼順序排列的下一跳記錄,並在物理上按搜索碼順序或盡可能接近按搜索碼順序存儲記錄。
e.g. instructor記錄組成的順序文件,用ID作為搜索碼。
對於刪除操作,使用指針鏈表來管理;
對於插入操作,在文件中定位按搜索碼順序處於待插入記錄之前的一條記錄,如果該記錄所在塊中有一條空閑記錄(刪除后留下的空間)則直接插入新紀錄,否則將新紀錄插入到一個溢出塊中。調整指針,使其能按搜索碼順序鏈接記錄。
如果存儲在溢出塊中的記錄較多,會喪失搜索碼順序和物理順序之間的一致性,降低順序處理效率。此時文件應該重組(reorganized),使其再一次在物理上順序存放。重組代價很高,必須在系統負載很低時執行。
2. 多表聚簇文件組織
多表聚簇文件組織(multitable clustering file organization):一種在每一塊中存儲兩個或多個關系的相關記錄的文件組織。該文件組織允許使用一次塊的讀操作來讀取滿足連接條件的記錄。
多表聚簇文件組織加速了對特定連接的處理,何時使用多表聚簇依賴於數據庫設計者所認為的最頻繁的查詢類型。
e.g.
對於計算department關系和instrutor關系的連接的查詢,可設計一個高效執行涉及department自然連接instructor查詢的文件結構,該文件結構中,每個系的instructor元組存儲在具有相應dept_name的department元組附近,因此將兩個關系的元組混合在一起,允許對連接的高效處理。
(假定每條記錄包含它所屬關系的標識符)
(如果記錄太多不能存儲在一個塊中,則其余記錄出現在臨近塊中。)
多表聚簇文件結構可能導致某些其他類型的查詢處理變慢。
e.g. 與在單一文件中存儲單一關系的策略相比,多表聚簇文件結構中SELECT * FROM department查詢需要訪問更多的塊。可用指針把多表聚簇文件結構中所有department關系的記錄鏈接起來。
數據字典存儲
元數據(metadata):關系數據庫需要維護的關於關系的數據。(關於數據的數據)
關於關系的關系模式和其他元數據存儲在數據字典(data dictionary)a.k.a.系統目錄(system catalog)中。
存儲的信息類型包括:
·關系的名字;每個關系中屬性的名字、域和長度;視圖的名字和視圖的定義;
·授權用戶的名字;關於用戶的授權和賬戶信息;用於認證用戶的密碼或其他信息;
·關於關系的統計數據和描述數據(e.g. 每個關系中元組的總數、每個關系所使用的存儲方法);
·關系的存儲組織(順序、散列或堆)和每個關系的存儲位置;
·關於每個關系的每個索引的信息(e.g. 索引的名字、被索引關系的名字、在其上定義索引的屬性、構造的索引的類型)。
數據字典通常存儲成非規范化的形式,以便進行快速的存取。
e.g. 描述系統元數據的一種關系模式
數據庫緩沖區
數據庫系統的一個主要目標是盡量減少磁盤和存儲器之間傳輸的塊數目。
減少磁盤訪問數量的一種方法是在主存儲器中保留盡可能多的塊。因為在主存儲器中保留所有的塊是不可能的,所以需要為塊的存儲而管理主存儲器中可用空間的分配。
緩沖區(buffer):主存儲器中的一部分,用於存儲磁盤塊拷貝。每個塊總有一個拷貝存放在磁盤上,但在磁盤上的拷貝可能更舊。
緩沖區管理器(buffer management):負責緩沖區空間分配的子系統。
1. 緩沖區管理器
當數據庫系統中的程序需要磁盤上的塊時,向緩沖區管理器發出請求(調用);
→如果這個塊已經在緩沖區中,緩沖區管理器將這個塊在主存儲器中的地址傳給請求者。
如果這個塊不在緩沖區中,緩沖區管理器先在緩沖區中為這個塊分配空間;
→如果需要,可將其他塊移出主存儲器為新塊騰出空間(移出的塊僅當它自最近一次寫回磁盤后被修改過才被寫回磁盤);
→緩沖區管理器把請求的塊從磁盤讀入緩沖區,將這個塊在主存儲器中的地址傳回給請求者。
緩沖區管理器使用比典型的虛擬存儲器管理策略更復雜的技術:
·緩沖區替換策略(buffer replacement strategy):當緩沖區中沒有剩余空間時,在新塊讀入緩沖區之前必須把一個塊從緩沖區中移除。可采用改進的最近最少使用(LRU)策略。
·被釘住的塊(pinned block):當一個塊上的更新操作正在進行時,大多數恢復系統不允許將該塊寫回磁盤。該特性對從崩潰中恢復十分重要。
·塊的強制寫出(forced output of block):在某些情況下,盡管不需要一個塊所占用的緩沖區空間,但必須把這個塊寫回磁盤的寫操作。