在 S3 兼容存储下的同一“目录”中存储 1 亿个文件?

在 S3 兼容存储下的同一“目录”中存储 1 亿个文件?

我有超过 1 亿个图像文件(书籍封面),作为单个“目录”下的平面文件列表:

/images/000000093e7d1825b346e9fc01387c7e449e1ed7
/images/000000574c67d7b8c5726f7cfd7bb1c5b3ae2ddf
/images/0000005ae12097d69208f6548bf600bd7d270a6f
...

很久以前,这些都存储在 Amazon S3 上,现在存储在 Backblaze B2(与 S3 兼容)上。

到目前为止,一切运行良好:

  • 存储新文件非常快;
  • 检索现有文件非常快。

我正在再次迁移到 iDrive E2(也兼容 S3)。

我正在尝试使用克隆,但在等待rclone copy启动 30 分钟后,我意识到 rclone 直到收到整个文件列表后才开始传输文件。

问题是:

  • rclone ls对目录进行快速基准测试后/images/我发现传输整个文件列表需要近 10 个小时
  • 传输过程中出现任何问题(需要很多天)都会从零开始,迫使 rclone 再次下载整个文件列表
  • 列出文件需要花钱与 B2

我尝试配置 rclone 以仅复制一批文件:

  • rclone copy "backblaze:/images/0000*",无论有没有*,都找不到任何文件
  • rclone copy "backblaze:/images/" --include "/0000*"似乎还会下载整个文件列表,并在客户端上进行过滤

奇怪的是,看起来 rclone 可以毫无问题地从服务器检索给定“目录”下的文件列表,例如/images/,但不能对前缀执行相同操作,例如/images/0000

我认为 S3 以及所有兼容 S3 的存储都将文件路径存储为扁平结构,那/只是一个和其他角色一样的角色,你可以很容易地列出任何前缀下的文件,无论是否以/

我搞错了吗?

我的下一个存储(E2),我应该将文件存储在子目录下吗,例如images/0/0/0/0/images/0/0/0/1等等,就像我们过去在传统文件系统中存储文件一样?

答案1

我意识到 rclone 直到收到整个文件列表后才开始传输文件。

这说明你的问题不是存储提供商的问题,而是 rclone 本身的问题。启动列表流,然后在文件到达时对其进行分块的解决方案比需要整个文件列表才能操作的解决方案更合适。

我认为 S3 以及所有与 S3 兼容的存储都将文件路径存储为平面结构,

S3 肯定就是这样做的,当我第一次遇到它时,它让我这个文件服务器管理员的大脑崩溃了。鉴于这里的问题似乎与元数据有关,而不是文件布局,它可能并不重要。

相关内容