【问题标题】:mongodb replicaset new member does not show the correct disk usage on EC2mongodb 副本集新成员未在 EC2 上显示正确的磁盘使用情况
【发布时间】:2014-05-28 21:32:06
【问题描述】:

我有一个包含 2 个成员的 mongodb 副本集。 1个小学和1个中学。如果我发出show dbs,它们都显示如下:

local   24.06640625GB
test    0.203125GB
db1     9.94921875GB
db1test 0.953125GB

然后我发出use db1 -> db.events.count(),结果返回1003130两个成员的文档。

这是有道理的,它们相互反映,两个 dbserver 上的 db1 和 db1test 在每个集合中具有相同数量的磁盘使用量和相同数量的文档。

然后我决定添加一个新成员(一个新的 dbserver),它有一个空的 /data/db。我使用以下命令启动新服务器:

sudo mongod --replSet rs0 --fork --logpath /var/log/mongodb/mongodb.log

然后在主服务器中,我发出

rs.add('ipOfNewDBServer:27017')

几秒钟后。我的新 mongodb 服务器外壳从 > -> STARTUP2 -> rs0:SECONDARY 我认为开始同步。

在我发出show dbs的新/最近添加的mongodb服务器中,它如下所示:

local   22.0673828125GB
test    0.203125GB
db1     1.953125GB
db1test 0.453125GB

每个数据库的磁盘使用情况与其他两个不同(1 个主数据库和 1 个辅助数据库)。但是,如果我发出use db1 -> db.events.count(),则结果返回1003130,这与其他两个相同。我检查了这个 db1 中的其他集合。他们都一样。

我想知道为什么数据库磁盘使用量不同而每个数据库中的集合具有相同数量的文档???如果我将这两个现有集合中的数据同步到新集合中做错了什么,请纠正我。 mongodb官方文档说This procedure relies on MongoDB’s regular process for initial sync,我没有想法,请帮忙。谢谢

【问题讨论】:

  • Mongo 为 DB 预先分配了大块磁盘空间,如果删除文档,最终可能会在给定文件中产生碎片。不同的尺寸是正常的,也是意料之中的。
  • @ChrisHeald 如果文档被删除,你的意思是什么最终会在给定文件中出现碎片。新服务器在我创建它之前没有任何文件,直到它开始同步。你能解释更多或我能读到的任何文件吗?每个数据库中的集合是否正确同步?谢谢
  • Mongo 为其数据文件分配大块磁盘空间。如果更新的文档超出其已分配的大小,则将其移动到块的末尾。被删除的文档将被删除。两者都在分配的文件中留下“漏洞”——即碎片。
  • @ChrisHeald 非常感谢克里斯。

标签: mongodb database


【解决方案1】:

副本集的新成员将获得没有碎片的好处,因为他完全同步到了副本集。由于删除和文档更新移动了文档,现有的副本很可能存在碎片。

在我们的环境中,我们会定期将 replset 的每个成员脱机,修改其数据目录,并使其完全同步以消除碎片。它对我们有用,但相对于其他部署,我们的数据集可能“小”。我认为有一种方法可以通过控制台使用一些 db.runCommand 来执行此操作,但我不知道它是什么。

【讨论】:

  • 好的,你的意思是现有的副本集有碎片,所以它使磁盘使用量很大,而新的副本是干净的,没有碎片。但数据/文档是否正确同步?对吗?
  • @eded 是的,当你完全同步到一个空的数据目录时,新的数据目录是干净的,没有碎片。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 2019-03-19
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多