【问题标题】:Is using Mongo's shardCollection command from multiple clients safe?从多个客户端使用 Mongo 的 shardCollection 命令是否安全?
【发布时间】: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。这使我能够有效地删除/备份/恢复旧集合。

【问题讨论】:

    标签: mongodb sharding


    【解决方案1】:

    假设您通过了所有相关检查(未设置上限、分片键通过、不是系统集合等),那么如果您发出另一个 shardCollection 命令,您应该只会收到集合已分片的消息(请参阅 @987654321 @)。如果您保证命令是相同的(每个命名空间使用相同的分片键),那么您至少要删除竞争请求的竞争条件。

    最大的问题是是否可能存在有问题的竞争条件,即初始 shardCollection 命令尚未完成并且您发出另一个相同的命令以及可能产生的影响 - 我认为唯一要做的就是测试和看实际。您可能只需要在允许运行这样的命令之前实施检查,以避免一开始就出现竞争。

    至于运行命令,如果驱动程序没有为您实现帮助程序,那么他们通常会实现一种运行原始命令的方法。 reactivemongo 就是这种情况(基于these docs),如果您查看 shell 帮助程序代码(不带括号运行),您会注意到它只是对参数进行一些快速的健全性检查,然后是命令调用本身:

    > sh.shardCollection
    function ( fullName , key , unique ) {
    sh._checkFullName( fullName )
    assert( key , "need a key" )
    assert( typeof( key ) == "object" , "key needs to be an object" )
    
    var cmd = { shardCollection : fullName , key : key }
    if ( unique )
    cmd.unique = true;
    
    return sh._adminCommand( cmd );
    }
    

    cmd 变量中存储的字符串是您在构建命令时需要的部分(请注意,它随后会使用 adminCommand 帮助程序针对 admin 数据库运行)。

    【讨论】:

    • 'test and see' 的问题是很难通过测试证明 存在竞争条件。我可以在调用 shardCollection 之前检查集合是否正在或正在被分片,如果有一个可以消除竞争。你建议什么检查(db 命令)?
    • 您可以检查它是否在config.collections 中以确定是否有分片。您可能可以在 config.locks 中查找某些内容,以确定是否已经有运行中的命令,但我必须进行一些检查/测试以查看是否是这种情况
    • 我同意这个。我希望我不会面临任何比赛条件。谢谢。
    猜你喜欢
    • 2021-10-19
    • 2019-11-13
    • 2023-03-17
    • 2022-11-10
    • 2019-09-21
    • 2013-02-01
    • 1970-01-01
    • 2015-04-25
    • 2014-08-02
    相关资源
    最近更新 更多