Po raz pierwszy próbowałem replik mongo.
Używam ubuntu na ec2 i uruchomiłem trzy instancje. Użyłem prywatnego adresu IP każdej z instancji. Wybrałem jako podstawowy, a poniżej jest kod.
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
W tym momencie wszystko jest w porządku. Kiedy wchodzę na stronę http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet , widzę, że mam głównego, drugiego i arbitra.
Ok, teraz do testu.
Na podstawowym utwórz bazę danych w następujący sposób:
use tt
db.tt.save( { a : 123 } )
po drugie robię to i otrzymuję poniższy błąd:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
Jestem nowy w mongodb i powiela się, ale pomyślałem, że jeśli zrobię coś w jednym, to przejdzie do drugiego. Jeśli więc dodam rekord w jednym, co muszę zrobić, aby zreplikować go między komputerami?
mongodb
amazon-ec2
eLRuLL
źródło
źródło
Odpowiedzi:
Musisz ustawić tryb „slave okay”, aby powłoka mongo wiedziała, że zezwalasz na odczyty z urządzenia wtórnego. Ma to na celu ochronę Ciebie i Twoich aplikacji przed przypadkowym wykonaniem spójnych odczytów. Możesz to zrobić w powłoce za pomocą:
Następnie możesz normalnie przesyłać zapytania z urządzeń pomocniczych.
Uwaga dotycząca „ostatecznej spójności”: w normalnych okolicznościach części pomocnicze zestawu replik mają te same dane co części główne w ciągu sekundy lub mniej. W przypadku bardzo dużego obciążenia replikacja danych zapisanych na serwerze podstawowym może zająć trochę czasu. Nazywa się to „opóźnieniem repliki”, a odczyt z opóźnionego wtórnika jest znany jako odczyt „ostatecznie spójny”, ponieważ chociaż nowo zapisane dane pojawią się w pewnym momencie (z wyjątkiem awarii sieci itp.), Może to nie być dostępne od zaraz.
Edycja: Musisz ustawić slaveok tylko podczas odpytywania z drugorzędnych i tylko raz na sesję.
źródło
Aby uniknąć pisania za
rs.slaveOk()
każdym razem, zrób to:Utwórz plik o nazwie
replStart.js
, zawierający jedną linię:rs.slaveOk()
Następnie uwzględnij
--shell replStart.js
podczas uruchamiania powłoki Mongo. Oczywiście, jeśli łączysz się lokalnie z pojedynczą instancją, nie oszczędza to żadnego wpisywania.źródło
rs.slaveOk()
do~/.mongorc.js
pliku, który zostanie automatycznie wykonany podczas uruchamiania powłoki mongo.~/.mongorc.js
i konfiguracji niestandardowych wreplStart.js
lub wadminStart.js
czymkolwiek.w mongodb2.0
należy wpisać
we wtórnym węźle mongod
źródło
TO TYLKO WSKAZÓWKA DLA KAŻDEGO, KTÓRZY BĘDZIE SIĘ Z TYM PROBLEMEM UŻYWAJĄC STEROWNIKA
Miałem ten sam problem podczas korzystania z Ruby Gem.
Aby ustawić slaveOk w Rubim, wystarczy przekazać go jako argument podczas tworzenia klienta w następujący sposób:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
Zwróć uwagę, że „argumenty” to trzeci opcjonalny argument.
źródło
slaveOk już nie działa. Należy użyć readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
na przykład
źródło
Właśnie dodam tę odpowiedź na niezręczną sytuację od dostawcy bazy danych.
to, co wydarzyło się w naszym przypadku, to podstawowa i drugorzędna db przesunięta odwrotnie (pierwotna do drugiej i odwrotnie) i otrzymujemy ten sam błąd.
więc sprawdź w ustawieniach konfiguracji status bazy danych, który może ci pomóc.
źródło
Mam tutaj szukając tego samego błędu, ale z node.js natywny sterownik . Odpowiedź była dla mnie połączeniem odpowiedzi poprzez campeterson i Prabhat .
Problem polega na tym, że
readPreference
ustawienie domyślne toprimary
, co w jakiś sposób prowadzi do mylącegoslaveOk
błędu. Mój problem polega na tym, że chcę po prostu czytać z mojego zestawu replik z dowolnego węzła. Nawet nie łączę się z nim jak z repliką. Po prostu podłączam się do dowolnego węzła, aby z niego czytać.Ustawianie
readPreference
sięprimaryPreferred
(lub lepiej doReadPreference.PRIMARY_PREFERRED
stałej) rozwiązać go dla mnie. Wystarczy przekazać go jako opcjaMongoClient.connect()
lub doclient.db()
lub z dowolnegofind()
,aggregate()
lub innej funkcji.źródło