关于对象存储(Object Storage)与块存储(Block Storage)有很多的误区。我认为 Object Storage 跟 block storage 差别主要是架构上的想法,所以并不偏向某个特定的实作。 通常一般人在使用 AWS S3 的时候,一开始都以为他是一个便宜的 cloud file system ,可以大档案随便放,并且有很高的可用性。但是为啥 S3 可以做到这件事情呢?因为 S3 其实不是 file system ,他是 object storage 。 Block StorageFile 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 StorageObject 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 的变形,像是 - Causal consistency(因果一致性)
- Read-your-writes consistency
- Session consistency
- Monotonic read/write consistency
结语其实这两个比较像是架构思维的不同,但是具体还是要看实现。 通常 object storage 做适合使用在大数据场景(exabyte scale or trillions of file objects),不需要强一致性的 static data ,archive data。
|