Google Compute EngineでMongoDBバージョン2.6.6を使用していて、クリックしてデプロイする方法を使用しました。
rs0:SECONDARY> db.createUser({user:"admin", pwd:"secret_password", roles:[{role:"root", db:"admin"}]})
2015-07-13T15:02:28.434+0000 Error: couldn't add user: not master at src/mongo/Shell/db.js:1004
rs0:SECONDARY> use admin
switched to db admin
rs0:SECONDARY> db.createUser({user:"admin", pwd:"secret_password", roles:["root"]})
2015-07-13T15:13:28.591+0000 Error: couldn't add user: not master at src/mongo/Shell/db.js:1004
MongoDBは、Compute Engineインスタンスのクラスター(MongoDBレプリカセットとも呼ばれます)にデプロイされます。各インスタンスは、データベースファイル用に起動ディスクと個別のディスクを使用します。
プライマリノードとマスターノードは、書き込みを受け入れることができるノードです。 MongoDBのレプリケーションは「シングルマスター」です。一度に1つのノードのみが書き込み操作を受け入れることができます。
セカンダリノードとスレーブノードは、プライマリから複製される読み取り専用ノードです。
エラーメッセージは、セカンダリにユーザーを追加しようとしているようです。プライマリにユーザーを追加してみてください。
私はmongo 3.2で同様の問題がありました:
エラー:ユーザーを追加できませんでした:マスターではありません:
Rootロールで新しいユーザーを作成しようとしたとき。
Mongoのローカルコピーのみを使用していました。
私のmongod.confファイルで、次のコメントを外しました。
replication:
replSetName: <node name>
コメントアウトして再起動すると問題が解決しました。モンゴはそれが複製セットの一部であると思っていたと思い、マスターが誰であるかについて混乱していました。
編集:
また、レプリケーションセットをセットアップしようとしていて、上記のエラーが発生した場合は、次のコマンドを実行します。
rs.initiate()
これにより、レプリケーションセットが開始され、現在のノードがプライマリとして設定されます。
終了してから再度ログインすると、次のように表示されます。
プライマリー>
次に、必要に応じてユーザーを作成します。
レプリカセットの作成をスクリプト化すると、このエラーが発生しました。
解決策は、rs.initiate()
とdb.createUser()
の間に遅延を追加することでした。
レプリカセットの作成はバックグラウンドで行われているようで、プライマリノードが実際にプライマリになるには時間がかかります。インタラクティブな使用では、次のコマンドの入力中に遅延があるため、これは問題を引き起こしませんが、対話をスクリプト化するときは、遅延を強制する必要がある場合があります。
Mongo 3.4を実行していると思ったときにこの問題に遭遇しましたが、mongo 3.6でした。 3.6をアンインストールして3.4をインストールすると、問題が解決しました。