【发布时间】:2014-01-02 10:20:14
【问题描述】:
我有多个客户端访问 Mongo 集群。有时他们需要创建新的集合。他们在进行任何插入之前调用 ensureIndex。
现在我想对这些集合进行分片。我打算让每个客户端在插入新集合之前调用 shardCollection。但是客户端之间并没有相互协调,因此多个客户端可能会同时在同一个(新)集合上调用 shardCollection。 (他们会先检查集合是否存在,但存在不可避免的竞争条件。)
Mongo shardCollection documentation 说:
警告:不要同时对同一个集合运行多个 shardCollection 命令。
这是否意味着我必须协调客户,或从专门的单独流程预先创建集合? (可能的集合不是有限的,因此很难预先创建。)
或者有没有办法让两个并行的 shardCollection 调用安全?我可以保证:
- 对 shardCollection 的多次调用将是相同的(相同的分片键等)。
- 每个应用程序在执行任何插入操作之前都会等待其对 shardCollection 的调用完成。
- 因此,在插入任何文档之前,shardCollection 将在空集合上至少成功完成一次。
最后,Mongo shell 命令sh.shardCollection 不包含上述警告。它是在 Mongo shell 中实现的,所以我的驱动程序(reactivemongo)不提供它。这是否意味着它包含一些我应该复制的逻辑?
基本原理:我的收藏按日期和其他参数进行逻辑分区。也就是说,集合名称指定了日期和其他参数。在第一次插入之前,我创建了我需要的每个集合,并调用了 ensureIndex。这使我能够有效地删除/备份/恢复旧集合。
【问题讨论】: