在MongoDB副本集的主节点和从节点中,数据库大小存在差异的可能原因有哪些?在我的设置中,从节点数据库比主节点更大。两个节点具有相同数量的对象,但“avgObjSize”、“dataSize”、“storageSize”的值对于从节点来说更高。同时,通过rs.stats()检查,没有复制滞后。
我可以检查什么?
我可以检查什么?
简介: 由于二级节点未回收的内存空间不同,在二级和一级上设置的补齐系数也不同,可能会出现这种情况。
详细信息: 如果您有一个长时间运行的主节点,在该节点上删除和插入了某些文档,并且没有运行紧缩操作,则此空间将不会被回收,并且将计入数据大小、平均对象大小和存储大小中。从主节点可以完全重新同步到辅助节点,但只能重放当前操作日志中的操作。在这种情况下,二级节点的 dataSize、avgObjSize 和 storageSize 可能会更低。如果之后将二级节点选举为主节点,则可能会看到所描述的差异。另外,每个服务器都有自己的补齐因子,这就是为什么您会看到数据大小不同的原因。
具体场景可能会有所不同,但两个主要原因是:未回收的内存空间量和不同的补齐系数。
可能是由于填充因子的概念。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会更改值填充因子。因此,您的两个节点之间可能存在轻微差异,因为它们可能不是同时创建的。
当您的“填充”不满足对象的新大小时,MongoDB会将其移动到另一个存储空间。然后,原始空间留给未来使用,对象占用新的空间块。但是,由于填充因子的不同,这种行为在您的两个节点中可能也有所不同。
因此,大小通常是可以接受的。