Saya mencoba set replika mongo untuk pertama kalinya.
Saya menggunakan ubuntu di ec2 dan saya mem-boot tiga instance. Saya menggunakan alamat IP pribadi masing-masing contoh. Saya memilih sebagai yang utama dan di bawah ini adalah kode.
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
Semua pada titik ini baik-baik saja. Ketika saya pergi ke situs http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:8017/_replSet saya melihat bahwa saya memiliki primary, seconday, dan arbitor.
Ok, sekarang untuk tes.
Pada dasarnya membuat database dalam hal ini adalah kode:
use tt
db.tt.save( { a : 123 } )
di sekunder, saya kemudian melakukan ini dan mendapatkan kesalahan di bawah ini:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
Saya sangat baru untuk mongodb dan meniru tetapi saya berpikir bahwa jika saya melakukan sesuatu dalam satu, itu pergi ke yang lain. Jadi, jika saya menambahkan catatan dalam satu, apa yang harus saya lakukan untuk mereplikasi seluruh mesin?
sumber
Jawaban:
Anda harus mengatur mode "budak oke" untuk membiarkan shell mongo tahu bahwa Anda mengizinkan membaca dari sekunder. Ini untuk melindungi Anda dan aplikasi Anda dari melakukan pembacaan yang konsisten pada akhirnya secara tidak sengaja. Anda dapat melakukan ini di shell dengan:
Setelah itu Anda dapat meminta secara normal dari sekunder.
Catatan tentang "konsistensi akhirnya": dalam keadaan normal, replika yang ditetapkan sekunder memiliki semua data yang sama dengan primer dalam satu detik atau kurang. Di bawah beban yang sangat tinggi, data yang telah Anda tulis ke utama mungkin perlu beberapa saat untuk direplikasi ke sekunder. Ini dikenal sebagai "replika lag", dan pembacaan dari lagging sekunder dikenal sebagai pembacaan "akhirnya konsisten", karena, sementara data yang baru ditulis akan muncul di beberapa titik (mencegah kegagalan jaringan, dll), mungkin tidak segera tersedia.
Sunting: Anda hanya perlu mengatur slaveok ketika meminta dari sekunder, dan hanya sekali per sesi.
sumber
Untuk menghindari mengetik
rs.slaveOk()
setiap saat, lakukan ini:Buat file bernama
replStart.js
, mengandung satu baris:rs.slaveOk()
Kemudian sertakan
--shell replStart.js
ketika Anda meluncurkan shell Mongo. Tentu saja, jika Anda terhubung secara lokal ke satu instance, ini tidak menyimpan pengetikan apa pun.sumber
rs.slaveOk()
ke~/.mongorc.js
file Anda , yang akan secara otomatis dieksekusi ketika memulai mongo shell.~/.mongorc.js
dan konfigurasi khusus direplStart.js
atauadminStart.js
atau apa pun.di mongodb2.0
Anda harus mengetik
di simpul mongod sekunder
sumber
INI HANYA CATATAN UNTUK SIAPAPUN YANG MENGHADAPI MASALAH INI MENGGUNAKAN DRIVER RUBY
Saya memiliki masalah yang sama saat menggunakan Ruby Gem.
Untuk mengatur slaveOk di Ruby, Anda hanya meneruskannya sebagai argumen ketika Anda membuat klien seperti ini:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
Perhatikan bahwa 'argumen' adalah argumen opsional ketiga.
sumber
slaveOk tidak berfungsi lagi. Orang perlu menggunakan readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
misalnya
sumber
Saya hanya menambahkan jawaban ini untuk situasi yang canggung dari penyedia DB.
apa yang terjadi dalam kasus kami adalah db primer dan sekunder bergeser terbalik (primer ke sekunder dan sebaliknya) dan kami mendapatkan kesalahan yang sama.
jadi silakan periksa di pengaturan konfigurasi untuk status database yang dapat membantu Anda.
sumber
Aku sampai di sini mencari kesalahan yang sama, tetapi dari Node.js driver asli . Jawaban bagi saya adalah kombinasi jawaban oleh campeterson dan Prabhat .
Masalahnya adalah
readPreference
pengaturan default untukprimary
, yang kemudian entah bagaimana mengarah keslaveOk
kesalahan yang membingungkan . Masalah saya adalah bahwa saya hanya ingin membaca dari set replika saya dari sembarang simpul. Saya bahkan tidak terhubung ke replaset. Saya hanya terhubung ke sembarang simpul untuk membacanya.Pengaturan
readPreference
untukprimaryPreferred
(atau lebih baik keReadPreference.PRIMARY_PREFERRED
konstanta) menyelesaikannya untuk saya. Cukup berikan sebagai opsi keMongoClient.connect()
atau keclient.db()
atau ke apa sajafind()
,aggregate()
atau fungsi lainnya.sumber