mightybruce
2023-08-23 15:02:40 +08:00
你需要一个专门的存储系统。
存储系统总体来分,可以分为:块存储,对象存储和文件存储。
简单一点的小文件存储系统,比如 fastdfs
对象存储系统比如 minio
对象存储适合的场景:
1 、一次写,不修改,多次读。(比如互联网的图片,音视频等)上传结束就是文件修改结束。
2 、基本没有随机访问共享数据内部位置的需求。
3 、没有多个客户端同时修改一个文件的需求。
4 、平坦结构,没有类似目录的层级关系。(有人会挑战说对象的 key 可以是个带有/前缀字符串来模拟目录,但其实跟文件目录差距非常大,后面我们讨论)
文件存储适合的场景:
1 、可以修改文件数据,随时修改,随时读。文件系统没有文件“修改结束”这个概念。
2 、支持文件内容的随机访问。
3 、多客户端通过文件系统交换数据,客户端 1 写数据(修改数据),客户端 2 ,读数据。我们比较一下文件存储和对象存储的异同。文件存储:客户端 1 写共享文件存储上的文件,写完之后关闭。客户端 2 直接打开共享存储上文件读。对象存储:客户端 1 ,在本地写数据,写完数据,要把整个文件上传,客户端 2 下载数据到客户端 2 本地,然后再打开本地文件读文件。可以发现对象写本地,上传远端,相当于写了两次;下载到本地,读本地文件,相当于读了两次。从交换数据的效率来看,频繁在客户端之间交换数据的应用场景不适合对象,适合文件。因此高通量计算/批量计算基本上倾向于文件存储。
4 、文件存储支持两个客户端同时修改一个文件,比如高性能计算 MPI 。
5 、无论是 NAS 还是私有客户端的共享文件存储基本上都会为了性能设计客户端的缓存系统,因此性能比较高。对象存储的客户端自己是不带缓存系统的,因为对象操作的数据要不就是本地数据待上传,要不就是得把数据完全下载到本地才能访问,因此不需要什么客户端缓存系统,性能角度要比文件存储差。
6 、目录层级关系。文件的目录和对象 key 的带有/前缀有啥差别?差别大了,rename/mv 高层目录,对文件系统而言只是目录改名,代价很小。对象存储 prefix 如果想模拟目录改名那么只能是所有带有 prefix 的 key 的批量更新。
7 、文件存储中各种软/硬链接等复杂语义对象存储没有对应的实现。(很多人认为文件存储是个树形结构,其实是错误的,因为有 hardlink 所以文件存储系统是个图结构,两个树枝的叶节点可以交汇)