As instâncias do MongoDB mongos direcionam queries e operações de escrita em shards em um cluster fragmentado. mongos fornece a única interface para um cluster fragmentado da perspectiva de aplicativos. Os aplicativos nunca se conectam ou se comunicam diretamente com os shards.
O mongos rastreia quais dados estão em qual fragmento, armazenando em cache os metadados dos servidores de configuração. O mongos usa os metadados para rotear operações de aplicativos e clientes para as instâncias mongod. Um mongos não tem estado persistente e consome recursos mÃnimos do sistema.
A prática mais comum é executar instâncias mongos nos mesmos sistemas que seus servidores de aplicativos, mas você pode manter mongos instâncias nos shards ou em outros recursos dedicados. Consulte também Número de mongos e Distribuição.
Processo de Roteamento e Resultados
Uma instância mongos roteia uma query para um cluster por:
Determinando a lista de fragmentos que devem receber a query.
Estabelecendo um cursor em todos os shards direcionados.
The mongos then merges the data from each of the targeted shards and returns the result document. Certain query modifiers, such as sorting, are performed on each shard before mongos retrieves the results.
As operações de aggregation executadas em vários shards podem encaminhar os resultados de volta ao mongos para mesclar os resultados, caso não precisem ser executadas no primary sharddo banco de dados.
Há dois casos em que um pipeline não é elegÃvel para ser executado em mongos.
O primeiro caso ocorre quando a parte de mesclagem do pipeline dividido contém um estágio que deve ser executado em um primary shard. Por exemplo, se $lookup exigir acesso a uma collection não fragmentada no mesmo banco de dados que a collection fragmentada na qual a aggregation está sendo executada, a mesclagem será obrigada a ser executada no primary shard.
O segundo caso ocorre quando a parte de mesclagem do pipeline dividido contém um estágio que pode gravar dados temporários no disco, como $group, e o cliente especificou allowDiskUse:true Nesse caso, supondo que não haja outros estágios no pipeline de mesclagem que exijam o primary shard, a mesclagem é executada em um shard selecionado aleatoriamente no conjunto de shards visados pela aggregation.
Para obter mais informações sobre como o trabalho de aggregation é dividido entre os componentes de uma query de cluster fragmentado, use explain:true como parâmetro para a chamada aggregate(). O retorno inclui três objetos json. mergeType mostra onde o estágio da fusão acontece ("primaryShard", "anyShard" ou "mongos"). splitPipeline mostra quais operações em seu pipeline foram executadas em fragmentos individuais. shards mostra o trabalho que cada fragmento fez.
In some cases, when the shard key or a prefix of the shard key is a part of the query, the mongos performs a targeted operation, routing queries to a subset of shards in the cluster.
mongos performs a broadcast operation for queries that do not include the shard key, routing queries to all shards in the cluster. Some queries that do include the shard key may still result in a broadcast operation depending on the distribution of data in the cluster and the selectivity of the query.
Consulte Operações Direcionadas vs. Operações de Transmissão para saber mais sobre operações direcionadas e de transmissão.
mongos can support hedged reads to minimize latencies. See hedged reads for more information.
Como o mongos lida com Modificadores de query
Classificação
Se o resultado da query não for classificado, a instância mongos abrirá um cursor de resultado que "round robins" resultados de todos os cursores nos shards.
Limites
Se a query limitar o tamanho do conjunto de resultados utilizando o método do cursor limit(), a instância mongos passará esse limite para os shards e, em seguida, aplicará novamente o limite ao resultado antes de retornar o resultado ao cliente.
Pular
Se a query especificar um número de registros a serem ignorados usando o skip() método de cursor , o mongos não poderá passar o pulo para os fragmentos, mas recuperará resultados não ignorados dos fragmentos e ignorará o número apropriado de documentos ao montar o resultado completo.
Quando utilizado em conjunto com um limit(), o mongos passa do limite acrescido do valor do skip() aos shards para melhorar a eficiência dessas operações.
Leia Preferências e Fragmentos
Para agrupamentos fragmentados, o mongos aplica a preferência de leitura ao ler a partir dos fragmentos. O membro selecionado é regido pelas configurações de preferência de leitura e replication.localPingThresholdMs e é reavaliado para cada operação.
Para obter detalhes sobre preferências de leitura e clusters fragmentados, consulte Preferência de leitura e shards
Leituras cobertas
As instâncias de mongos podem proteger leituras que usam preferências de leitura nãoprimary. Com leituras distribuÃdas, as instâncias de mongos encaminham operações de leitura para dois membros do conjunto de réplicas por cada fragmento consultado e retornam resultados do primeiro respondente por fragmento. A leitura adicional enviada para proteger a operação de leitura usa o valor maxTimeMS de maxTimeMSForHedgedReads.
As leituras distribuÃdas são suportadas para as seguintes operações:
Leituras DistribuÃdas e Preferência de Leitura
As leituras com hedge são especificadas por operação como parte da preferência de leitura. As non-primary read preferences suportam leituras protegidas. Consulte Opção de preferência de leitura com hedge.
Para especificar a leitura distribuÃda para uma preferência de leitura não
primary, consulte a documentação da API de preferência de leitura do driver.A Preferência de leitura
nearesthabilita a opção de leitura protegida por padrão.
Para obter detalhes sobre read preference e clusters fragmentados, bem como sobre a seleção de membros, consulte Preferência de leitura e shards.
Ativar/Desativar suporte para Leituras DistribuÃdas
Por padrão, as instâncias mongos suportam o uso de leituras distribuÃdas. Para desativar o suporte de uma instância mongos para leituras distribuÃdas, consulte o parâmetro readHedgingMode. Se o suporte de leituras distribuÃdas for off, mongos não usará leiturasdistribuÃdas, independentemente da opção hedge especificada para a preferência de leitura.
Diagnóstico de Leituras DistribuÃdas
The command serverStatus and its corresponding mongosh method db.serverStatus() return hedgingMetrics.
Confirme a Conexão com mongos Instâncias
Para detectar se a instância do MongoDB à qual seu cliente está conectado mongos, use o comando hello. Quando um cliente se conecta a um mongos, hello retorna um documento com um campo msg que contém a cadeia de caracteres isdbgrid. Por exemplo:
{ "isWritablePrimary" : true, "msg" : "isdbgrid", "maxBsonObjectSize" : 16777216, "ok" : 1, ... }
Se, em vez disso, o aplicativo estiver conectado a um mongod, o documento retornado não incluirá a cadeia de caracteres isdbgrid.
Operações direcionadas vs. operações de transmissão
Generally, the fastest queries in a sharded environment are those that mongos route to a single shard, using the shard key and the cluster meta data from the config server. These targeted operations use the shard key value to locate the shard or subset of shards that satisfy the query document.
Para queries que não incluem a chave de shard, mongos deve consultar todos os shards, wait por suas responses e, em seguida, retornar o result para o aplicativo. Essas queries de "scatter/gather" podem ser operações de longa duração.
Operações de Transmissão
As instâncias mongos transmitem queries para todos os shards da collection , a menos que o mongos possa determinar qual shard ou subconjunto de shards armazena esses dados.
Depois que o mongos recebe respostas de todos os fragmentos, mescla os dados e retorna o documento de resultado. O desempenho de uma operação de transmissão depende da carga geral do cluster, bem como de variáveis como latência de rede, carga de fragmento individual e número de documentos retornados por fragmento. Sempre que possÃvel, privilegie as operações que resultam em operação direcionada em detrimento daquelas que resultam em uma operação de transmissão.
As operações de atualização múltipla são sempre operações de transmissão.
Os métodos updateMany() e deleteMany() são operações de transmissão, a menos que o documento de query especifique a chave de shard completa.
Operações Direcionadas
mongos pode rotear queries que incluem a chave de fragmento ou o prefixo de uma chave de fragmento composta para um fragmento especÃfico ou um conjunto de fragmentos. mongos usa o valor da chave do fragmento para localizar o fragmento cujo intervalo inclui o valor da chave do fragmento e direciona a query para o fragmento que contém esse fragmento.
Por exemplo, se a chave de shard for:
{ a: 1, b: 1, c: 1 }
O programa mongos pode rotear queries que incluam a chave de fragmento completa ou qualquer um dos seguintes prefixos de chave de fragmento em um fragmento ou conjunto de fragmentos especÃfico:
{ a: 1 } { a: 1, b: 1 }
Todas as operações do insertOne() são direcionadas para um fragmento. Cada documento na array insertMany() tem como alvo um único fragmento, mas não há garantia de que todos os documentos na array sejam inseridos em um único fragmento.
Todas as operações updateOne(), replaceOne() e deleteOne() devem incluir a chave de fragmento ou _id no documento de query. O MongoDB retornará um erro se esses métodos forem usados sem a chave fragmentada ou _id.
Depending on the distribution of data in the cluster and the selectivity of the query, mongos may still perform a broadcast operation to fulfill these queries.
Uso do Ãndice
Quando um shard recebe uma query, ele utiliza o Ãndice mais eficiente disponÃvel para atender a essa query. O Ãndice usado pode ser o Ãndice de chave de shard ou outro Ãndice elegÃvel presente no shard.
Segurança de Cluster Fragmentado
Use a autenticação interna/de associação autogerenciada para reforçar a segurança dentro do cluster e impedir que componentes não autorizados do cluster acessem o cluster. Você deve iniciar cada mongod ou mongos no cluster com as configurações de segurança adequadas para impor a autenticação interna.
A partir do MongoDB 5.3, o SCRAM-SHA-1 não pode ser usado para autenticação intra-cluster. Somente SCRAM-SHA-256 é suportado.
Em versões anteriores do MongoDB, SCRAM-SHA-1 e SCRAM-SHA-256 podem ser usados para autenticação intra-cluster, mesmo que o SCRAM não esteja explicitamente habilitado.
Consulte Keyfile Authentication for Clusters Autogerenciado para obter um tutorial sobre como implantar um cluster seguro.
Usuários do Cluster
Os clusters fragmentados oferecem suporte ao controle de acesso baseado em função em implantações autogerenciadas (RBAC) para restringir o acesso não autorizado a dados e operações do cluster. Você deve iniciar cada mongod no cluster, incluindo os servidores de configuração, com a opção --auth para impor o RBAC. Como alternativa, forçar a autenticação interna/de associação autogerenciada para segurança entre clusters também permite controles de acesso do usuário via RBAC.
With RBAC enforced, clients must specify a --username, --password, and --authenticationDatabase when connecting to the mongos in order to access cluster resources.
Cada cluster tem seus próprios usuários de cluster. Esses usuários não podem ser usados para acessar shards individuais.
Consulte Habilitar controle de acesso em implantações autogerenciadas para obter um tutorial sobre como habilitar a adição de usuários a uma implantação do MongoDB habilitada para RBAC.
Operações de Metadados
O mongos utiliza o "majority" write concern para as seguintes operações que afetam os metadados do cluster fragmentado:
Informações adicionais
Compatibilidade com fCV
O binário mongos não pode se conectar a instâncias mongod cuja feature compatibility version (fCV) seja maior que a do mongos. Por exemplo, você não pode conectar um MongoDB 4.0 versão mongos a um 4.2 cluster fragmentado com fCV definido como 4.2. Entretanto, você pode conectar um MongoDB versão 4.0 mongos a um cluster fragmentado 4.2 com fCV definido como 4.0.
Requisitos de captura de dados de diagnóstico em tempo integral
mongod inclui um mecanismo de captura de dados de diagnóstico em tempo integral para ajudar os engenheiros do MongoDB a solucionar problemas nos sistemas. Se essa thread falhar, ela encerra o processo de origem. Para evitar as falhas mais comuns, confirme se o usuário que está executando o processo tem permissões para criar o diretório FTDC diagnostic.data. Para mongod, o diretório está dentro de storage.dbPath. Para mongos, ele é paralelo a systemLog.path.
Pool de Conexões
A partir do MongoDB 4.2, o MongoDB adiciona o parâmetro ShardingTaskExecutorPoolReplicaSetMatching. Esse parâmetro determina o tamanho mÃnimo do pool de conexões da instância mongod / mongos do pool de conexões da instância para cada membro do cluster fragmentado. Este valor pode variar durante o tempo de execução.
mongod e mongos mantêm pools de conexão para cada conjunto de réplicas secundário para cada conjunto de réplicas no cluster fragmentado. Por padrão, esses pools têm um número de conexões que é pelo menos igual ao número de conexões com o primary.
Para modificar, consulte ShardingTaskExecutorPoolReplicaSetMatching.
Usando Aggregation Pipelines com Clusters
Para obter mais informações sobre como a fragmentação funciona com as agregações, leia o capÃtulo sobre fragmentação no e-book Practical MongoDB Aggregations.