Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Menu Docs

Configurar operações em conjuntos de réplicas

Neste guia, você pode aprender como configurar as opções de preocupação de gravação, preocupação de leitura e preferência de leitura para modificar a maneira como o driver Scala executa operações de criação, leitura, atualização e exclusão (CRUD) em conjuntos de réplicas.

É possível definir as opções de preocupação de gravação, preocupação de leitura e preferência de leitura nos seguintes níveis:

  • Cliente, que define o padrão para todas as execuções de operações, a menos que seja substituído

  • transação

  • Database

  • collection

Esta lista também indica a ordem crescente de precedência das configurações de opção. Por exemplo, se você definir um nível de preocupação de leitura para uma transação, ela substituirá um nível de preocupação de leitura herdado do cliente.

As opções de write concern, preocupação de leitura e preferência de leitura permitem personalizar a consistência causal e a disponibilidade dos dados em seus conjuntos de réplicas. Para ver uma lista completa dessas opções, consulte os seguintes guias no manual do MongoDB Server :

Você pode controlar como o driver roteia as operações de leitura entre os membros do conjunto de réplicas definindo uma preferência de leitura. Você também pode controlar como o driver aguarda a confirmação das operações de leitura e gravação em um conjunto de réplicas definindo preocupações de leitura e gravação.

As seções a seguir mostram como definir essas configurações de leitura e gravação em vários níveis.

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma instância MongoClient passando uma instância MongoClientSettings para o construtor. O código define as seguintes configurações:

  • secondary preferência de leitura: as operações de leitura recuperam dados de nós secundários do conjunto de réplicas.

  • LOCAL preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • W2 preocupação de gravação: o membro primário do conjunto de réplicas e um membro secundário devem confirmar a operação de gravação.

val mongoClient = MongoClient(MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.readPreference(ReadPreference.secondary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.W2)
.build())

Alternativamente, você pode especificar as configurações de leitura e escrita no URI de conexão, que é passado como um parâmetro para o construtor MongoClient :

val uriClient = MongoClient("mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local")

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma transação passando uma instância TransactionOptions para o método startTransaction(). As transações são executadas dentro de sessões, que são agrupamentos de operações de leitura ou escrita relacionadas que você pretende executar sequencialmente. Antes de configurar as opções de transação, crie uma instância do ClientSession para iniciar uma sessão.

Dica

Para saber mais sobre sessões, consulte Sessões do servidor no manual do MongoDB Server .

O exemplo define as seguintes configurações:

  • primary preferência de leitura: as operações de leitura recuperam dados do membro primário do conjunto de réplicas.

  • MAJORITY preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância que foram gravados para a maioria dos membros do conjunto de réplicas.

  • W1 preocupação de gravação: o membro primário do conjunto de réplicas deve confirmar a operação de gravação.

val clientSessionFuture = mongoClient.startSession().toFuture()
val clientSession = Await.result(clientSessionFuture, Duration(10, TimeUnit.SECONDS))
val tOptions: TransactionOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.MAJORITY)
.writeConcern(WriteConcern.W1)
.build()
clientSession.startTransaction(tOptions)

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de um banco de dados chamado test_database encadeando métodos de configuração ao método getDatabase(). O código define as seguintes configurações:

  • primaryPreferred preferência de leitura: as operações de leitura recuperam dados do membro primário do conjunto de réplicas ou de membros secundários se o principal não estiver disponível.

  • AVAILABLE preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • MAJORITY preocupação de gravação: A maioria de todos os membros do conjunto de réplicas deve reconhecer a operação de escrita.

val database = mongoClient.getDatabase("test_database")
.withReadPreference(ReadPreference.primaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.MAJORITY)

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma collection chamada test_collection encadeando métodos setter ao método getCollection() . O código define as seguintes configurações:

  • secondaryPreferred preferência de leitura: as operações de leitura recuperam dados de nós secundários do conjunto de réplicas ou dos nós primários se nenhum nó secundário estiver disponível.

  • AVAILABLE preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • UNACKNOWLEDGED preocupação de gravação: os membros do conjunto de réplicas não precisam confirmar a operação de gravação.

val collection = database.getCollection("test_collection")
.withReadPreference(ReadPreference.secondaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.UNACKNOWLEDGED)

As seções a seguir descrevem maneiras de personalizar ainda mais a forma como o driver Scala lê a partir dos nós do conjunto de réplicas.

No MongoDB Server, você pode aplicar tags de valor-chave a membros do conjunto de réplicas de acordo com qualquer critério que você escolher. Você pode então usar essas tags para direcionar um ou mais nós para uma operação de leitura.

Por padrão, o driver Scala ignora as tags ao escolher um membro para ler. Para instruir o driver Scala a preferir determinadas tags, passe as tags como uma lista para seu método de configuração de preferência de leitura .

Suponha que você esteja conectado a um conjunto de réplicas que contém membros hospedados em vários data centers nos Estados Unidos. Você deseja que o driver prefira leituras de nós secundários do conjunto de réplicas na seguinte ordem:

  1. Membros do centro de dados de Nova York, marcados com ("dc", "ny")

  2. Membros do centro de dados de São Francisco, marcados com ("dc", "sf")

  3. Quaisquer membros secundários

Este exemplo de código passa uma lista de tags que representam os membros do conjunto de réplicas anteriores para o método de configuração ReadPreference.secondary(). Em seguida, o código passa as informações de preferência de leitura para o método withReadPreference() para definir a ordem de leitura no banco de dados:

val tag1 = new TagSet(new Tag("dc", "ny"))
val tag2 = new TagSet(new Tag("dc", "sf"))
val tag3 = new TagSet()
val readPreference = ReadPreference.secondary(List(tag1, tag2, tag3).asJava)
val database = mongoClient.getDatabase("test_database")
.withReadPreference(readPreference)

Ao conectar-se a um conjunto de réplicas com uma preferência de leitura não primária, o driver lê do nó de conjunto de réplicas elegível mais próximo dentro da janela de latência. Ao conectar-se a um cluster sharded, o driver seleciona todas as instâncias mongos acessíveis dentro da janela de latência. Para saber mais sobre os modos de preferência de leitura, consulte Preferência de leitura.

Por padrão, o driver usa apenas os servidores cujos tempos de ping estão dentro de 15 milissegundos do servidor elegível mais próximo.

Por exemplo, suponha que seu conjunto de réplicas tenha cinco nós e o nó mais próximo tenha um tempo de ping de 5 milissegundos. Com o localThresholdMS padrão de 15 milissegundos, apenas nós com um tempo de ping de 20 milissegundos ou menos estão dentro da janela de latência, conforme mostrado na tabela a seguir:

Anfitrião
Tipo
Tempo de ping
Dentro da janela de latência

host1

Principal

5ms

Sim

host2

secundário

9ms

Sim

host3

secundário

13ms

Sim

host4

secundário

24ms

No

host5

secundário

42ms

No

Para ajustar a janela de latência, defina a opção localThreshold em uma instância MongoClientSettings ou a opção localThresholdMS no URI de conexão.

O exemplo a seguir especifica um limite local de 35 milissegundos. Selecione a aba MongoClientSettings ou Connection URI para ver o código correspondente para cada abordagem:

val client = MongoClient(MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.applyToClusterSettings(builder => builder
.localThreshold(35, TimeUnit.MILLISECONDS)
)
.build())
val connectionString = "mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"
val client = MongoClient(connectionString)

No exemplo anterior, o driver Scala distribui leituras entre membros correspondentes dentro de 35 milissegundos do tempo de ping do membro mais próximo.

Observação

O driver Scala ignora a opção localThresholdMS ao se comunicar com um conjunto de réplicas por meio de uma instância mongos. Nesse caso, use a opção de linha de comando localThreshold.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: