当前位置: 首页 > 知识库问答 >
问题:

Mongo分片不删除源分片中分片集合的数据

荀子轩
2023-03-14

我在5台机器上安装了MongoDB 3.2.6,这些机器都形成了由2个碎片组成的碎片集群(每个碎片都是具有主次仲裁器配置的副本集)。

我还有一个数据库,其中包含非常大的集合(约50M记录,200GB),它是通过mongos导入的,mongos将其与其他集合一起放入主分片。

我在该集合上生成了散列ID,这将是我的分片密钥。

在thay之后,我用:

> use admin
> db.runCommand( { enablesharding : "my-database" } )

> use my-database
> sh.shardCollection("my-database.my-collection", { "_id": "hashed" } )

命令返回:

{ "collectionsharded" : "my-database.my-collection", "ok" : 1 }

它开始碎裂。碎片的状态如下所示:

> db.my-collection.getShardingDistribution()
Totals
data : 88.33GiB docs : 45898841 chunks : 2825
Shard my-replica-1 contains 99.89% data, 99.88% docs in cluster, avg obj size on shard : 2KiB
Shard my-replica-2 contains 0.1% data, 0.11% docs in cluster, avg   obj size on shard : 2KiB()

这一切看起来都不错,但问题是,当我通过蒙古人计算我的收藏时,我发现数量正在增加。

当我登录到主副本集(my-replica-1)时,我看到my-collection中的记录数量没有减少,尽管my-replica-2中的记录数量在增加(这是意料之中的),所以我猜mongodb在迁移到第二个碎片时没有从源碎片中删除块。

有人知道这正常吗?如果不正常,为什么会这样?

编辑:事实上,现在它在my-replica-1上开始下降,尽管在mongos上它仍在增长(有时会先下降后上升)。也许这是迁移大型集合时的正常行为,我不知道

伊凡

共有1个答案

宰父正真
2023-03-14

根据此处的文档,您正在观察一个有效的情况。当文档从 a 移动到 b 时只要收到重新定位成功的确认,它就会被计算为该文档的两倍。

在分片集群上,如果存在孤立文档或正在进行块迁移,db.collection.count() 可能会导致计数不准确。

为了避免这些情况,在分片集群上,使用db.collection.aggregate()方法的$group阶段对文档进行$sum。例如,以下操作对集合中的文档进行计数:

db.collection.aggregate(
   [
      { $group: { _id: null, count: { $sum: 1 } } }
   ]
)
 类似资料:
  • 问题内容: 我已经设置了一个分片分配过滤器,例如: 如何删除或禁用此类设置?我尝试了包含,但后来我同时设置了两个过滤器- 包含和排除。我可以设置类似。 但是也可以设置类似以下内容的节点吗? 问题答案: 你有没有尝试过 听起来很蠢,但是我认为这就是您在Elasticsearch中取消设置的方式…

  • ShardingAlgorithm SPI 名称 详细说明 ShardingAlgorithm 分片算法 已知实现类 详细说明 BoundaryBasedRangeShardingAlgorithm 基于分片边界的范围分片算法 VolumeBasedRangeShardingAlgorithm 基于分片容量的范围分片算法 ComplexInlineShardingAlgorithm 基于行表达式的

  • 配置项说明 命名空间:http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding-5.0.0.xsd <sharding:rule /> 名称 类型 说明 id 属性 Spring Bean Id table-rules (?) 标签 分片表规则配置 auto-table-rules (?) 标签 自动化分片表规

  • 配置项说明 spring.shardingsphere.datasource.names= # 省略数据源配置,请参考使用手册 # 标准分片表配置 spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes= # 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。缺省表示使用

  • 配置项说明 dataSources: # 省略数据源配置,请参考使用手册 rules: - !SHARDING tables: # 数据分片规则配置 <logic-table-name> (+): # 逻辑表名称 actualDataNodes (?): # 由数据源名 + 表名组成(参考Inline语法规则) databaseStrategy (?): #

  • 配置入口 类名称:org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration 可配置属性: 名称 数据类型 说明 默认值 tables (+) Collection<ShardingTableRuleConfiguration> 分片表规则列表 - autoTables (+) Collection<Shardin