天天看點

硬碟是如何影響資料庫性能的?

松哥原創的 Spring Boot 視訊教程已經殺青,感興趣的小夥伴戳這裡-->Spring Boot+Vue+微人事視訊教程

前面松哥和大家聊了 CPU 和記憶體對于資料庫性能的影響,但是大家想想,無論如何,資料最終都是要存入硬碟中的,是以硬碟肯定也會影響到資料庫的性能,那麼硬碟到底是如何影響資料庫性能的,今天我們就來簡單聊聊。

硬碟的使用,有四個不同的方向:

  1. 傳統的機械硬碟。
  2. 使用 RAID 增強機械硬碟性能。
  3. 使用固态存儲 SSD。
  4. 使用網絡存儲 NAS 和 SAN。

接下來我們就針對這四個方向逐一進行分析。

1.機械硬碟

這是最為常見的一種硬碟。松哥剛上大學那會,買筆記本電腦,基本上都是這種機械硬碟。不過現在小夥伴們買電腦,應該很多都是固态硬碟了。機械硬碟的特點就是便宜、單盤存儲空間較大,不過問題也很明顯,那就是讀寫較慢,相比于記憶體每秒 10GB 以上的資料傳輸,機械硬碟的資料真的慢的可憐。我剛畢業的時候,有一段時間特别想買 Mac,特别糾結。後來把我的 Windows 筆記本的機械硬碟換成了固态硬碟,開機可以秒開了,才把買 Mac 的想法掐滅了(一滅就是三年,三年後還是入手了 Mac)。

現在主流的機械硬碟基本上都是 7200 轉的 SATA 硬碟,在全速運轉并且是順序讀寫的情況下,性能也就是 150MB~160MB/s 左右;如果涉及到資料庫讀寫等随機性較強的 IO 操作,這個性能還要再下降。

傳統的機械硬碟在讀寫資料的時候,有三個步驟:

  1. 尋道:磁頭定位到資料所在的磁道上,這是一個非常耗時的操作。目前 SATA 硬碟的平均尋道時間一般為 8~10 ms。
  2. 旋轉延遲:到了特定的磁道之後,硬碟盤片需要旋轉,以便要讀寫的扇區能夠和磁頭吻合。7200 轉的硬碟,旋轉一周的時間為 1000/120=8.33 毫秒,平均旋轉延時則為 4.17 毫秒左右。
  3. 資料傳輸:磁頭定位到需要讀取的扇區之後,開始傳輸資料。假設硬碟順序讀取的平均速度為 150MB/s,則讀取 4KB 的資料需要

    4KB*1000/(150*1024KB)=0.026

    毫秒,此值幾乎可以忽略不計。讀取 1MB 的資料需要

    1MB*1000/(150MB)=6.67

    毫秒,可見讀取大塊資料時,其真正用來讀取資料的時間一般也小于尋道時間和旋轉延時的和。

上面三個步驟所耗費的時間,也就是資料讀取的時間。

那麼該如何選擇磁盤呢?我們應該從如下幾個方面來考慮:

  1. 單盤容量盡量大。
  2. 資料傳輸速度盡量快,這個取決于磁盤主軸轉動速度,以及資料存儲在磁盤表面的密度,一般來說,這個并不會成為我們的瓶頸。
  3. 通路時間盡量夠快。
  4. 主軸轉速盡量快,根據上面的介紹,磁盤的轉速會影響到資料的通路時間和讀取時間。
  5. 還有一個就是磁盤的實體尺寸。這個也好了解,磁盤越小,資料讀取速度肯定越快。不過一般來說,磁盤越小,意味着存儲空間可能也會變小,這就和第一點相悖了,在實際選擇中需要權衡。

2.RAID

獨立硬碟備援陣列(RAID, Redundant Array of Independent Disks),以前也叫廉價磁盤備援陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列。RAID 利用虛拟化存儲技術把多個硬碟組合起來,成為一個或多個硬碟陣列組,目的為提升性能或實作資料備援,或是兩者同時提升。

在具體運作中,RAID 層級不同,資料也會以多種模式分散于各個硬碟,RAID 層級的命名會以 RAID 開頭并帶數字,例如:RAID0、RAID1、RAID5、RAID6、RAID7、RAID01、RAID10、RAID50、RAID60,每種層級都有其理論上的優缺點,不同的層級在資料備援和性能提升兩個目标間擷取平衡。

簡單來說,RAID 把多個硬碟組合成為一個邏輯硬碟,是以,作業系統隻會把它當作一個實體硬碟。RAID 常被用在伺服器電腦上,并且常使用完全相同的硬碟作為組合,由于硬碟價格的不斷下降同時 RAID 功能更加有效地與主機闆內建,這使得 RAID 成為普通使用者的一個選擇,特别是需要大容量存儲空間的工作使用 RAID 就特别合适,如:視訊與音頻制作。

我們來看看幾個常見的 RAID 層級:

RAID0

RAID0 亦稱為資料條帶,它将兩個以上的磁盤并聯起來,成為一個大容量的磁盤。在存放資料時,分段後分散存儲在這些磁盤中,因為讀寫時都可以并行處理,是以在所有的級别中,RAID0 的速度是最快的(想當于可以同時讀取兩個磁盤)。但是 RAID0 既沒有備援功能,也不具備容錯能力,如果一個磁盤(實體)損壞,所有資料都會丢失,RAID0 也是實作成本最低的 RAID 模式。在一些不擔心資料丢失的場景下(例如資料備份),可以使用 RAID0。

RAID1

兩組以上的 N 個磁盤互相作鏡像,在一些多線程作業系統中能有很好的讀取速度,理論上讀取速度等于硬碟數量的倍數,與 RAID 0 相同,另外寫入速度有微小的降低(因為要寫到兩個磁盤上去)。RAID1 隻要一個磁盤正常即可維持運作,可靠性最高。

其原理為在主硬碟上存放資料的同時也在鏡像硬碟上寫一樣的資料,當主硬碟(實體)損壞時,鏡像硬碟則代替主硬碟的工作。因為有鏡像硬碟做資料備份,是以 RAID 1 的資料安全性在所有的 RAID 級别上來說是最好的。但無論用多少磁盤做 RAID 1,僅算一個磁盤的容量,是以它又是所有 RAID 中磁盤使用率最低的一個級别。RAID 1 可以在不影響性能的前提下,最大限度保證系統的可靠性和可修複性。

如果用兩個不同大小的磁盤建 RAID 1,可用空間為較小的那個磁盤,較大的磁盤多出來的空間也可以分割成一個區來使用,不會造成浪費。

RAID5

RAID5 也稱之為分布式奇偶校驗磁盤陣列,這種方式通過分布式奇偶校驗塊把資料分散到多個磁盤上,這樣如果任何一個盤資料丢失,都可以從奇偶資料校驗塊中重建。但是如果是兩個盤的資料丢失,則整個資料卷就無法恢複了。

RAID10

RAID 10 是先分割資料再鏡像。首先将所有硬碟分為兩組,先對磁盤做 RAID1,然後再對兩組 RAID1 的磁盤做 RAID 0,是以它的讀寫性能都比較好。

RAID 01 則是跟 RAID 10 的程式相反,先對磁盤做 RAID0,再做 RAID 1。

當 RAID 10 有一個硬碟受損,其餘硬碟會繼續運作,而 RAID 01 隻要有一個硬碟受損,同組 RAID 0 的所有硬碟都會停止運作,隻剩下其他組的硬碟運作,可靠性較低。是以,RAID 10 比 RAID 01 常用,零售主機闆絕大部分支援 RAID 0/1/5/10,但不支援 RAID 01。

那麼選哪種呢?下面這張表比較了不同 RAID 層級各自的特點:

硬碟是如何影響資料庫性能的?

3.固态硬碟

固态硬碟不需要多說,相比于傳統的機械硬碟有如下三個優勢:

  1. 沒有機械結構,不怕震動(震動有可能讓磁頭撞到碟片上劃花碟片導緻損壞)。
  2. 沒有尋道過程,是以讀寫檔案的延遲更低。
  3. 連續讀寫檔案的速度一般比機械硬碟快。

目前SSD的主流接口分為,SATA 3.0、M.2、PCI-E 三種,U.2 和 mSATA 目前并不多見。

SATA 和 M.2 或 PCI-E 的主要差別在于二者采用不同的通道:PCI-E 通道的汽車就像是在高速上行駛,而 SATA 通道的汽車就像是在崎岖山路上行駛,你說哪個速度快?

下面這張表格描述了不同接口的傳輸速率:

硬碟是如何影響資料庫性能的?

相比于機械硬碟,固态硬碟具有更好的随機讀寫功能,順序讀寫其實機械硬碟也不差,但是随機讀寫就會差很多,而資料庫操作中,随機讀寫又很重要,是以固态硬碟的優勢明顯。

4.網絡存儲

網絡存儲其實不太适合存儲資料庫檔案,光是網絡延遲就夠令人崩潰了。不過如果想存放資料庫備份檔案,倒是可以用網絡存儲。另外就是需要注意資料庫伺服器的帶寬要夠用,别上面的東西整了一大堆,最後伺服器帶寬 128KB。。。

參考資料:

  1. https://zhuanlan.zhihu.com/p/19592076
  2. https://ssd.zol.com.cn/676/6766649_all.html