# 文件系統,第 7 部分:可擴展且可靠的文件系統
> 原文:<https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-7%3A-Scalable-and-Reliable-Filesystems>
## 可靠的單磁盤文件系統
## 內核如何以及為何緩存文件系統?
大多數文件系統會在物理內存中緩存大量磁盤數據。在這方面,Linux 特別極端:所有未使用的內存都用作巨型磁盤緩存。
磁盤緩存可能會對整體系統性能產生重大影響,因為磁盤 I / O 速度很慢。對于旋轉磁盤上的隨機訪問請求尤其如此,其中磁盤讀寫延遲由將讀寫磁盤頭移動到正確位置所需的查找時間決定。
為了提高效率,內核會緩存最近使用過的磁盤塊。對于寫入,我們必須在性能和可靠性之間進行權衡:磁盤寫入也可以被緩存(“回寫緩存”),其中修改的磁盤塊存儲在內存中直到被驅逐。或者,可以采用“直寫高速緩存”策略,其中磁盤寫入立即發送到磁盤。后者更安全(因為文件系統修改很快存儲到持久性媒體),但比回寫緩存慢;如果緩存寫入,則可以根據每個磁盤塊的物理位置來延遲和有效地調度它們。
請注意,這是一個簡化的描述,因為固態驅動器(SSD)可以用作輔助回寫緩存。
在讀取或寫入順序數據時,固態磁盤(SSD)和旋轉磁盤都具有改進的性能。因此,操作系統通常可以使用預讀策略來分攤讀取請求成本(例如,旋轉磁盤的時間成本)并且每個請求請求幾個連續的磁盤塊。通過在用戶應用程序需要下一個磁盤塊之前發出下一個磁盤塊的 I / O 請求,可以減少表觀磁盤 I / O 延遲。
## 我的數據很重要!我可以強制將磁盤寫入保存到物理介質并等待它完成嗎?
是的(差不多)。調用`sync`以請求將文件系統更改寫入(刷新)到磁盤。但是,并非所有操作系統都遵循此請求,即使數據從內核緩沖區中逐出,磁盤固件也會使用內部磁盤緩存,或者可能尚未完成更改物理介質。
請注意,您還可以請求使用`fsync(int fd)`將與特定文件描述符關聯的所有更改刷新到磁盤
## 如果我的磁盤在重要操作過程中出現故障怎么辦?
不要擔心大多數現代文件系統都會執行一些稱為 **journalling** 的工作。文件系統在完成一個可能很昂貴的操作之前所做的是它在日志中寫下它將要做什么。在崩潰或失敗的情況下,可以單步執行日志并查看哪些文件已損壞并修復它們。這是一種在存在關鍵數據且沒有明顯備份的情況下搶救硬盤的方法。
## 磁盤發生故障的可能性有多大?
使用“平均時間故障”測量磁盤故障。對于大型陣列,平均故障時間可能非常短。例如,如果 MTTF(單個磁盤)= 30,000 小時,則 MTTF(100 個磁盤)= 30000/100 = 300 小時,即大約 12 天!
## 冗余
## 如何保護數據免受磁盤故障的影響?
簡單!存儲數據兩次!這是“RAID-1”磁盤陣列的主要原理。 RAID 是廉價磁盤冗余陣列的簡稱。通過將寫入復制到另一個(備份磁盤)的磁盤上,只有兩個數據副本。如果一個磁盤發生故障,另一個磁盤將作為唯一的副本,直到可以重新克隆。讀取數據的速度更快(因為可以從任一磁盤請求數據)但寫入速度可能慢兩倍(現在需要為每個磁盤塊寫入發出兩個寫入命令),并且與使用單個磁盤相比,每個磁盤的存儲成本字節加倍。
另一種常見的 RAID 方案是 RAID-0,這意味著可以將文件拆分為兩個磁盤,但如果其中一個磁盤發生故障,則文件將無法恢復。這樣可以減少寫入時間,因為文件的一部分可以寫入硬盤,另一部分寫入硬盤 2。
組合這些系統也很常見。如果您有很多硬盤,請考慮使用 RAID-10。這是您有兩個 RAID-1 系統的地方,但這些系統相互連接在 RAID-0 中。這意味著您可以從減速速度獲得大致相同的速度,但現在任何一個磁盤都可能出現故障,您可以恢復該磁盤。 (如果來自對方 raid 分區的兩個磁盤發生故障,則有可能發生恢復,盡管我們大多數時間都無法進行恢復)。
## 什么是 RAID-3?
RAID-3 使用奇偶校驗碼而不是鏡像數據。對于寫入的每個 N 位,我們將寫入一個額外的位,即“奇偶校驗位”,確保寫入的 1 的總數是偶數。奇偶校驗位寫入另一個磁盤。如果任何一個磁盤(包括奇偶校驗磁盤)丟失,則仍然可以使用其他磁盤的內容計算其內容。

RAID-3 的一個缺點是,無論何時寫入磁盤塊,都將始終寫入奇偶校驗塊。這意味著單獨的磁盤實際上存在瓶頸。實際上,這更有可能導致故障,因為一個磁盤在 100%的時間內被使用,一旦磁盤出現故障,其他磁盤就更容易出現故障。
## RAID-3 對數據丟失的安全性如何?
單個磁盤故障不會導致數據丟失(因為有足夠的數據可以從其余磁盤重建陣列)。當兩個磁盤不可用時將發生數據丟失,因為不再有足夠的數據來重建陣列。我們可以根據修復時間計算出兩個磁盤故障的概率,其中不僅包括插入新磁盤的時間,還包括重建陣列的整個內容所需的時間。
```
MTTF = mean time to failure
MTTR = mean time to repair
N = number of original disks
p = MTTR / (MTTF-one-disk / (N-1))
```
使用典型數字(MTTR = 1 天,MTTF = 1000 天,N-1 = 9,p = 0.009
在重建過程中有另外一個驅動器失敗的可能性為 1%(此時您最好還是希望您仍然可以訪問原始數據。
實際上,修復過程中第二次失敗的可能性可能更高,因為重建陣列是 I / O 密集型的(并且在正常的 I / O 請求活動之上)。這種較高的 I / O 負載也會對磁盤陣列造成壓力
## 什么是 RAID-5?
RAID-5 類似于 RAID-3,只是將檢查塊(奇偶校驗信息)分配給不同塊的不同磁盤。檢查塊通過磁盤陣列“旋轉”。 RAID-5 提供比 RAID-3 更好的讀寫性能,因為不再存在單奇偶校驗磁盤的瓶頸。缺點是您需要更多磁盤才能進行此設置,并且需要使用更復雜的算法

## 分布式存儲
失敗是常見的情況谷歌報告每年有 2-10%的磁盤發生故障現在在單個倉庫中將磁盤數量增加了 60,000 多個...必須經受住不僅僅是磁盤,服務器機架或整個數據中心的故障
解決方案簡單冗余(每個文件 2 或 3 個副本),例如,Google GFS(2001)更高效的冗余(類似于 RAID 3 ++),例如 [Google Colossus 文件系統](http://goo.gl/LwFIy)(~2010):可定制的復制,包括 Reed -Solomon 代碼具有 1.5 倍冗余
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話