所以,这就是 MongoDB 所说的:
独立于 secondaryThrottle 设置,块迁移的某些阶段具有以下复制策略:
- 在使用块的新位置更新配置服务器之前,MongoDB 会暂时暂停所有应用程序对正在迁移的集合的所有应用程序读取和写入,并在更新后恢复应用程序读取和写入。块移动要求所有写入在将块移动提交到配置服务器之前和之后都被副本集的大多数成员确认。
- 当传出块迁移完成并发生清理时,必须将所有写入复制到大多数服务器,然后才能进行进一步清理(来自其他传出迁移)或新的传入迁移可以继续。
举一个真实的例子:如果上限是 27850,第一个选项“所有对 productId 值在 18684 到 27851 之间的文档的查询将被路由到 shard0000”是正确的吗?
如果我理解正确,当我开始迁移时,如果我尝试对 productId 值 18684-27850 之间的文档运行查询,MongoDB 已经知道它不必再询问 shard0003,而是它将有将这些文档请求到新的目标分片,从而将请求重定向到 shard0000。
所以,我还没有实际尝试过,但我猜你看到的是,当你运行 db.collection.find() 时,cmd 将“冻结”并且在 MongoDB 成功完成块迁移后,它将检索结果集,对吗?
是和不是!首先config server将移动chunk的所有文档复制到目标服务器,然后在更新chunk文档(一个文档,该文档中的一个值)期间暂停读写,更新过程非常快,所以你实际上不会注意到任何事物。之后,在块之前的服务器上开始清理。
因此,如果您在更新配置服务器块集合的那一刻设法运行 collection.find() 命令,那么您是非常幸运的。如果你设法做到了这一点,你可能不会注意到它,甚至无法衡量这种“缓慢”。