磁盤到底是怎樣工作的?一文理解硬盤結構

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"文章首發於:","attrs":{}},{"type":"link","attrs":{"href":"https://guanngxu.com/","title":""},"content":[{"type":"text","text":"Guanngxu 的個人博客","attrs":{}}]},{"type":"text","text":":","attrs":{}},{"type":"link","attrs":{"href":"https://guanngxu.com/index.php/archives/3/","title":""},"content":[{"type":"text","text":"https://guanngxu.com/index.php/archives/3/","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據庫系統總會涉及到輔助存儲(大多都是磁盤),因爲它們能夠存儲大量需要長期保存的數據,因此我們有必要先了解了解磁盤的相關知識。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據機械原理,存儲器的容量越大其速度就越慢。但是速度越快的存儲器,其單位字節的價格就越貴。現代計算機系統可以包含幾個不同的可以存儲數據的部件,就形成了存儲器的層次結構,但是需要注意的是「虛擬內存」是操作系統與操作系統運用機器硬件的產物,它不是存儲器的層次之一。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"磁盤結構","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"傳統的硬盤盤結構是像下面這個樣子的,它有一個或多個盤片,用於存儲數據。盤片多采用鋁合金材料;中間有一個主軸,所有的盤片都繞着這個主軸轉動。一個組合臂上面有多個磁頭臂,每個磁頭臂上面都有一個磁頭,負責讀寫數據。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e7/e711879bbdda41c39e5a421e67648e6e.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"磁盤一般有一個或多個盤片。每個盤片可以有兩面,即第一個盤片的正面爲0面,反面爲 1 面;第二個盤片的正面爲 2 面......依次類推。磁頭的編號也和盤面的編號是一樣的,因此有多少個盤面就有多少個磁頭。盤面正視圖如下圖,磁頭的傳動臂只能在盤片的內外磁道之間移動。因此不管開機還是關機,磁頭總是在盤片上面。關機時,磁頭停在盤片上面,抖動容易劃傷盤面造成數據損失,爲了避免這樣的情況,所以磁頭都是停留在起停區的,起停區是沒有數據的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f2/f2aa9ca3c5141089bc58036704b753d5.png","alt":"image.png","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個盤片的盤面被劃分成多個狹窄的同心圓環,數據就存儲在這樣的同心圓環上面,我們將這樣的圓環稱爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"磁道 (Track)","attrs":{}},{"type":"text","text":"。每個盤面可以劃分多個磁道,最外圈的磁道是0號磁道,向圓心增長依次爲1磁道、2磁道......磁盤的數據存放就是從最外圈開始的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/23/23a406d1afdfcca7cc2960c5e5dc1a2d.png","alt":"image.png","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據硬盤的規格不同,磁道數可以從幾百到成千上萬不等。每個磁道可以存儲數 Kb 的數據,但是計算機不必要每次都讀寫這麼多數據。因此,再把每個磁道劃分爲若干個弧段,每個弧段就是一個","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"扇區 (Sector)","attrs":{}},{"type":"text","text":"。扇區是硬盤上存儲的物理單位,現在每個扇區可存儲 512 字節數據已經成了業界的約定。也就是說,即使計算機只需要某一個字節的數據,但是也得把這個 512 個字節的數據全部讀入內存,再選擇所需要的那個字節。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4a/4a4b7fce44fd408f73b9e64930103421.png","alt":"image.png","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"柱面","attrs":{}},{"type":"text","text":"是我們抽象出來的一個邏輯概念,簡單來說就是處於同一個垂直區域的磁道稱爲柱面 ,即各盤面上面相同位置磁道的集合。需要注意的是,磁盤讀寫數據是按柱面進行的,磁頭讀寫數據時首先在同一柱面內從 0 磁頭開始進行操作,依次向下在同一柱面的不同盤面(即磁頭上)進行操作,只有在同一柱面所有的磁頭全部讀寫完畢後磁頭才轉移到下一柱面。因爲選取磁頭只需通過電子切換即可,而選取柱面則必須通過機械切換。數據的讀寫是按柱面進行的,而不是按盤面進行,所以把數據存到同一個柱面是很有價值的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"磁盤被","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"磁盤控制器","attrs":{}},{"type":"text","text":"所控制(可控制一個或多個),它是一個小處理器,可以完成一些特定的工作。比如將磁頭定位到一個特定的半徑位置;從磁頭所在的柱面選擇一個扇區;讀取數據等。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f7/f79451a2a9aba6e957e6486471977595.png","alt":"image.png","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現代硬盤尋道都是採用CHS(Cylinder Head Sector)的方式,硬盤讀取數據時,讀寫磁頭沿徑向移動,移到要讀取的扇區所在磁道的上方,這段時間稱爲尋道時間(seek time)。因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同。磁頭到達指定磁道後,然後通過盤片的旋轉,使得要讀取的扇區轉到讀寫磁頭的下方,這段時間稱爲旋轉延遲時間(rotational latencytime)。然後再讀寫數據,讀寫數據也需要時間,這段時間稱爲傳輸時間(transfer time)。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據上文的信息,我們可以得出磁盤容量的計算公式爲:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":""},"content":[{"type":"text","text":"硬盤容量 = 盤面數 × 柱面數 × 扇區數 × 512字節","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"筆試題實戰","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面的題目是騰訊某一年校招筆試中的一個題目,題幹信息描述爲:數據存儲在磁盤上的排列方式會影響I/O服務的性能,一個圓環磁道上有10個物理塊,10個數據記錄R1~R10存放在這個磁道上,記錄的安排順序如下表所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"物理塊 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"---|---|---|---|---|---|---|---|---|---|---","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"邏輯記錄 | R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"假設磁盤的旋轉速度爲20ms,磁盤當前處在R1的開頭處,若系統順序掃描後將數據放入單緩衝區內,處理數據的時間爲4ms(然後再讀取下個記錄),則處理這10個記錄的最長時間是多少?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"答案:磁盤會一直朝某個方向旋轉,不會因爲處理數據而停止。本題要求順序處理 R1 到 R10,起始位置在 R1,一週是 20ms,共 10 個記錄,所以每個記錄的讀取時間爲 2ms。首先讀 R1 並處理 R1,讀 R1 花 2ms,讀好後磁盤處於 R1 的末尾或 R2 的開頭,此時處理 R1,需要 4ms,因爲磁盤一直旋轉,所以 R1 處理好了後磁盤已經轉到 R4 的開始了,這時花的時間爲 2+4=6ms。這時候要處理 R2,需要等待磁盤從 R5 一直轉到 R2 的開始纔行,磁盤轉動不可反向,所以要經過 8\\","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"2ms 才能轉到 R1 的末尾,讀取 R2 需要 2ms,再處理 R2 需要 4ms,處理結束後磁盤已經轉到 R5 的開頭了,這時花的時間爲 2\\","attrs":{}},{"type":"text","text":"8+2+4=22ms。等待磁盤再轉到 R3 又要 8\\","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"2ms,加上 R3 自身 2ms 的讀取時間和 4ms 的處理時間,花的時間也爲 22ms,此時磁盤已經轉到 R6 的開頭了,寫到這裏,就可以看到規律了,讀取並處理後序記錄都爲 22ms,所以總時間爲 6+22\\","attrs":{}},{"type":"text","text":"9=","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"204ms","attrs":{}},{"type":"text","text":"。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"如何加速對磁盤的訪問","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於理解數據庫系統系統特別重要的是磁盤被劃分爲磁盤塊(或像操作系統一樣稱之爲頁),每個塊的大小是 4~64KB。磁盤訪問一個磁盤塊平均要用 10ms,但是這並不表示某一應用程序將數據請求發送到磁盤控制器後,需要等 10ms 才能得到數據。如果只有一個磁盤,在最壞的情況下,磁盤訪問請求的到達個數超過 10ms 一次,那麼這些請求就會被無限的阻塞,調度延遲將會變的非常大。因此,我們有必要做一些事情來減少磁盤的平均訪問時間。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"按柱面組織數據","attrs":{}},{"type":"text","text":":前這一點在前文已經提到過了。因爲尋道時間佔平均塊訪問時間的一半,如果我們選擇在一個柱面上連續的讀取所有塊,那麼我們只需要考慮一次尋道時間,而忽略其它時間。這樣,從磁盤上讀寫數據的速度就接近於理論上的傳輸速率。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"使用多個磁盤","attrs":{}},{"type":"text","text":":如果我們使用多個磁盤來替代一個磁盤,只要磁盤控制器、總線和內存能以 n 倍速率處理數據傳輸,則使用 n 個磁盤的效果近似於 1 個磁盤執行了 n 次操作。因此使用多個磁盤可以提高系統的性能。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"磁盤調度","attrs":{}},{"type":"text","text":":提高磁盤系統吞吐率的另一個有效方法是讓磁盤控制器在若干個請求中選擇一個來首先執行,調度大量塊請求的一個簡單而有效的方法就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"電梯算法","attrs":{}},{"type":"text","text":"。回憶一下電梯的運行方式,它並不是嚴格按先來後到的順序爲乘客服務,而是從建築物的底層到頂層,然後再返回來。同樣,我們把磁盤看作是在做橫跨磁盤的掃描,從柱面最內圈到最外圈,然後再返回來,正如電梯做垂直運動一樣。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"預取數據","attrs":{}},{"type":"text","text":":在一些應用中,我們是可以預測從磁盤請求塊的順序的。因此我們就可以在需要這些塊之前就將它們裝入主存。這樣做的好處是我們能較好的調度磁盤,比如採用前文的電梯算法來減少訪問塊所需要的平均時間。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"磁盤故障","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果事情都像我們一開始設計的那樣進行,那世界肯定會變得特別無聊。磁盤偶爾也會耍耍小脾氣,甚至是罷工不幹了。比如在讀寫某個扇區一次嘗試沒有成功,但是反覆嘗試後有成功讀寫了,我們稱之爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"間歇性故障","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一種更爲嚴重的故障形式是,一個或多個二進制位永久的損壞了,所以不管我們嘗試多少次都不可能成功,這種故障稱之爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"介質損壞","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一種相關的錯誤類型稱之爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"寫故障","attrs":{}},{"type":"text","text":",當我們企圖寫一個扇區時,既不能正確的寫,也不能檢索先前寫入的扇區,發生這種情況的一種可能原因就是在寫過程中斷電了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然肯定最嚴重的就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"磁盤崩潰","attrs":{}},{"type":"text","text":",這種故障中,整個磁盤都變爲永久不可讀,這是多麼可怕的事情。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"既然會出現上面所述的各種大小故障,那麼我們就必須要採取各種措施去應對大大小小的變故,保證系統能正常運行。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"規避故障","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們嘗試讀一個磁盤塊,但是該磁盤塊的正確內容沒有被傳送到磁盤控制器中,就是一個間歇性故障發生了。那麼問題是控制器如何能判斷傳入的內容是否正確呢?答案就是使用","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"校驗和","attrs":{}},{"type":"text","text":",即在每個扇區使用若干個附加位。在讀出時如果我們發現校驗和對數據位不合適,那麼我們就知道有錯誤;如果校驗和正確,磁盤讀取仍然有很小的可能是不正確的,但是我們可以通過增加趣多校驗位來降低讀取不正確發生的概率。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此處我們使用奇偶校驗來舉例,通過設置一個校驗位使得二進制集合中 1 的個數總是偶數。比如某個扇區的二進制位序列是 01101000,那麼就有奇數個 1,所以奇偶位是 1,這個序列加上它後面的奇偶位,就有 011010001;而如果所給的序列是 11101110,那麼奇偶位就是 0。所以每一個加上了奇偶位構成的 9 位序列都有偶數奇偶性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"儘管校驗和幾乎能正確檢測出介質故障或讀寫故障的存在,但是它卻不能幫助我們糾正錯誤。爲了處理這個問題,我們可以在一個或多個磁盤中執行一個被稱爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"穩定存儲","attrs":{}},{"type":"text","text":"的策略。通常的思想是,扇區時成對的,每一對代表一個扇區內容 X。我們把代表 X 的扇區對分別稱爲左拷貝 XL和右拷貝XR。這樣實際上就是每個扇區的內容都存儲了兩份,操作XL失敗,那麼去操作XR就可以了,更何況我們還在每個扇區中有校驗和,把錯誤的概率就大大降低了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"到現在爲止,我們討論的都是簡單的故障,但是如果發生了磁盤崩潰,其中的數據被永久破壞。而且數據沒有備份到另一種介質中,對於銀行金融系統這將是巨大的災難,遇到這種情況我們應該怎麼辦呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"數據恢復","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應對磁盤故障最簡單的方式就是鏡像磁盤,即我們常說的備份。回憶一下寫畢業論文時的做法,那時候大部分同學還不會用版本控制器,所以基本採用每天備份一次數據,並且在文件名稱中標註日期,以此來達到備份的效果。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二種方式是使用奇偶塊,比如一個系統中有 3 個磁盤,那麼我們再加一個磁盤作爲冗餘盤。在冗餘盤中,第 i 塊由所有數據盤的第 i 塊奇偶校驗位組成。也就是說,所有第 I 塊的第 j 位,包括數據盤和冗餘盤,在它們中間必須有偶數個 1,冗餘盤的作用就是讓這個條件爲真。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們舉個簡單例子,假設快僅由一個字節組成,我們有三個數據盤和一個冗餘盤,對應的位序列如下。其中 盤4 爲冗餘盤,它的位序列是根據前面三個盤計算出來的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":""},"content":[{"type":"text","text":"盤 1:11110000\n盤 2:10101010\n盤 3:00111000\n盤 4:01100010","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"假設現在某個盤崩潰了,那麼我們就能根據上面的序列來恢復數據,只需要讓每一列 1 的個數爲偶數就可以了,但是這種冗餘方式也存在很大的不足。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一個缺陷是,如果是兩個盤同時崩潰了,那數據也恢復不出來了。第二個問題在於,雖然讀數據只需要一次 I/O 操作即可,但是寫數據時就不一樣了,因爲需要根據其他數據盤來計算冗餘盤中的位序列,假設共有 n 個盤,其中一個爲冗餘盤,所以每次寫數據時,都需要進行 n+1 次 I/O 操作(讀不被寫入的 n-1 個盤,被重寫數據盤的一次寫,冗餘盤的一次寫),而 I/O操作又是非常耗時的操作,所以這種方法會大大拖慢系統性能。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一種方案是沒有明顯的冗餘盤,而是把每個磁盤作爲某些塊的冗餘盤來處理。比如現在有 4 個盤,0 號磁盤將作爲編號爲 4、8、12 等柱面的冗餘,而 1 號磁盤作爲編號爲 1、5、9 等塊的冗餘......","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一種更爲先進的方式使用海明碼來幫助從故障中恢復數據,它在多個磁盤崩潰的情況下也能恢復出數據,也是 RAID 的最高等級,由於本人水平有限,用文字表達不清楚,就不作介紹了,嘿嘿。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章