针对MongoDB中的副本集运行脚本

时间:2012-10-10 13:04:41

标签: mongodb

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

~/mongo/bin/mongo host:port cleanupScript.js

但是因为我想对副本集运行相同的脚本,所以我不能使用这种方法。我需要以某种方式找到哪个节点是主节点并针对该节点运行脚本。

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

谢谢!

4 个答案:

答案 0 :(得分:14)

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

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

mongo --host myrs/host1:27017,host2:27017

shell会找出其余部分,包括连接到主要部分,如果主要步骤失效或消失,它将在选举后重新连接到新的主要部分。

答案 1 :(得分:3)

我通常为replicaset中的节点设置优先级。这使我可以自由选择哪个节点应该读取和写入负载。

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

设置优先级非常简单直接。您可以查看此链接http://docs.mongodb.org/manual/tutorial/force-member-to-be-primary/

我希望这能解决你的问题。

好的......可能这就是你需要的......

#!/bin/bash

PRIMARY=`~/mongo/bin/mongo localhost:27017 --eval "printjson(rs.isMaster())" | grep "primary" | cut -d"\"" -f4`

echo "$PRIMARY"

~/mongo/bin/mongo "$PRIMARY" cleanupScript.js

在任何节点上运行它,它将为您提供主服务器的“server:port”。提供mongo可执行文件的完整路径..只是为了避免错误。

PS:整个命令都在反引号中。不知何故,这些都不可见,所以想到告诉你。

答案 2 :(得分:3)

不幸的是,'mongo'shell不支持连接到副本集:仅支持单个节点。如果你想这样做,你有两个选择:

  • 使用其他语言,该语言支持与副本集建立连接。 (PHP,Python,Perl,Java和Ruby都支持这一点。)
  • 拥有一个运行'rs.status()'命令的驱动程序脚本,解析该命令的输出,并确定当前的主要命令。如果它不是您连接的节点,则重新连接到正确的主节点

我希望我有更好的答案。

答案 3 :(得分:0)

对于更新版本的 mongo(我使用的是 4.4.4),您可以指定副本集名称,并且只有一个主机(任何一个),mongo 会找出来并将您放入一个 shell主要:

mongo --host my_repl_name/any_node_host:port --eval "..."

例如,当您在云中跨多个具有重复本地主机名的区域运行时,我发现这非常有用。

我测试了这个正在运行的 mongo v4.4.4。