Object Storage vs Block Storage

不好寫的話題,裡面有很多的誤區,不過還是來挑戰一下。我認為 Object Storage 跟 block storage 差別主要是架構上的想法,所以並不偏向某個特定的實作。

通常一般人在使用 AWS S3 的時候,一開始都以為他是一個便宜的 cloud file system ,可以大檔案隨便放,並且有很高的可用性。但是為啥 S3 可以做到這件事情呢?因為 S3 其實不是 file system ,他是 object storage

Block Storage

File system 是一種 block storage ,每個 file 分成很多個 block ,block 大小是系統設定的,每個 block 裡面放置一部分 file內容,然後存放在 block storage 裡面,裡面的單元大小叫做 block 。等到要存取的時候,我們可以把我們所需要的 block 取出來,然後操作它。一般來說的 file system ,NAS ,或是 HDFS 其實也只是一個 block size 較大的分布式 block storage 。

Block Storage 好處是 file system 通常是強一致性(strong consistent),然後可以針對 block 來做修改,可以做到 partial modified ,使用場景相當通用,尤其是需要強一致性的 DB ,或是一般檔案系統操作都很好用。

但是壞處是 block storage 在存放檔案數量跟檔案容量都很巨大的 user case(exabyte scale or trillions of file objects) ,通常難以 scale 。

另外,要滿足強一致性(CAP 的 C) ,在跨地理位置(CAP 的 P) 跟可用性(CAP 的 A)上就要做出取捨,這是被 CAP 理論的限制。

Object Storage

Object Storage 簡單講就是儲存的 data 是以 file 為單位,每個 unit 就是一個 file object ,而非 block 為單元。至於實際上怎麼儲存,其實是依賴於底層檔案系統來決定。這個比較像是在 block storage 上面加一層 object 作抽象。在雲端跟大數據的時代,我們越來越需要存放巨量的檔案,並且地理分區的存放備份越來越重要,漸漸的 object storage 越來越吃香。

通常來說,object storage 第一個好處是較“容易 scale” 。Object storage 的 unit 比較少,所以設計上比 block storage 較容易 scale 。想想看,一個巨大的檔案在 block storage 可能有幾萬個 block 要操作,但是在 object storage 只有一個 meta data 要實作,對 management node 設計上較為簡單很多。

另外一個好處是“設計彈性較高”,因為 object storage 根本上就是 block storage 的上層抽象,所以很多東西都可以封裝在 object storage 裡面,所以可以較容易 tradeoff 。

像是為了滿足CAP 理論,如果我們很需要跨地理位置分區存放(P) 跟一制性(A),大部分的 object storage 通常都是利用 eventual consistency 來大做文章,利用短時間的數據不一致窗口來達成提高寫入回應時間(可用性)跟降低實現 cost (async replication )。也因為導入 eventual consistency, 所以通常成本較低

最大的問題也是在 eventual consistency,這個對於需要強一致性的場景就不適合。不過我們還是可以根據場景,實現一些 eventual consistency 的變形,像是

  1. Causal consistency(因果一致性)
  2. Read-your-writes consistency
  3. Session consistency
  4. Monotonic read/write consistency

結語

其實這兩個比較像是架構思維的不同,但是具體還是要看實現。 通常 object storage 做適合使用在大數據場景(exabyte scale or trillions of file objects),不需要強一致性的 static data ,archive data。

--

--