【问题标题】:Mongodb replica set: Database Size DifferenceMongodb 副本集:数据库大小差异
【发布时间】:2014-05-07 05:58:45
【问题描述】:

MongoDB 副本集的主节点和辅助节点中的数据库大小不同的可能原因是什么。 在我的设置中,辅助节点数据库的大小比主节点数据库大。两个节点的对象数量相同,但辅助节点的“avgObjSize”、“dataSize”、“storageSize”的值更高。 从 rs.stats() 中检查也没有复制滞后

我可以检查什么?

【问题讨论】:

  • 你使用的是不同版本的mongodb吗?
  • 我必须坦率地说,如果次要小于主要,下面的答案是有意义的,但事实并非如此。你能告诉我们一些实际的统计数据,比如 db.collection.stats() 和 rs.stats() 吗?
  • 我最近将我们的 MongoDB 转换为副本集,并担心辅助节点报告的较小大小(117GB 与 106GB)。但是,数据都非常好和完整。正如其他人所提到的,罪魁祸首在很大程度上可以归因于填充因子和索引的差异。进一步需要考虑的是每个实例的底层配置——它们是否在不同类型的驱动器上、FS 格式化、块大小。在我的例子中,我们在 Raid 阵列上有一个主节点,在单独的机器上的一个同等大小的单个驱动器上有一个辅助节点。

标签: mongodb replication


【解决方案1】:

简介: 由于次要内存空间的未回收量不同,次要和主要的填充因子不同。

长: 如果您长时间运行主节点,其中一些文档被删除和插入,并且没有运行紧凑操作,则可能是这种情况。该空间不会被回收,并将计入 dataSize、avgObjSize 和 storageSize。辅助节点可以从主节点完全重新同步,但只会重播当前 oplog 中的操作。在这种情况下,次要的 dataSize、avgObjSize 和 storageSize 的值可能较低。如果在该辅助节点被选为主节点之后,您会看到所描述的大小差异。此外,每个服务器都有自己的填充因子,这就是为什么您会看到 dataSize 不同的原因。

具体情况可能不同,但主要原因有两个:未回收的内存空间量和填充因子不同。

【讨论】:

  • @Sammaye 总的来说,我同意你的看法,但次要和主要不是永久状态。次要可以被选为主次,然后次要的数量会更大。
  • 你的解释很有道理。是的,辅助节点中的集合的填充因子高于主节点。我将检查/确认此节点之前的服务器是否作为主节点。
  • 是的,但如果说主节点发生了变化,那将是一个幸运的猜测
  • 啊等一下,我看到你在回答中提到了,ok kool
  • 是否有任何官方文档可供我阅读更多相关信息?
【解决方案2】:

有一个概念padding factor 可能是原因。 MongoDB 为以后的更新留出了一些空间,这样当对象的大小增加时,您不必总是将对象移动到另一个存储空间。
可以在您的收藏统计信息中找到填充因子:

db.colname.stats()

样本结果:

{
"ns" : "merchant.product",
"count" : 24,
"size" : 23168,
"avgObjSize" : 965.3333333333334,
"storageSize" : 204800,
"numExtents" : 2,
"nindexes" : 1,
"lastExtentSize" : 163840,
"paddingFactor" : 1.0000000000000053,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
    "_id_" : 8176
},
"ok" : 1
}

当您更新您的集合时,mongodb 会更改值 paddingFactor。因此,您的 2 个节点之间可能存在细微差异,因为它们可能不会同时创建。

当您的“填充”不满足对象的新大小时,mongodb 会将其移动到另一个存储空间。然后保留原始空间以供将来使用,并且对象占用新的空间块。但是,由于填充因子不同,这种行为在您的 2 个节点中也可能不同。

所以大小一般都可以。

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2019-02-13
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多