在本章,咱們稍微涉及一些硬件和操做系統層面的事情。數據庫
計算機是由硬件和軟件組成的,而全部軟件的惟一目標就是儘量最大化的利用下層硬件可以提供的特性,完成上層的功能。ide
因此纔會有人說,硬件是骨頭,軟件是血肉,骨頭決定生物的形態,軟件決定生物的神態。不過,依然請放心,咱們不會討論複雜的東西,做爲一個軟件工程師,也沒有人會要求咱們去寫一個磁盤存儲器的硬件驅動代碼~在這裏,咱們只討論那些爲了後面咱們理解軟件存儲而鎖須要掌握的硬件知識。搜索引擎
好了,直入主題,硬盤spa
===硬盤構造介紹===操作系統
所謂的數據存儲,就是把一串很普通的由0和1組成的字節流按照他原來的順序寫入到一種介質裏面去。那麼天然而然,使用電驅動的磁鐵小針快速的改變可磁化介質從而記錄下這些數據就必然是一種很好的選擇。視頻
那麼,下面就請你們跟我一塊兒來看看磁盤的基本構造:blog
磁盤的先祖其實就是磁帶機,相信閱讀本文的讀者應該都使用過錄音機的(95後無辜的看着我。。。)索引
從很小的用來聽音樂的卡片式磁帶機到很大的用來存數據的磁帶卷兒,其實樣子一直都是這樣的(笑)。資源
在使用的過程當中,通常是由一個小電機帶着這個磁帶向着一個方向轉動,而後有一個磁頭以很近的距離來讀取磁場的微妙變化,從而可以讀取到上面記錄的數據的。get
這裏就出現了磁盤中所須要用到的第一個關鍵的組件,電機,他的主要做用在於給予帶動含磁介質向着一個固定的方向轉動,從而能夠保證數據可以被「順序」的讀出和讀入。
然而,當咱們嘗試把這種磁技術應用於計算機的時候,就馬上發現了一個很重要的問題須要解決:
在計算機的應用場景中,數據的讀取可能不徹底是順序的,有可能先讀一下開始位置的數據,而後又讀一下結果位置的數據,最後又須要讀中間位置的數據。而且,這種讀取的跳躍過程是沒法提早預測的。
所以就有一個問題急須要解決,如何可以讓磁介質支持隨機訪問。
讓咱們回想一下磁介質寫入和讀取過程當中須要的關鍵組件:1.磁介質。2.磁頭。3.步進電機。
而隨機訪問則須要可以讓磁頭與磁介質的特定區段進行接觸,從而才能讀取到對應的數據。
那麼,一種選擇是讓介質移動到指定位置,磁頭不動。一種是讓磁頭移動到介質的位置上。
明顯的,把存儲介質移動起來的控制難度要遠遠大於讓磁頭移動。
因此,計算機須要的新的磁存儲模型就出現了:
磁盤使用步進電機保持勻速運動,而後讓磁頭移動來讀取或寫入數據!
不過,雖然磁頭移動已是裏面最輕量的玩意兒了,但他仍然須要一個電機帶動磁頭在磁盤上作尋道操做。
===硬盤塊與原子操做===
而後咱們再來看另一個問題,若是你每次寫入只寫一個bit,那麼由於磁盤在高速旋轉,有大量的數據傳遞性工做,致使磁盤須要頻繁的等待新的命令,這樣會形成磁盤效率很是低下。所以,一次寫一批數據就成了合理的選擇,因此磁盤通常是按照磁盤塊的方式來組織數據的。
經常使用的塊大小是512byte。但由於磁盤的磁頭一次只能寫一個bit,因此依然會面臨斷電了數據寫一半兒怎麼辦的問題。。
解決的方法也不會超出你們的預期,這也是計算機可以作出的最大保證了:
若是告訴你寫成功了,那必定是寫成功了。那失敗怎麼辦?好問題,咱們來分析一下:
一臺計算機,其實只有三個狀態,要麼給電機器運轉,要麼正常關機,要麼異常關機。在正常運轉狀態和正常關機狀態的時候,操做系統均可以保證數據的全部操做都是原子的,由於只須要在關機hook上作完該作的事情,同時不容許有新的請求進來就能夠了。
只有異常關機的狀態略微有點麻煩,首先,由於不管計算機是正常關機仍是異常斷點的關機,這臺計算機在下次給電啓動以前都是不可能服務的,因此就算是有個磁盤塊只寫了一半兒也沒什麼問題。因此問題就轉化成,可否在下次啓動並能提供讀寫服務以前,先把那些寫了一半的數據塊刪掉?(由於沒有給請求方反饋過成功,因此這些未完成的塊原本就不該該存在)
那下一步如何作就很容易能夠想到了。在每次開機的時候判斷一下是不是一次正常的關機,若是不是正常關機,那麼將那些未被標記爲完整寫入的塊所有刪掉。
嗯,這個模式也是貫穿單機有狀態存儲保證數據一致性的主要方法,能夠複用到單機全部須要原子性操做的地方哦~
===讀寫iops與讀寫吞吐量(MBPS)與延遲的關係===
這個概念我估計大部分人都會搞混,包括我在內。
因此我也把目前個人理解給到你們
首先
先來界定什麼叫作一次io.簡單來講,一次io就是應用層發起一次寫入或查詢的請求
那麼這個請求對應到磁盤上面來講呢就是如下幾個操做的集合:
1.磁頭移動到此次請求所對應的磁道
2.等待硬盤旋轉到數據所在的位置
3.讀取數據
天然的,若是想增長磁盤的iops數,就須要讓磁盤在一秒內儘量多的完成用戶的請求,那麼最理想狀態下應該是:減小磁頭的移動,減小硬盤轉到數據所在位置的時間,減小一次請求所要讀寫的數據塊個數。
不過這是個理想狀態,由於請求沒法預測,因此通常來講也只能是追求儘量減小隨機尋道時間(由於這個是幾個iops的參數中影響最大的一個)。
這個指標是面向小數據隨機或順序讀寫應用時候比較看重,好比數據庫。
再來看吞吐量(MBpersecond)
這個指標是磁盤相對比較擅長的指標,他衡量的是數據在單位時間內傳出+傳入這塊磁盤的總數量。
因此若是想增長磁盤的吞吐量指標,就須要讓磁盤在一秒內儘量多的寫入或讀出數據,那麼最理想的狀態下應該是:減小磁頭的移動,減小磁盤轉到數據所在位置的時間,增長一次請求所須要讀寫的數據塊的個數。
好比,若是用戶只有一個請求,而且這個請求是要求順序的將1T的數據寫入到磁盤內。這種狀況就能發揮出磁盤吞吐量的極限了。
這個指標對於通常的數據庫意義不大,但對於視頻、搜索引擎、或大文件存儲這類順序讀寫的應用則比較看重。
延遲
基本上來講,延遲和IOPS是個正比例關係。
爲何這麼說呢?緣由是更大延遲能夠容許計算機作這麼一件事,批量處理:
就比如100個旅客要從北京坐飛機到杭州,飛機是個稀缺資源,咱們假定北京飛杭州要1個小時。
那麼若是一架飛機上只有一個旅客,那麼要飛100次纔可以把這批旅客運到目的地,運送100個旅客的總時間是100個小時,每小時運送旅客數是100/100=1,而若是要是讓先來的旅客等一等,等到100人都作上飛機之後再起飛呢?那麼每小時運送的旅客數就是100/乘客的等待時間+1/1約等於100
這樣略微增長延遲就能夠提高總體的tps量了。不過須要注意的是,這個提高是有上限的,當每架飛機都坐滿了人的時候,那麼飛機的運力就是最終瓶頸,其餘乘客只能等待。
請求數超過伐值後,就只剩下排隊了,系統的運力不可能再有提高了。
====小結===
總結一下磁盤的優點和劣勢:
優點:
技術比較成熟,所以價格相對較低
順序讀寫由於不涉及到大量的機械尋道,因此吞吐量只和磁盤轉速正相關。
劣勢:
只要操做須要大量尋道,畢竟尋道是個機械操做,那麼磁盤的iops和吞吐量會馬上降低不少。
讀取和寫入是按照塊來進行的,通常塊的大小是512bytes,因此一次操做必須一次性的寫入這個數量的數據。
嗯下一篇來介紹磁盤raid與陣列