web-dev-qa-db-ja.com

mongodb、複製およびエラー:{"$ err": "not master and slaveOk = false"、 "code":13435}

私は初めてmongoレプリカセットを試しました。

私はec2でubuntuを使用しており、3つのインスタンスを起動しました。各インスタンスのプライベートIPアドレスを使用しました。プライマリとして選んだのは以下のコードです。

mongo --Host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)

この時点ですべて大丈夫です。 http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet サイトにアクセスすると、プライマリ、セカンダリ、およびアービターがあることがわかります。

さて、テストのために。

プライマリでは、次のコードでデータベースを作成します。

use tt
db.tt.save( { a : 123 } )

セカンダリでは、これを実行すると、次のエラーが表示されます。

db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

私はmongodbと複製に非常に新しいですが、一方で何かをしたら、もう一方に行くと思いました。したがって、レコードを1つ追加した場合、マシン間で複製するには何をする必要がありますか

152
user959129

セカンダリからの読み取りを許可していることをmongoシェルに知らせるには、「スレーブOK」モードを設定する必要があります。これは、最終的に一貫した読み取りを誤って実行することから、ユーザーとアプリケーションを保護するためです。これはシェルで次の方法で実行できます。

rs.slaveOk()

その後、セカンダリから通常どおりクエリを実行できます。

「結果整合性」に関する注意:通常の状況では、レプリカセットのセカンダリは、1秒以内にプライマリと同じデータをすべて持っています。非常に高い負荷がかかると、プライマリに書き込んだデータがセカンダリに複製されるまでに時間がかかる場合があります。これは「レプリカラグ」と呼ばれ、遅れたセカンダリからの読み取りは「最終的に一貫した」読み取りと呼ばれます。すぐに利用可能。

編集:セカンダリからクエリする場合、slaveokを設定する必要があるのは、セッションごとに1回だけです。

253
dcrosta

毎回rs.slaveOk()と入力しないようにするには、次のようにします。

1行を含むreplStart.jsという名前のファイルを作成します:rs.slaveOk()

次に、Mongo Shellを起動するときに--Shell replStart.jsを含めます。もちろん、単一のインスタンスにローカルに接続している場合、入力は保存されません。

39
Ed Norris

mongodb2.0で

入力する必要があります

rs.slaveOk()

二次モンゴッドノード

28
andyshi

このIS Rubyドライバーを使用してこの問題に対処する場合は注意してください

Ruby Gemを使用したときに同じ問題が発生しました。

RubyでslaveOkを設定するには、次のようにクライアントを作成するときに引数として渡します。

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })

https://github.com/mongodb/mongo-Ruby-driver/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional Host/port args)

「args」は3番目のオプション引数であることに注意してください。

10
campeterson

slaveOkはもう機能しません。 readPreferenceを使用する必要があります https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred

例えば.

const client = new MongoClient(mongoURL + "?readPreference=primaryPreferred", { useUnifiedTopology: true, useNewUrlParser: true });
0
Prabhat

DBプロバイダーからの厄介な状況に対するこの回答を追加しています。

私たちのケースで起こったのは、プライマリとセカンダリのデータベースが逆にシフトしたことです(プライマリからセカンダリ、またはその逆)。同じエラーが発生しています。

そのため、データベースのステータスの構成設定を確認してください。

0
jit