我有 3 个节点的副本集,我想每天结束对它运行一个清理脚本。如果只有单个节点,我会做一个简单的 bash 脚本:
~/mongo/bin/mongo host:port cleanupScript.js
但是由于我想对副本集运行相同的脚本,所以我不能使用这种方法。我需要以某种方式找到哪个节点是主节点并针对该节点运行脚本。
所以问题是:有没有办法对整个副本集运行脚本并让mongo
进程选择主节点并在其上执行?
谢谢!
我有 3 个节点的副本集,我想每天结束对它运行一个清理脚本。如果只有单个节点,我会做一个简单的 bash 脚本:
~/mongo/bin/mongo host:port cleanupScript.js
但是由于我想对副本集运行相同的脚本,所以我不能使用这种方法。我需要以某种方式找到哪个节点是主节点并针对该节点运行脚本。
所以问题是:有没有办法对整个副本集运行脚本并让mongo
进程选择主节点并在其上执行?
谢谢!
mongo shell 可以直接连接到副本集——这适用于 2.4(当前)、2.2(以前)和 2.0(之前的版本)。
假设您有一个名为的副本集myrs
并且您的主机是host1:27017
and host2:27017
,请使用以下语法:
mongo --host myrs/host1:27017,host2:27017
shell 将计算出其余的,包括连接到主节点,如果主节点退出或消失,一旦它被选中,它将重新连接到新的主节点。
不幸的是,'mongo' shell 不支持连接到副本集:仅连接到单个节点。如果你想这样做,你有两个选择:
我希望我有一个更好的答案给你。
我通常为副本集中的节点设置优先级。这让我可以自由选择哪个节点应该获得读写负载。
在您的情况下,我认为,如果您为节点设置优先级,那么您始终可以针对最高优先级节点运行脚本,因为该节点几乎一直都是主节点。
设置优先级非常简单直接。您可以查看此链接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:整个命令在反引号中。不知何故,那些是不可见的,所以想告诉你。
对于 mongo 的更新版本(我使用的是 4.4.4),您可以指定副本集名称,并且只能指定一个主机(任何一个),mongo 会弄清楚并将您放入 PRIMARY 上的 shell:
mongo --host my_repl_name/any_node_host:port --eval "..."
例如,当您在具有重复本地主机名的多个区域的云中运行时,我发现这非常有用。
我测试了这个正在运行的 mongo v4.4.4。