网络上有很多人在鼓吹对象存储是未来,文件存储是old school,但是我认为这种说法不正确,是他人的误解或者误导。
文件存储和对象存储有共同点:都可以在多个客户端之间分享非结构化数据。
但是最大差别是:语义。
对象存储适合的场景:
1、一次写,不修改,多次读。上传结束就是文件修改结束。(比如互联网的图片,音视频等)
2、基本没有随机访问共享数据内部位置的需求。如果有,你得先顺序完整的把数据从对象存储下载到本地,在本地文件系统上想顺序顺序,想随机随机。
3、没有多个客户端同时修改一个文件的需求。
4、平坦结构,没有类似目录的层级关系。(有人会挑战说:对象的key可以是个带有/前缀字符串来模拟目录,但其实跟文件目录差距非常大,后面我们讨论)
文件存储适合的场景:
1、可以修改文件数据,随时修改,随时读。文件系统没有文件“修改结束”这个概念。
2、支持文件内容的随机访问。
3、多客户端通过文件系统高效交换数据,客户端A写数据(修改数据),客户端B读数据。我们可以比较一下在此应用场景下文件存储和对象存储的异同。文件存储:客户端A直接写共享文件存储上的文件,写完之后关闭。客户端B直接打开共享存储上文件读。对象存储:客户端A在本地写数据,写完数据,要把整个文件上传至对象存储,客户端B下载数据到客户端B的本地,然后再打开本地文件读文件。可以发现对象写本地,上传远端,相当于写了文件两次;下载到本地,读本地文件,相当于读了文件两次。从交换数据的效率来看,频繁在客户端之间交换数据的应用场景不适合对象,适合文件。因此高通量计算/批量计算基本上倾向于文件存储。
4、文件存储支持两个客户端同时修改一个文件,比如高性能计算MPI。
5、无论是NAS还是私有客户端的共享文件存储基本上都会为了性能设计客户端的缓存系统,因此性能比较高。对象存储的客户端自己是不带缓存系统的,因为对象操作的数据要不就是本地数据待上传,要不就是得把数据完全下载到本地才能访问,因此不需要什么客户端缓存系统,性能角度要比文件存储差。文件存储既然客户端有缓存,那么就要考虑缓存的一致性(无论是弱一致还是强一致)都会增加文件系统的实现复杂度。
6、文件有目录层级关系。文件的目录和对象里的key带有/前缀有啥差别?差别可大了,考虑下文件系统rename/mv高层目录,对文件系统而言只是目录改名,底下的文件,子目录无影响,代价很小。对象存储prefix如果想模拟目录改名那么只能是所有带有prefix的key的批量更新,代价很大。
7、文件存储中各种软/硬链接等复杂语义对象存储都没有对应的实现。(很多人认为文件存储是个树形结构,其实是误解,因为有hardlink存在,所以文件存储系统虽然有目录树,但是是个图结构,两个树枝的叶节点可以交汇—一个文件的两个dentry存在于不同的目录下)。
总的来说目前的对象存储语义比文件存储简单,功能不太一样,因此没有替代关系。对象存储实现难度比文件存储系统小的多。如果要想用对象模拟所有文件系统的语义,以满足文件的应用场景需求不是不可行!要不就是在应用层封装和改造,要不就是在对象系统本身丰富语义实现。但是如果能满足了所有文件系统的语义要求,对象存储也就跟文件系统一样复杂了,那时候还要把对象存储叫对象存储么?也许会有概念创造者会创造出一个不同于文件、对象的新名词。但本质可能不过是新瓶装旧酒。
结论是:文件存储和对象存储用在不同的地方,应用场景的不同是语义决定的。对象存储取代不了文件存储系统。