1

我需要在后台线程中同时更新整个集合,但读取操作可能同时发生。当我对它进行基准测试时,更新集合大约需要 3 秒。有没有办法在更新集合时锁定集合?我尝试创建一个新集合并将所有文档插入其中并使用“dropToTarget=true”将其重命名为原始集合,但我不确定它在分片方面的安全性和稳定性。我读到 renameCollection 与分片不兼容。

如果有人可以建议是否有一个好主意,那就太好了。

谢谢。

4

1 回答 1

0

您是否提出了两种可能的策略来更新您的集合,一种是内联锁定,另一种是临时集合?

正如 mongodb 文档明确指出的那样,它不适用于分片集合(http://docs.mongodb.org/manual/reference/command/renameCollection/)。据我了解,这意味着您要重命名的集合没有被分片,因为您需要在进行实际重命名之前删除其他集合,您很可能会丢失任何以前保留的分片(-信息)。所以你需要重新激活分片。我强烈建议不要使用这两种收集方法,尤其是在您对数据进行分片时。
您需要从分片集合中获取所有数据并将其集中存储,一旦完成更新,您需要重命名集合并再次对其进行分片。这将为您的整个系统带来大量 I/O,尤其是对于进行更新的客户端。

取决于您的系统架构(具有单入口点)。您可以轻松地持有一些全局标志,告诉您当前是否正在运行集合更新。禁止其他写操作。
对于 MongoDB 的多入口点,您可以尝试 $isolated,但这不适用于分片集合。而且我不确定它是否允许读取操作,文档不是很清楚。

是否严格禁止在更新过程中写入任何数据?您执行什么类型的更新。他们能互相影响吗?或者是否有可能进行并发写入?

于 2013-04-16T07:00:59.710 回答