草庐IT

MongoDB维护

coder 2023-10-27 原文

我正在为 MongoDB 编写一个维护脚本,它将按计划压缩副本集中的集合。到目前为止,我的脚本看起来不错,可以针对主节点和辅助节点完成预期的工作。但是有一个问题:

使用 MongoDB 副本集的系统是一个高可用性网络队列,它不断地被写入和读取。因此,即使调用 rs.StepDown() 时出现几秒钟的停机时间也是绝对不能接受的。有没有办法安全地降级主节点,而不会出现来自数百个客户端的 MongoException?

谢谢!

附注这是脚本的实际版本,应该每月在低负载时间通过 cron-job 运行一次

// assuming we are a replica set ;-)
if(rs.isMaster().setName){
    try {
        //check if the script is run against a master
        if(rs.isMaster().ismaster){ //if so, step down as master        
            print("Connected to a PRIMARY node")
            print("Will try to step down as primary");
            rs.stepDown();

            // after stepdown connections are dropped. do an operation to cause reconnect:
            rs.isMaster();            

            // now ready to go.      
            // wait for another node to become primary -- it may need data from us for the last 
            // small sliver of time, and if we are already compacting it cannot get it while the 
            // compaction is running.            
            var counter = 1;
            while( 1 ) { 
                var m = rs.isMaster();
                if( m.ismaster ) {
                    print("ERROR: no one took over during our stepDown duration. we are primary again!");
                    assert(false);
                }

                if( m.primary ){ // someone else is, great
                    print("new master host is: "+m.primary);
                    break; 
                }
                print("waiting "+counter+" seconds");
                sleep(1000);
                counter++;
            }
        }else{
            print("Connected to a SECONDARY node");
            print("Going into Recovery Mode and Compacting");            
        }

        // someone else is primary, so we are ready to proceed with a compaction
        print(" ");
        print("Compacting...");
        print("- queue");
        printjson( db.runCommand({compact:"queue"}) );
        print(" ");

    } catch(e) { 
        print(" ");
        print("ACHTUNG! Exception:" + e);
        print(" ");
    }
}else{
    print('This script works with replica sets only');
}

最佳答案

Is there a way to safely demote a Primary node without MongoExceptions from the hundreds of clients?

。 MongoDB 没有任何形式的“预期转换”“维护转换”

执行此压缩循环是正确的做法。但是您将不得不等待维护窗口来压缩主数据库。

... is a high-availability web-queue.

你在使用 Capped Collections为了这?上限集合不需要压缩。上限集合中的对象不能调整大小,但这通常不是队列对象的问题。

虽然不是理想的解决方案,但它可能会解决您的问题。

关于MongoDB维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895256/

有关MongoDB维护的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 我可以使用 RVM 为所有用户维护单一版本的 Ruby 吗? - 2

    我喜欢RVM。我意识到它的主要用例是让不同的用户在不同版本的Ruby之间切换。但是假设我正在将Rails应用程序部署到服务器,并且我只想运行单个版本的Ruby。特别是,我想要1.9.2,用RVM安装它很容易,但没有它就很痛苦。有没有一种方法可以让我说“我希望这是所有用户的规范Ruby安装”(连同它的所有gem),而不必手动创建一堆符号链接(symboliclink)并在每次更新到更新时更改它们Ruby版本? 最佳答案 以root身份安装RVM并执行sudorvmuse1.9.2--default。任何采购/usr/local/rvm

  3. ruby - 如何在 ruby​​ 中拆分字符串并在拆分中维护空格 - 2

    我有一个字符串:"hello\tWorld\nbla"我想把它拆分成:["hello\t","World\n","bla"]我如何在Ruby中执行此操作? 最佳答案 >>"hello\tWorld\nbla".scan/\S+\s*/=>["hello\t","World\n","bla"] 关于ruby-如何在ruby​​中拆分字符串并在拆分中维护空格,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com

  4. 仍在积极维护的 Ruby 游戏框架? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我发现很难调查使用Ruby进行游戏编程的选项。其他帖子和文章中提到的几个包装器和框架不再维护或使用。Gosu/Ruby似乎仍然活跃:官方论坛上的讨论一直很稳定。是否还有其他积极维护的ruby​​游戏框架?编辑:我发现使用MacRuby进行大量游戏开发。

  5. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  6. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  7. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  8. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  9. Ruby 维护哈希插入顺序 - 2

    我正在寻找一种方法来维护我在Ruby中使用的哈希的插入顺序。我的数据来自数据库,并且已经按照我想要的方式进行分组/排序,但Ruby不保证在我的1.8.4版本中保持哈希顺序。有什么解决方法吗?如果没有,我可以创建自定义比较器吗?这是哈希:{"February"=>[0.5667,14.6834,79.7666,261.8668,342.1167,723.517],"March"=>[0.0,26.4667,554.45,681.3164,2376.0668,10353.0358],"May"=>[2.75,34.6666,342.1831,1331.8999,1589.617,9282.

  10. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

随机推荐