Tentei conjuntos de réplicas mongo pela primeira vez.
Estou usando o ubuntu no ec2 e inicializei três instâncias. Eu usei o endereço IP privado de cada uma das instâncias. Eu escolhi como o principal e abaixo é o código.
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
Tudo neste momento está bem. Quando vou ao site http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet , vejo que tenho um primário, um segundo dia e um árbitro.
Ok, agora para um teste.
No primário, crie um banco de dados neste é o código:
use tt
db.tt.save( { a : 123 } )
no secundário, faço isso e obtenho o erro abaixo:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
Eu sou muito novo no mongodb e replico, mas pensei que se eu fizer algo em um, ele vai para o outro. Portanto, se eu adicionar um registro em um, o que devo fazer para replicar nas máquinas?
mongodb
amazon-ec2
eLRuLL
fonte
fonte
Respostas:
Você precisa definir o modo "slave okay" para que o mongo shell saiba que está permitindo leituras de um secundário. Isso serve para proteger você e seus aplicativos de realizar leituras eventualmente consistentes por acidente. Você pode fazer isso no shell com:
Depois disso, você pode consultar normalmente a partir de secundários.
Uma observação sobre "eventual consistência": em circunstâncias normais, os secundários do conjunto de réplicas têm todos os mesmos dados que as primárias em um segundo ou menos. Sob carga muito alta, os dados que você gravou no primário podem demorar um pouco para replicar nos secundários. Isso é conhecido como "atraso de réplica" e a leitura de um secundário atrasado é conhecida como uma leitura "eventualmente consistente", porque, embora os dados recém-gravados sejam exibidos em algum momento (exceto falhas de rede, etc.), pode não ser disponível imediatamente.
Editar: Você só precisa definir o slaveok ao consultar de secundários e apenas uma vez por sessão.
fonte
Para evitar digitar
rs.slaveOk()
sempre, faça o seguinte:Crie um arquivo chamado
replStart.js
, contendo uma linha:rs.slaveOk()
Em seguida, inclua
--shell replStart.js
quando você iniciar o shell Mongo. Obviamente, se você estiver se conectando localmente a uma única instância, isso não salvará nenhuma digitação.fonte
rs.slaveOk()
ao seu~/.mongorc.js
arquivo, que será executado automaticamente ao iniciar o mongo shell.~/.mongorc.js
e configurações personalizadas emreplStart.js
ouadminStart.js
ou qualquer outra coisa.no mongodb2.0
você deveria digitar
no nó mongod secundário
fonte
ESTA É APENAS UMA NOTA PARA ALGUÉM LIDAR COM ESTE PROBLEMA USANDO O RUBY DRIVER
Eu tive esse mesmo problema ao usar a Ruby Gem.
Para definir slaveOk no Ruby, você apenas o passa como argumento quando cria o cliente assim:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
Observe que 'args' é o terceiro argumento opcional.
fonte
O slaveOk não funciona mais. É necessário usar o readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
por exemplo
fonte
Estou apenas adicionando esta resposta para uma situação embaraçosa do provedor de banco de dados.
o que aconteceu no nosso caso é o banco de dados primário e secundário alterado de forma inversa (primário para secundário e vice-versa) e estamos recebendo o mesmo erro.
portanto, verifique as definições de configuração do status do banco de dados que podem ajudá-lo.
fonte
Cheguei aqui procurando o mesmo erro, mas a partir de Node.js driver nativo . A resposta para mim foi a combinação de respostas de Campeterson e Prabhat .
O problema é que a
readPreference
configuração padrão é o queprimary
, de alguma forma, leva aoslaveOk
erro confuso . Meu problema é que eu apenas quero ler do meu conjunto de réplicas a partir de qualquer nó. Eu nem me conecto a ele como replicaset. Acabei de me conectar a qualquer nó para ler a partir dele.Definir
readPreference
paraprimaryPreferred
(ou melhor para aReadPreference.PRIMARY_PREFERRED
constante) resolveu isso para mim. Basta passá-lo como uma opção paraMongoClient.connect()
ou paraclient.db()
ou para qualquerfind()
,aggregate()
ou outra função.fonte