对MongoDB中的副本集运行脚本

对MongoDB中的副本集运行脚本,mongodb,Mongodb,我有一个由3个节点组成的副本集,我想每天都对它运行一个清理脚本。如果只有一个节点,我会做的是一个简单的bash脚本: ~/mongo/bin/mongo host:port cleanupScript.js 但由于我想对副本集运行相同的脚本,所以不能使用这种方法。我需要找到哪个节点是主节点,并针对该节点运行脚本 所以问题是:有没有办法对整个副本集运行脚本,让mongo进程选择主节点并在其上执行 谢谢 我通常为复制集中的节点设置优先级。这让我可以自由选择哪个节点应该读写负载 在您的情况下,我认为

我有一个由3个节点组成的副本集,我想每天都对它运行一个清理脚本。如果只有一个节点,我会做的是一个简单的bash脚本:

~/mongo/bin/mongo host:port cleanupScript.js
但由于我想对副本集运行相同的脚本,所以不能使用这种方法。我需要找到哪个节点是主节点,并针对该节点运行脚本

所以问题是:有没有办法对整个副本集运行脚本,让
mongo
进程选择主节点并在其上执行


谢谢

我通常为复制集中的节点设置优先级。这让我可以自由选择哪个节点应该读写负载

在您的情况下,我认为,如果您为节点设置优先级,那么您可以始终针对优先级最高的节点运行脚本,因为该节点几乎一直是主节点

设置优先级非常简单和直接。你可以查看这个链接

我希望这能解决你的问题

好的。。。。也许这就是你需要的

#/bin/bash
PRIMARY=`~/mongo/bin/mongo localhost:27017--eval“printjson(rs.isMaster())”| grep“PRIMARY”| cut-d“\”-f4`
回显“$PRIMARY”
~/mongo/bin/mongo“$PRIMARY”cleanuscript.js
在任何节点上运行此操作,它将为您提供主节点的“服务器:端口”。提供mongo可执行文件的完整路径。只是为了避免错误


PS:整个命令都在backticks中。不知何故,这些命令不可见,因此我想告诉您。

不幸的是,“mongo”shell不支持连接到副本集:仅连接到单个节点。如果要执行此操作,您有两种选择:

  • 使用另一种支持连接到副本集的语言(PHP、Python、Perl、Java和Ruby都支持这一点)
  • 具有运行“rs.status()”命令、解析该命令的输出并确定当前主节点的驱动程序脚本。如果它不是您连接到的节点,请重新连接到正确的主节点

我希望我能给你一个更好的答案。

mongo shell可以直接连接到副本集-这适用于2.4(当前)、2.2(以前)和2.0(之前的版本)

假设您有一个名为
myrs
的副本集,并且您的主机是
host1:27017
host2:27017
,请使用以下语法:

mongo——主机myrs/host1:27017、host2:27017


shell将解决其余问题,包括连接到主服务器,如果主服务器退出或消失,它将在选择新的主服务器后重新连接到新的主服务器。

对于较新版本的mongo(我使用的是4.4.4),您可以指定副本集名称,并且只能指定一台主机(任何一台),mongo会找到答案并将您放入主服务器上的shell中:

mongo --host my_repl_name/any_node_host:port --eval "..."
例如,当您在云中跨多个具有重复本地主机名的区域运行时,我发现这非常有用


我在运行mongo v4.4.4时进行了测试。

是的,我知道优先级。问题是:“几乎没有。”“一直都是。如果具有最高优先级的节点死亡,该怎么办?我需要一种100%可靠的方式来运行脚本,这样我就不能依赖优先级了。是的,我可能最终会解析输出并连接到主服务器,谢谢+1工作得很好。我稍微修改了我的,因为我只需要端口号:在命令末尾添加“| cut-d”:“-f2”以获得端口,或者您可以让mongo shell完成工作,并给它指定要连接的replSet名称。我不知道有什么方法可以做到这一点,但这对于10gen来说是一个很好的特性建议。至少,Java驱动程序允许您将replset中的主机指定为集合:Mongo(Java.util.List seeds,com.mongodb.MongoOptions)。仅就这一项功能而言,我就放弃了javascript外壳来完成维护任务,并使用Java驱动程序通过Groovy编写脚本。外壳已经支持这一点,至少早在2.0 branch.是的,我认为纯外壳将是一个不错的解决方案,但因为它不支持它。。。感谢您提供的提示+1我最终通过Java驱动程序运行。。。似乎是干净的解决方案。如果我已经解析了rs.status(),那么在解析之后和运行脚本之前,仍然有非0的可能会更改主窗口:)如果您担心窗口太小,确保您已经编写了Java代码以正确处理MongoException,如果在脚本运行时发生主故障转移,将引发该异常。请参阅我的答案-您可以直接使用shell来完成。感谢@asya kamsky-IHMO这是对该问题的最佳答案。这一行为我从任何主机,主要或次要
mongo-host myReplicaset/myServer1 myDb--eval“db.myCollection.remove({})”
谢谢。它使用服务器名称作为种子来查找副本集的完整拓扑,这就是为什么您可以为它提供副本集中任何启动并响应的节点。您从哪里获得有关mongo主机规范的信息?我到处都找不到它。@re5et我不记得这是很久以前的事了。您可以在几个地方看到这一点——其中一个是Jira票证,以使shell与其他驱动程序兼容。当然,另一个是源代码。