0

我正在开发一个使用多个 docker 容器的项目,这些容器都需要访问相同的文件以进行比较。重要的是,如果一个文件对一个容器可见,那么在它对其他容器可见之间的时间最短。

举个例子,我试图避免这种情况:假设我们有两个文件 A 和 B,以及两个容器 1 和 2。文件 A 都上传到文件系统并大致同时提交以进行比较。紧接着,同样的情况发生在文件 B 上。文件 A 对容器 1 可见且文件 B 对容器 2 可见之后不久。由于文件在分布式文件系统上传播的方式,文件 B 对容器 1 不可见,并且文件 A 对容器 2 不可见。容器 1 现在被告知将文件 A 与所有其他文件进行比较,容器 2 被告知将 B 与所有其他文件进行比较。由于传播延迟,A 和 B 从未相互比较。

我正在尝试在 EFS 和 S3 之间做出决定,以用作存储所有这些文件的地方。我想知道哪个更适合我的需求(或者是否有我不知道的第三种选择)。

文件/容器的特点是: - 所有文件都是平均大小为 2kb 的小文本文件(尽管很少有 10 kb) - 目前总共有 20mb 的文件,但我预计到今年年底会有 1gb - 这些容器不是一个群体 - 每个比较的输出都已经上传到 S3 - 确保每个文件都与其他每个文件进行比较非常重要,因此传播延迟绝对是最重要的因素

(最后一点:如果我最终使用 S3,我可能会使用同步来下拉所有放入存储桶的新文件)

编辑:为了回答 Kannaiyan 的问题,我想要实现的是将每个文件文件与其他文件至少比较一次。我不能准确地说出我在比较什么,但是比较是通过执行一个封闭源代码的 linux 二进制文件来进行的,该二进制文件接收你想要比较的文件和你想要比较的文件(分布式文件系统保存所有我要比较的文件)。它们需要放在容器中,原因有两个:

  1. 二进制文件严重依赖于特定的文件系统设置,并将其容器化可确保文件系统始终正确(我知道它很愚蠢,但二进制文件又是封闭源代码,没有办法绕过它)
  2. 该二进制文件仅在 linux 上运行,并且将其容器化使得在本地机器上进行测试的开发更容易。

最后,随着我们收到越来越多的提交,文件只会随着时间的推移而积累。每个文件在添加到系统后只读取并且从不修改。

4

1 回答 1

0

最后,我认为我最初采用的方法太复杂了。相反,我最终使用 S3 存储所有文件,并使用 DynamoDB 作为最近存储文件的键的缓存。只有在成功上传到 S3 后,才会将密钥添加到 DynamoDB 表中。每当运行比较操作时,容器会同步所需的 S3 目录,然后检查 DynamoDB 以查看是否缺少任何文件。由于 S3 的 read-after-write 一致性,如果任何文件丢失,可以从 S3 中提取它们,而无需等待传播到所有 S3 缓存。这允许几乎立即传播的分布式文件系统。

于 2018-07-18T04:03:36.067 回答