In this chapter, we discuss how mass storage—the nonvolatile storage sys- tem of a computer—is structured. The main mass-storage system in modern computers is secondary storage, which is usually provided by hard disk drives (HDD) and nonvolatile memory (NVM) devices. Some systems also have slower, larger, tertiary storage, generally consisting of magnetic tape, optical disks, or even cloud storage.

Because the most common and important storage devices in modern com- puter systems are HDDs and NVM devices, the bulk of this chapter is devoted to discussing these two types of storage. We first describe their physical struc- ture. We then consider scheduling algorithms, which schedule the order of I/Os to maximize performance. Next, we discuss device formatting and manage- ment of boot blocks, damaged blocks, and swap space. Finally, we examine the structure of RAID systems.

There are many types of mass storage, and we use the general term non- volatile storage (NVS) or talk about storage “drives” when the discussion includes all types. Particular devices, such as HDDs and NVM devices, are specified as appropriate.

1. Overview of Mass-Storage Structure

Hard Disk Drive (HDD)

  • HDD 由多個像 CD 的磁碟組成,稱作 platter。利用磁碟上的磁性物質可以記錄資訊
  • 每一個 platter 都會有兩個讀寫頭 (read-write head),一個讀正面另一個反面,並且都會接連在各自的 disk arm 上,disk arm 會一次移動所有的讀寫頭
  • 每一個 platter 會依據半徑分成多個 tracks,並可在細分成多個 sectors,每個 platter 上半徑相同的 tracks 組成一個 cylinder
  • sector 是最小的 transfer unit,也就是我們常說的 block size

  • transfer rate 是指資料在 drive 跟 computer 之間傳送的速率
  • position timerandom-access time 是指讀寫頭找到目標所需的時間,包含兩個部分:seek time,讀寫頭透過伸縮找到目標 cylinder 所需的時間;rotational latency,透過 platter 的旋轉讓讀寫頭對到目標 sector 所需的時間。HDD 的 random-access time 通常在 ms 等級
  • 讀寫頭在移動的過程中撞擊到磁碟稱為 head crash,這種傷害通常是不可逆的

Nonvolatile Memory Devices (NVM)

  • solid-state drive (SSD)USB drive 都是 NVM 的一種
  • 相較於 HDD,NVM 的可靠性比較高,因為他並沒有需要移動的部分;速度上也比 HDD 快速,因為沒有 seek time and rotational latency
  • NVM 的讀寫其中一個 page 都很有效率,但當想要將資料覆蓋掉時,得先進行 erase,因為必須一次 erase 整個 block (包含多個 page),這個 operation 相對於讀寫就相當的緩慢
  • NVM 的 lifespan 通常使用 Drive Wrriten Per Day (DWPD) 來衡量,即在保固期之前,這個 NVM 可以每天寫入的最大次數

NAND Flash Controller Algorithms

  • 為了更高的效率,NVM 通常會等到一個 block 裡都是 invalid page 時才進行 erase,而 flash translation layer (FTL) 便會負責記錄需要的資訊:
    1. 哪個 page 目前是 valid 的
    2. 哪個 block 裡只有 invalid pages
  • 一個 write request 發生時,可能會發生沒有 free block 的情況,這種時候就會啟動 garbage collection 的機制,將 good data (valid page) 複製到其他地方,並把原本的 block erase 掉
  • 但既然都沒有 free block 了,這些 good data 要複製去哪裡?為了解決這個問題,NVM device 會採用 over-provisioning 的方法,也就是分離出一部分的 pages (通常是 20%),並保持他們永遠都是可寫的狀態。在進行 garbage collection 時,被 erased 的 block 就會加入 over-provisioning space
  • Over-provisioning space 也有助於 wear leveling,因為在 NVM 中,如果有某些 block 不斷的被寫入又 erase,會降低整體的 lifespan,所以 controller 會想辦法優先將資料寫進較少使用的 block (從 over-provisioning space 挑選) 中
  • NVM 與 HDD 一樣,會 provide error-correcting codes,並會在出錯的時候優先試圖修復

Volatile Memory

  • RAM drives 是 device driver 從系統的 DRAM 切出一小塊作為 temporary storage,對於電腦中的其他人來說,RAM drive 看起來就像是 second storage 一樣
  • RAM drives 擁有很高的讀寫速度,甚至快過 NVM,因此很適合作為 process 存放暫存檔的目標

Address Mapping

  • 當 computer 需要取用 storage 時,為了方便會將他們視為一維陣列的 logical blocks
  • 需要某種機制將 logical block address (LBA) 轉換成 storage device 的 physical address,如 HDD 的 (cylider, track, sector) tuple,或是 SSD 的 (chip, block, page) tuple
  • 以 HDD 為例,這個 translation 會有以下困難點:
    • Drives 中可能會有壞掉的 sector,這些 sector 就必須由其他好的 sector 補上,造成 physical address 不連續
    • 每一個 track 上的 sector 數目可能不同
  • HDD 在 “density of bits per track” 上可以分成兩種:
    • Constant linear velocity (CLV) - 每個 track 上的 sector 密度是相同的,但這也表示當讀寫頭正在讀取靠近內側的 track 時,需要加快轉速以保持同樣的讀寫速率
    • Constant angular velocity (CAV) - 內側的 track 有比較少的 sector,外側的則較多,這種設計可以讓可以讓不同 track 之間保持相同轉速

2. HDD Scheduling

  • 一個 device 的 bandwidth,是總共傳送的 bytes,除以總共的傳送時間 (從第一個 request 到最後一個 transfer 完成)
  • 一個 request 通常會包含以下資訊:
    • 這個 operation 是 input 來勢 output
    • 要讀寫哪一個 file
    • transfer 的 memory address 為何
    • transfer 的大小
  • 當有多個 request 正在 device queue 等待時,我們可以使用不同的 schduling algorithm 來重新編排他們的順序以達到更好的效能
  • 以前的 HDD 在讀寫時需要指明 track and head,這樣會使得 scheduling 變得相對複雜。現今的 HDD 只需要提供 LBA 即可,device 會自動將 LBA map 到 physical address
  • 在以下的 scheduling 情況中,我們假設相近的 LBA 代表相近的 physical address

FCFS Scheduling

  • 簡單的先到先處理 scheduling,理論上來講最為公平,但通常會耗費大量時間在移動讀寫頭

Example

SCAN Scheduling

  • 讀寫頭從某一個 cylinder 開始,先往內側移動,並逐一讀取有 request 的 cylinder,到最內側後再回頭掃描
  • 假設每個 cylinder 的 request 是 uniform distribution,那這個 scheduling 最大的問題就是剛回頭的時候,會先服務到才剛服務完的 cylinder

Example

C-SCAN Scheduling

  • Circular SCAN (C-SCAN) scheduling 是 SCAN scheduling 的一種變形,在讀寫頭走到盡頭時,不會回頭而是會從另一個盡頭重新開始

Example

Selection of Disk-Scheduling Algorithm

  • 上述提到的 scheduling algorithm 都有可能發生 starvation 的問題,因此在 Linux 中使用的是 deadline scheduler,而在 RHEL 7 也有使用 Completely Fair Queueing scheduler (CFQ)

Deadline Scheduler

  • Deadline scheduler 總共會 maintain 四個 queues:兩個 read queues 跟兩個 write queues,分別會以 LBA order 跟 FCFS order 進行排序
  • I/O request 會以一個 LBA batch 作為單位一次傳送,也就是一群擁有相近 LBA 的 request
  • 在選擇要哪一個 batch 時會優先選擇 LBA queue,也就是以 C-SCAN 的方法進行 scheduling。但當 FCFS queue 中有等待過久的 request (等待時間大於某一個 threshold),就會先選擇該 request 所處的 batch
  • 通常 read queue 的優先序會高於 write queue,因為 process 比較容易在 read 的時候 block 住

Completely Fair Queueing Scheduler (CFQ)

  • CFQ 通常是在負責 schedule SATA drives
  • CFQ 最特別的一點是會去分析歷史資料,預測某個重要 process 可能會在接下來進行 I/O,並這這時忽略其他等待的 request,讓這個 process 可以「插隊」

3. NVM Scheduling

  • NVM 不像 HDD 需要移動讀寫頭,因此上述的 scheduling algorithm 便不適用於 NVM
  • Linux 的 NOOP scheduler 是專門為 NVM 設計的 scheduler。基礎上使用 FCFS policy 並會合併 address 鄰近的 request (如:在同一個 block 裡) 一起進行
  • I/O 通常分為兩大類:sequential-access I/O and random-access I/O,因為不用移動讀寫頭,NVM 在 random-access I/O 擁有很大的效率優勢
  • 但在 sequential-access 上,NVM 的優勢就沒有那麼大了,尤其是 handle write request 時,NVM 的 write performance 會取決於 device 的剩餘空間,剩餘空間越少就可能導致越慢的寫入速度 (回想 garbage collection 和 over-provisioning)
  • 當所有 block 都是滿的狀態時,一個 write request 會導致 a page write (the data itself), one or more page reads (by garbage collection), and one or more page writes (of good data from the garbage-collected blocks)。這種因為一個 write request 而觸發其他 I/O request 的現象稱作 write amplification

4. Error Detection and Correction

  • 常用的 error detection 有:
    • Checksums - 利用 modular 運算等將資料轉成固定長度的字串並存放。Parity bit (計算資料中 1-bit 的數量是奇是偶) 就是一種 checksum
    • Cyclic redundancy check (CRCs) - 利用 hash function 來偵測多個 bits 的錯誤
  • Error-correction code (ECC) 不僅會偵測資料錯誤,也會試圖改正它。ECC 裡通常會存有每個 bit 的資訊,如此便可得知哪一個 bit 被改變了,以及改變前的值為何。
  • 當 controller 藉由 ECC 偵測到錯誤時,他會發起一個 soft error 警報並進行改正,但若太多 error 發生,無法恢復的話,controller 便會發起 hard error 的警報
  • 在 HDD 中會自動進行 per-sector ECC 的運算,在 NVM 中會自動進行 per-page ECC 的運算

5. Storage Device Management

Drive Formatting, Partitions, and Volumes

  • 對於一個全新的 storage device,需要先經過一些 initialization 才能開始使用,這個 process 叫做 low-level formatting 或是 physical formatting
  • 在 format 的過程中會在每個 storage location (sector/page) 寫入相同的 data structure,通常包含 header、data area、跟 trailer,header 跟 trailer 會存放 controller 需要的資訊,如 sector/page number、error detection or error correction code 等
  • 在進行 format 前也可以選擇 sector size (通常是 4KB or 512B),選擇大的 sector size 的話可以減少 header/trailer 的數量,增加可用空間,但也會減少一個 track 上的 sector 數目
  • 在系統可以使用這些 storage 之前,需要經過三個步驟:
    1. 將 device 分成一個或多個 partition,若 partition 時拿來給 file system 用的話,還需將 partition mount 到系統中的指定位置上,已讓系統得以 aceess
    2. 在 partition 中創建 volume。有時候這個動作是不用特意去做的,比如當我們在 partition 中建立 file system 時,volume 就會自動創建好;其他時候如要建立 RAID structure 時,就需要手動創建每一個 partition 中的
      • volume 是一塊只有單一個 file system 的 accessible storage area,「通常」建立在一個 partition 上
      • partition 跟 volume 是不同的。OS 可以 access 一個 partition,但他沒辦法 access partition 裡的 file system
    3. 最後要進行 logical formatting,也就是建立 file system

  • 有些 partition 可能包含了 bootable file system,通常這類的 partition 會在電腦開機時被 mount 到系統的 root
  • 為了效率,file system 通常會將多個 block 結合成一個 cluster,也就是說 file system 的 I/O 是經由 cluster,而 device 的 I/O 則是經由 block
  • 有時候 OS 會允許某些 program 可以不在 file system 的幫助下直接 access 某一個 partition,這種情況下我們稱被 access 的 partition 為 raw disk,而此種 I/O 則被稱為 raw I/O。這麼做可以跳過 file system 所可能造成的 overhead,如 buffer cache、file locking 等,但相反的,program 便需要自己將這些事情 handle 好。適合使用 raw I/O 的時機有:swap space、database system

Boot Block

  • 在系統的韌體 (firmware) 中,會存有 bootstrap loader,它的主要功用是將完整的 bootstrap program 從 secondary storage load 到 main memory (這件事會特別需要 bootstrap loader 的原因是,在開機還沒完成前都不會有 device driver 的存在)
  • 這類的 boot program 通常會放在 disk 中某個固定的位置,如在 Windows 中,他就會被放在第一個 logical block / page 中,稱作 master boot record (MBR)
  • MBR 中存有 partition table,列舉出 drive 中的所有 partition,並會有一個特殊的指標指向 boot partition (裡面存有 OS 與 device driver),在 MBR 完成他的工作後,剩下的 booting process 就會交由 boot partition 完成

Bad Blocks

  • 在 HDD 中,會因為讀寫頭的移動而產生 sector 的毀損,稱為 bad blocks
  • bad block 中的資料通常是無法復原的
  • 處理 bad block 的方法有很多,早期的 HDD 只能透過執行指令來掃描是否有 bad block 存在
  • sector sparing or forwarding 是一種自動解決 bad block 的方法,他會預留一部分的 spare sector 不讓 system 使用,並在出現 bad block 時,將原本壞掉的 sector address map 到某一個 spare sector。流程如下:
    • OS 試圖讀取某一個壞掉的 sector
    • controller 在計算該 sector 的 ECC 後,發現他已經壞了,便會回傳 I/O error 給 OS
    • controller 用一個 spare sector 取代 bad sector
    • 以後每次要讀取 bad sector 時就會被 redirect 到 good sector 上了
  • 如果 new sector 跟 bad sector 相差過遠,sector sparcing 可能會造成 scheduling algorithm (i.e. SCAN, C-SCAN) 失去效用,為了解決這個問題,HDD 在設計上會讓每個 cylinder 都保有一些 spare sector,並在取代時「就近解決」
  • 另一種解決 bad block 的方法是 sector slipping,從壞掉的 sector 開始數,到第一個空的 sector 為止,全部都「平移」一格
  • NVM 中也會存在 bad blocks,但因為不需考慮遠近問題,NVM 的 bad blocks 處理就相對單純很多,可以一開始就設定一些 free pages 供未來使用,或直接使用 over-provisioning area

6. Swap-Space Management

  • Swap space 是一個在 secondary storage 的區域,最一開始的用處是把某些 process 移進 swap space,好讓 memory 有更多的空間
  • 但這樣的方法很沒有效率,所以現代 system 大多結合 virtual memory 一次只 swap 一個 page

Swap-Space Loaction

  • Swap space 可以放在兩個地方:被當成一般 file system 的一個檔案,或是在一塊獨立的 raw partition
  • 若放在 file system 中,好處是可以自由 create、resize 等
  • 若放在 raw partition 中,則會由 swap-space storage manager 來進行管理。manager 會專注於加快 swap 的速度,並捨棄 storage efficiency,儘管這樣造成 internal fragmentation,但因為 swap space 會在每次開機時重置,所以並不是太大的問題。
  • 使用 raw partition 作為 swap space 儘管很有效率,但如果想要改變 swap space 的大小,就需要重新做 device 的 partition

Swap-Space Example

  • 在 Solaris 中,swapping 只會發生於 anonymous memory (沒有其他 backup 的 memory,如:stack、heap、uninitialized data) 上,其他的 memory (如:process 的 text segment) 則會被丟出 memory,下一次需要時再去 disk 讀取
  • Solaris 也會在某個 page 必須被 swap out 時,才 allocate swap space (在 file system 中),不會在該 page 進入 memory 時就 allocate
  • 在 Linux 中,swap space 可以是 swap file 或 swap partition 的形式,每個 swap space 中會有一連串的 4KB 大小的 page slots,並且利用 swap map 對應每個 page slot 被 mapped 到的數量 (0 代表沒有存在任何 mapping,也就是 available)

7. Storage Attachment

Host-Attached Storage

  • 可以使用 local I/O ports access 的 sotrage 稱為 host-attached storage
  • 包含 HDD, NVM drives, CD, DVD, 和某些需求量大的工作站或伺服器使用的 fiber channel (FC)

Network-Attached Storage (NAS)

  • NAS 在一個 network 中提供 storage service,可能是一個專門為儲存資料設計的系統,或是一個普通的 computer system 將 storage 提供給其他的 hosts
  • Hosts 藉由 remote procedure call (RPC) 來進行 storage access 的要求,這樣的 protocol 有 NFS(Linux) and CIFS(Windows)
  • NAS 的效率通常會比 host-attached storage 還要低
  • 新出現的 iSCSI protocol 會直接將整個 block 傳送到 client 端,讓 client 得以直接 access file system,就像 directly attached 一樣

Cloud Storage

  • Cloud storage 跟 NAS 很像,都是透過網路讓使用者可以 access storage
  • Cloud storage 與 NAS 有兩個最大的不同點:
    • Cloud storage 的 server / client 通常不在同一個 LAN 裡,也就是訊息是透過 WAN 傳送的;NAS server 則通常會跟 client 在同一個 LAN 裡
    • 因為 WAN 的延遲與出錯率較高,所以不適用以 protocol 的方式傳送資料 (如:NFS、CIFS、iSCSI),cloud storage 通常使用 API-based 的方法來 access storge

Storage-Area Networks and Storage Arrays

  • NAS 最大的問題是在進行 storage I/O 時,也會佔到原本網路的頻寬,尤其是當 server 使用 NAS 來存取資料時,就會發生 storage I/O 與 server-client connection 搶頻寬的問題
  • 為了解決這個問題,可以使用 storage-area network。SAN 是與 server(s) 連接的 private network,不會與 client 有衝突,並且 storage 跟 server 間不會經過 routing,所以速度會比 NAS 來得快
  • Storage array 簡單來說就是一大堆 storage devices 與 controller 組合在一起的裝置,通常會有 SAN port 或 network port

8. RAID Structure

  • RAID 是 redundant arrays of independent disk 的簡稱,主要有兩個使用時機:增加可靠性或增加效率

Improvement of Reliablilty via Redundancy

  • HDD 的出錯率相較於 SSD 來得高,因此可以透過增加 HDD 的數目,來降低出錯率
  • 最簡單的方法是準備兩倍數量的 HDD,也就是每一顆硬碟都會有自己的備份,這樣的技術稱為 mirroring,而這樣的結構稱為 mirrored volume

Improvement in Performance via Parallelism

  • 利用平行化來增進效率,可以分成兩種方向:
    • 同時 handle 多個 request
    • 同時讀寫一筆資料的多個部分
  • 使用 mirroring 的話,便可平行執行兩個 read request,讀寫速度與單個硬碟是一樣的,但單位時間內完成的 read 會是原本得兩倍
  • 透過 data striping 的技術,將資料分成多個區塊儲存在不同硬碟中,便可同時讀寫增進效率,$N$ 個硬碟同時只能 handle 一個 request,但讀寫效率會提升成 $N$ 倍。資料切割的方法有很多,如:bit-level striping、block-level strping 等

RAID Levels

RAID 0

  • RAID 0 會將資料平均分攤在所有的硬碟中,提供最高效率的讀寫,但不會增進可靠度

RAID 1

  • RAID 1 就是 drive mirroring,總共會有兩倍的硬碟,提供很高的可靠度,但缺點是造價高昂、性價比低 (總共只能存容量一半的資料)

RAID 4

  • 總共會有 $N$ 個存取資料的硬碟,以及 1 個專門存 parity 的硬碟
  • 在寫入資料時,會把第一個 block 的資料寫在第一個硬碟、第二個 block 的資料寫在第二個硬碟,以此類推
  • 存放 parity 的硬碟裡,會存放所有 $N$ 個硬碟中相對 bits (共 $N$ 個) 的 parity。當有某個硬碟的某個 sector 出錯時,我們可以透過其他 $N-1$ 個 sectors 中的資訊與對應的 parity sector 復原
  • 對於長度長 (超過一個 block) 的 read request,RAID 4 可以做到高的 transfer rate,因為分散在多個硬碟的資料可以平行讀取;同樣的,長度長的 write request 也可以透過同樣的概念平行寫入多個硬碟及 parity drive
  • RAID 4 可以任意的增加硬碟的數量,因為只要新硬碟有被初始化成 0,就可以在不改動 parity 的情況下加入硬碟陣列
  • RAID 4 (或所有 parity-based RAID) 會有計算 parity 的 overhead,但現代電腦的 CPU 速度遠快於 I/O,因此計算延遲幾乎可忽略不計。另外,也可以透過 cachebuffering (集滿要寫入 $N$ 個硬碟的資料後再一起寫入) 的設計進一步加速 RAID 4

RAID 5

  • RAID 4 有另一個大問題:parity drive 相較於其他的 drive 必須更頻繁的被讀寫,因此可能會比其他硬碟更早故障
  • RAID 5 為了解決這個問題,便把 parity block 分散存於每個 drive 中,所有硬碟的第 $n$ 個 block 的 parity 會存在第 $(n$ mod $N)+1$ 個硬碟的第 $n$ 個 block
  • RAID 5 是目前最廣泛使用的 parity RAID

RAID 6

  • RAID 6 又被稱為 P+Q redundancy scheme,是 RAID 5 的強化版,總共會存兩份的 redundant data,也就是總共會有 $N+2$ 個 drive
  • Q 存的東西不是 parity (這樣不會提供多餘的資訊),可能使用 Galois field math 來計算 Q 的 ECC

Multidimensional RAID 6

  • 當硬碟數量很多的時候,我們可能會希望有更高的可靠性,而不是幾百個硬碟只共用兩個 parity drives
  • Multidimensional RAID 6 會將硬碟建立成邏輯上的矩陣,並且每一個 row / column 都會提供分散的 P+Q blocks
  • 下圖中將 P & Q 集合成一個 drive 是為了簡化,事實上會將他們分散在各個 drive 中

RAID 1+0 and RAID 0+1

  • RAID 1+0 與 RAID 0+1 都是結合 RAID 0 與 RAID 1 的結構,同時提供可靠度與效率;這兩種結構的效率通常會比 RAID 5 來得好,但同時也和 RAID 1 一樣有造價高昂的問題
  • RAID 1+0 會先將資料進行 mirror,然後再將 mirrored pairs 平均分攤在多個硬碟上
  • RAID 0+1 會先將資料平均分攤在一部分 (1/2、1/3…看要備份多少份) 的硬碟上,然後再進行 mirror
  • 如果有一個硬碟壞掉了,RAID 1+0 的結構會使得其他硬碟依舊可以繼續使用不受影響,但若使用 RAID 0+1 的話則會使整個 stripe 的硬碟都無法使用,因為資料是平均分散在這些硬碟上的

  • 實作 RAID 的方式有很多,大致分為以下幾類:
    • kernelsystem software 實作 RAID,好處是 storage hardware 不需要提供跟 RAID 有關的 feature
    • host bus-adapter (HBA) harware 中實作,只有直接連接到 HBA 的硬碟才能被加進 RAID set 中。這種方法成本較低但是缺乏彈性
    • storage array hardware 中實作,這樣會使得由 OS 看來,RAID 看起來就跟普通的 volume 一樣,可以在上面自由的建制 file system 等
    • SAN interconnect layer 實作,會將一個 device 放在 server 與 storage 之間,接收來自 server 的指令並對 storage 做出相對應的管理
  • 另外一些跟 storage 有關的 feature 也可以透過上述的方式實作:
    • Snapshot - 將 file system 當下的狀況記錄下來
    • Replication - 備份時不是備份在同一台電腦,而是紀錄在 remote 的某個地方
  • RAID 的實作通常也會包含 hot spare drive,也就是一個備用硬碟,可以在某個 RAID set 中的硬碟損壞時自動更換

Selecting a RAID Level

  • 在選擇要使用哪一個 RAID Level 時,會考慮很多因素,如:可靠性、效率、成本、磁碟壞掉時所需的重建時間等
  • 對於 RAID 1 這種只有做鏡像的結構,重建就會很容易,但對於有進行 data striping 的 RAID,重建就會比較花時間 (有更高的機率其他磁碟在更換的時候壞掉)
  • RAID 0 通常拿來進行需要高效率但不在意資料遺失的應用,如使用 dataset 的科學計算
  • RAID 1 則適用於需要高可靠性與有快速重建需求的應用
  • RAID 0+1 & RAID 1+0 可以提供可靠性與效率,可以用在小的 database
  • RAID 5 相比於 RAID 1 有較小的 space overhead,適用於存放中型的資料
  • RAID 6 與 multidimensional RAID 6 則通常出現在 storage array 中,給予不錯的 performance 與 protection,也不會有太高的 space overhead

Problems with RAID

  • RAID 會比一般的 disks 更容易出錯,只要 hardware RAID controller 出現錯誤,或 software RAID code 中有 bug,便可能導致所有資料遺失
  • 為了能夠發現並處理這些錯誤,ZFS file system 會將某一個 block 的 checksum,與指向該 block 的 pointer 存在一起。當發生錯誤時,新產生的 checksum 就會對不上。如果有進行 mirroring 的話,便可以自動將 checksum 正確的那一邊的 data 複製到錯誤的那一邊,進行 error correction

  • 另一個 RAID 會遇到的問題是缺乏彈性,當我們確定一個 volume 的大小後,便很難再去改動他,而建置在 volume 上的 file system 通常也不允許做出容量大小的改動
  • 為了解決這個問題,ZFS 將所有的 RAID set 都集合成一個 pool,並且以 malloc()free() 等方法使得各個 file system 可以自由地更改大小

Object Storage

  • Object storage 是將資料以 object 為單位儲存,不同於其他結構如 file system (樹狀結構)、block storage (將資料切成一個一個 block 來儲存)
  • 每一個 object 會有一個 global unique identifier,通常是以 object ID 的形式
  • Object storage 也可以將多台電腦的 storage 結合在一起形成一個 storage pool,相較於 storage array (有容量上限) 會有更高的彈性