我有3个节点的副本集,我想在每天结束时对它运行一个清理脚本。如果只有一个节点,我会做的是一个简单的bash脚本:
~/mongo/bin/mongo host:port cleanupScript.js
但是因为我想对副本集运行相同的脚本,所以我不能使用这种方法。我需要以某种方式找到哪个节点是主节点并针对该节点运行脚本。
所以问题是:有没有办法如何针对整个副本集运行脚本,让mongo
进程选择主节点并在其上执行?
谢谢!
答案 0 :(得分:14)
mongo shell可以直接连接到副本集 - 这适用于2.4(当前),2.2(前一个)和2.0(之前的版本)。
假设您有一个名为myrs
的副本集,并且您的主机是host1:27017
和host2: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不支持连接到副本集:仅支持单个节点。如果你想这样做,你有两个选择:
我希望我有更好的答案。
答案 3 :(得分:0)
对于更新版本的 mongo(我使用的是 4.4.4),您可以指定副本集名称,并且只有一个主机(任何一个),mongo 会找出来并将您放入一个 shell主要:
mongo --host my_repl_name/any_node_host:port --eval "..."
例如,当您在云中跨多个具有重复本地主机名的区域运行时,我发现这非常有用。
我测试了这个正在运行的 mongo v4.4.4。