在名为createFirstChunks的操作期间,调用shardCollection和插入同一集合之间似乎存在Mongo中的竞争条件。这在the Mongo source code中的评论中有记录,其中说明了:
TODO:竞争条件,如果我们分割集合并在我们拆分非主要分片时插入数据。
有人在现实生活中显然遇到过这种竞争状况,并且在他的数据库(bug report)中打破了这个集合。
在调用shardCollection之后,我怎么知道它开始插入绝对安全?是否足以完成对shardCollection的调用,或者我是否需要轮询其他一些调用的结果?
答案 0 :(得分:3)
竞争条件不适用于您,用户/管理员/应用程序创建新集合或分割现有连接的情况。
请注意,在非主要分片中拆分时,注释会引用竞争 - 通常当集合被“分片”时,会定义一个块,该块位于分片上,该分片是集合所在的数据库的主要主目录。{{1显示哪个分片是群集中每个数据库的主分片。
有两个单独的命令可以调用sh.status()
类(这是调用shardCollection
的唯一位置)。一个是你正在调用的管理命令createFirstChunks
。另一个是enableSharding
的内部工作,当需要为其输出创建新的分片集合时。你可以see that call here。
由于您没有行使可能容易出现这种假设竞争条件的代码路径,因此我不认为您需要担心它。
您链接的案例可能表现出这种“种族”实际上遇到了另一个问题。他们试图对一个集合进行分片,并在整个操作过程中发生了一些事情并且命令失败了。由于已经创建了块集合,因此它将群集置于重复shardCollection命令失败的状态。这个缺陷在this ticket中被跟踪。
我希望这足以让您得出结论,在shardCollection命令返回成功状态后,您可以安全地继续向其中插入数据。即使集合已经存在并且插入了插件,分片也不应该干扰也不会导致问题。