13

3つのノードのレプリカセットがあり、それに対して1日の終わりごとにクリーンアップスクリプトを実行したいと思います。ノードが1つしかない場合は、単純なbashスクリプトを使用します。

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

しかし、レプリカセットに対して同じスクリプトを実行したいので、このアプローチを使用することはできません。どういうわけか、どのノードがプライマリであるかを見つけて、そのノードに対してスクリプトを実行する必要があります。

質問:レプリカセット全体に対してスクリプトを実行し、mongoプロセスにプライマリノードを選択させて実行させる方法はありますか?

ありがとう!

4

4 に答える 4

17

mongoシェルはレプリカセットに直接接続できます。これは、2.4(現在)、2.2(以前)、および2.0(以前のバージョン)で機能します。

レプリカセットが呼び出されmyrs、ホストがhost1:27017host2:27017であると仮定すると、次の構文を使用します。

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

シェルは、プライマリへの接続を含む残りの部分を把握し、プライマリがステップダウンまたは終了した場合、選択されると新しいプライマリに再接続します。

于 2013-04-11T03:28:22.483 に答える
3

残念ながら、「mongo」シェルはレプリカセットへの接続をサポートしていません。個々のノードへの接続のみです。これを実行する場合は、2つの選択肢があります。

  • レプリカセットへの接続をサポートする別の言語を使用してください。(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

これを任意のノードで実行すると、プライマリの「server:port」が表示されます。エラーを回避するために、mongo実行可能ファイルへのフルパスを指定します。

PS:コマンド全体がバッククォートにあります。どういうわけかそれらは見えないのであなたに言うことを考えました。

于 2012-10-10T13:35:29.700 に答える
0

最近のバージョンのmongo(私は4.4.4を使用しています)の場合、レプリカセット名と単一のホスト(任意の1つ)のみを指定できます。mongoはそれを理解し、PRIMARYのシェルにドロップします。

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

これは、たとえば、ローカルホスト名が重複している複数のゾーンにまたがるクラウドで実行している場合に非常に役立ちます。

私はこの実行中のmongov4.4.4をテストしました。

于 2021-06-08T17:59:39.660 に答える