草庐IT

mongodb - 如何使 MongoDB `repairDatabase` 和 `compact` 命令与副本集一起工作?停机时间还可以

coder 2023-10-28 原文

我们需要释放一些 MongoDB 空间,我们确定了 100Gb 以上的文档可以安全地从集合中删除。

因此我们将它们从具有此设置的测试环境中删除:

  • mongodb 版本 3.0.1
  • 没有分片
  • 1个节点,无副本
  • wiredtiger 引擎

完成后,我们发现磁盘上的空间仍在使用中,需要回收。我们找到了this post它帮助了我们:在同时运行之后

db.runCommand({repairDatabase: 1})

db.runCommand({compact: collection-name })

我们释放了 100Gb 以上。

然后我们继续生产,忘记了设置是不同的,因为我们有 1 个副本节点:

  • mongodb 版本 3.0.1
  • 没有分片
  • 1个主节点,1个副本节点
  • wiredtiger 引擎

删除文件后,我们运行

db.runCommand({repairDatabase: 1})

并收到OK 消息(过了一会儿,10 分钟以上)。我们尝试运行

db.runCommand({compact: collection-name })

得到这个错误:

will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force

所以我们跑

db.runCommand({compact: collection-name, force: true })

并收到OK 消息(几乎是立即),但是空间上的磁盘仍在使用,它没有被释放。

我们搜索了使用副本集运行 repairDatabasecompact 命令的解决方案,但建议的重点是避免停机,就好像那是唯一的问题一样。但是,我们可以安排停机时间,而我们的问题是这些命令无法按预期工作,因为实际上并未回收空间

我们做错了什么?

最佳答案

对于副本集配置,恢复空间的最佳和最安全方法是执行 initial sync .如果您需要从集合中的所有节点恢复空间,您可以执行滚动初始同步。也就是说,在最终降级主服务器并对其执行初始同步之前,在每个辅助服务器上执行初始同步。

请注意,滚动初始同步只有在您的部署包含至少三个节点副本集时才有可能(原因我将在下面描述)。

滚动初始同步方法是执行副本集维护的最安全方法,而且它还没有停机时间作为奖励。

话虽如此,还是有一些值得一提的事情:

关于紧凑:

MongoDB 3.0.x 上 WiredTiger 上的 compact 命令受此错误影响:SERVER-21833已在 MongoDB 3.2.3 中修复。在此版本之前,WiredTiger 上的 compact 可能会悄无声息地失败。

关于repairDatabase:

请不要在副本集节点上运行repairDatabase。正如 repairDatabase page 中所述,强烈不推荐 .名称 repairDatabase 有点误导,因为该命令不会尝试修复任何东西。该命令旨在在磁盘损坏时使用,这可能会导致损坏的文档。

repairDatabase 命令可以更准确地描述为“抢救数据库”。也就是说,它通过丢弃损坏的文档来重新创建数据库,以尝试使数据库进入可以启动它并从中挽救完整文档的状态。

在副本集中,MongoDB 期望该集中的所有节点都包含相同的数据。如果您在副本集节点上运行 repairDatabase,则该节点有可能包含未检测到的损坏,并且 repairDatabase 将尽职地删除损坏的文档。可以预见的是,这使得该节点包含与该集合的其余部分不同的数据集。如果更新碰巧发生在那个单一的文档上,整个集合可能会崩溃。更糟糕的是,这种情况完全有可能长期处于休眠状态,然后突然无缘无故地发作。

关于您的设置:

我注意到在您的生产环境中,您创建了一个包含两个节点的副本集。不推荐这种设置,因为单个节点的故障会使剩余节点成为辅助节点,从而不允许写入该集合。

由于 MongoDB 高可用性的工作方式(参见 Replica Set Election),强烈建议至少部署三个数据承载节点,或者至少添加一个仲裁节点(参见 Replica Set Members),以便您的副本集包含奇数个成员。

副本集中只有两个成员也会使滚动升级/初始同步/维护变得更加困难,在某些情况下甚至不可能。

MongoDB 3.0.1 于 March 17, 2015 发布,截至撰写本文时已超过 2 年。如果您被迫使用 MongoDB 3.0 系列,请考虑迁移到 3.0.15。或者更好的是,到 3.4.7(截至 2017 年 8 月 10 日的最新版本),其中包含对 3.0.1 的大量改进。

关于mongodb - 如何使 MongoDB `repairDatabase` 和 `compact` 命令与副本集一起工作?停机时间还可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45598634/

有关mongodb - 如何使 MongoDB `repairDatabase` 和 `compact` 命令与副本集一起工作?停机时间还可以的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐