私は初めて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つ追加した場合、マシン間で複製するには何をする必要がありますか
セカンダリからの読み取りを許可していることをmongoシェルに知らせるには、「スレーブOK」モードを設定する必要があります。これは、最終的に一貫した読み取りを誤って実行することから、ユーザーとアプリケーションを保護するためです。これはシェルで次の方法で実行できます。
rs.slaveOk()
その後、セカンダリから通常どおりクエリを実行できます。
「結果整合性」に関する注意:通常の状況では、レプリカセットのセカンダリは、1秒以内にプライマリと同じデータをすべて持っています。非常に高い負荷がかかると、プライマリに書き込んだデータがセカンダリに複製されるまでに時間がかかる場合があります。これは「レプリカラグ」と呼ばれ、遅れたセカンダリからの読み取りは「最終的に一貫した」読み取りと呼ばれます。すぐに利用可能。
編集:セカンダリからクエリする場合、slaveokを設定する必要があるのは、セッションごとに1回だけです。
毎回rs.slaveOk()
と入力しないようにするには、次のようにします。
1行を含むreplStart.js
という名前のファイルを作成します:rs.slaveOk()
次に、Mongo Shellを起動するときに--Shell replStart.js
を含めます。もちろん、単一のインスタンスにローカルに接続している場合、入力は保存されません。
mongodb2.0で
入力する必要があります
rs.slaveOk()
二次モンゴッドノード
この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番目のオプション引数であることに注意してください。
slaveOkはもう機能しません。 readPreferenceを使用する必要があります https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
例えば.
const client = new MongoClient(mongoURL + "?readPreference=primaryPreferred", { useUnifiedTopology: true, useNewUrlParser: true });
DBプロバイダーからの厄介な状況に対するこの回答を追加しています。
私たちのケースで起こったのは、プライマリとセカンダリのデータベースが逆にシフトしたことです(プライマリからセカンダリ、またはその逆)。同じエラーが発生しています。
そのため、データベースのステータスの構成設定を確認してください。