13

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

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

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

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

谢谢!

4

4 回答 4

17

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

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

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

shell 将计算出其余的,包括连接到主节点,如果主节点退出或消失,一旦它被选中,它将重新连接到新的主节点。

于 2013-04-11T03:28:22.483 回答
3

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

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

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

于 2012-10-10T16:59:52.900 回答
3

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

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

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

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

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

#!/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

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

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

于 2012-10-10T13:35:29.700 回答
0

对于 mongo 的更新版本(我使用的是 4.4.4),您可以指定副本集名称,并且只能指定一个主机(任何一个),mongo 会弄清楚并将您放入 PRIMARY 上的 shell:

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

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

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

于 2021-06-08T17:59:39.660 回答