Criando um cliente
Nesta página
- Usando
Mongo::Client
- Sintaxe de bloco
- Seleção do reconhecimento de data center
- Tipos de conexão
- Conexão de servidor autônomo
- Conexão do conjunto de réplicas
- Conexão de Cluster Fragmentado
- Conexão direta
- Conexão do balancer de carga
- Conexão do MongoDB Atlas
- Conecte-se ao MongoDB Atlas do AWS Lambda
- Notas de URI do SRV
- Opções do cliente
- Opções de Ruby
- Opções de URI
- Opções de tempo limite
server_selection_timeout
socket_timeout
connect_timeout
max_time_ms
wtimeout
- Conexões TLS
- Nomes de opção TLS versus SSL
- Habilitar conexões TLS
- Especificar certificado TLS do cliente
- Modificando
SSLContext
- Especificar certificado CA
- Verificação do OCSP
- Conexões IPv4/IPv6
- Configuração de manutenção de atividade TCP
- Pool de conexões
- Uso com servidores forking
- Manipulação manual de bifurcações de processo
- Solução de problemas
- Leituras repetíveis
- Leituras repetíveis e modernas
- Leituras legadas que podem ser repetidas
- Desabilitar leituras repetíveis
- Gravações repetíveis
- Retryable writes modernas
- Gravações legadas que podem ser repetidas
- Desabilitação de retryable writes
- Exploração madeireira
- Alterando o nível do registrador
- Truncamento
- Compressão
- Parâmetros da API do servidor
- Configuração de desenvolvimento
- Configuração de produção
- Sinalizadores de recursos
Usando Mongo::Client
Para se conectar a um MongoDB deployment, crie um objeto Mongo::Client
. Forneça uma lista de hosts e opções ou umURI de connection string para o construtor ''Mongo::Client''. O banco de dados selecionado do cliente tem como padrão admin
.
Por padrão, o driver detectará automaticamente a topologia usada pelo sistema e se conectará adequadamente.
Para se conectar a uma implantação local autônomo do MongoDB, especifique o host e a porta do servidor. Na maioria dos casos, você também especificaria o nome do reconhecimento de data center ao qual se conectar; se nenhum nome de reconhecimento de data center for especificado, o cliente utilizará o reconhecimento de data center admin
:
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017/mydb")
Observação
O nome do host localhost
é tratado especialmente pelo driver e será resolvido apenas para endereços IPv4.
Para se conectar ao MongoDB Atlas, especifique o URI de implantação do Atlas:
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/mydb?w=majority")
O driver descobrirá todos os nós no cluster e se conectará a eles conforme necessário.
Sintaxe de bloco
Outra maneira de criar um objeto Mongo::Client é usar a sintaxe de bloco:
Mongo::Client.new(...) do |client| # work with the client end
Observe que, ao criar um cliente usando essa sintaxe, o cliente é fechado automaticamente após o término da execução do bloco.
Seleção do reconhecimento de data center
Por padrão, o cliente se conectará ao reconhecimento de data center admin
.
O banco de dados admin
é um banco de dados especial do MongoDB, frequentemente usado para tarefas administrativas e para armazenar dados administrativos, como usuários e roles (embora usuários e roles também possam ser definidos em outros bancos de dados). Em um cluster fragmentado, o banco de dados do admin
existe nos servidores de configuração em vez dos servidores de shard. Embora seja possível usar o banco de dados admin
para operações comuns (como armazenar dados do aplicativo), isso não é recomendado, e o aplicativo deve especificar explicitamente o banco de dados que deseja usar.
O reconhecimento de data center pode ser especificado durante a construção do Client
:
# Using Ruby client options: client = Mongo::Client.new(['localhost'], database: 'mydb') # Using a MongoDB URI: client = Mongo::Client.new('mongodb://localhost/mydb')
Dada uma instância Client
, o método use
pode ser invocado para obter uma nova instância Client
configurada com o reconhecimento de data center especificado:
client = Mongo::Client.new(['localhost'], database: 'mydb') admin_client = client.use('admin') # Issue an administrative command admin_client.database.command(replSetGetConfig: 1).documents.first
Existem outros reconhecimento de data center especiais no MongoDB que devem ser usados somente para os fins declarados:
O banco de dados de configuração .
O banco de dados local .
O banco de banco de dados do
$external
, que é usado com PLAIN, Kerberos e X.509 mecanismos de autenticação .
Tipos de conexão
Por padrão, o driver descobrirá o tipo de sistema ao qual é instruído a se conectar (exceto para sistemas com balanceamento de carga) e se comportará da maneira que corresponde ao tipo de sistema. As subseções abaixo descrevem como o driver se comporta em cada um dos tipos de implantação, bem como como forçar um comportamento específico, ignorando a detecção automática do tipo de implantação.
Observe que a detecção do tipo de sistema acontece quando o driver recebe a primeira resposta de qualquer um dos servidores aos quais é instruído a se conectar (a menos que o modo de balanceamento de carga seja solicitado, consulte abaixo). O driver permanecerá na topologia descoberta ou configurada mesmo que a implantação subjacente seja substituída por uma de um tipo diferente. Em particular, ao substituir um conjunto de réplicas por um cluster fragmentado no mesmo endereço, a instância do cliente deve ser recriada (por exemplo, reiniciando o aplicativo) para que ele se comunique com o cluster fragmentado.
Atualmente, a descoberta automática de sistemas com balanceamento de carga não é suportada. As implantações com carga balanceada serão tratadas como implantações de seu tipo subjacente, que geralmente seriam clusters fragmentados. O driver não funcionará corretamente ao tratar uma implantação com balanceamento de carga como um cluster fragmentado; portanto, quando a implantação é com balanceamento de carga, o cliente deve ser explicitamente configurado para se conectar a um balanceador de carga.
Conexão de servidor autônomo
Se a implantação for um servidor autônomo, também conhecido como autônomo, todas as operações serão direcionadas para o servidor especificado.
Se o servidor for desligado e substituído por um nó do conjunto de réplicas, o driver continuará enviando todas as operações para esse nó, mesmo que o nó seja ou se torne secundário.
Para forçar uma conexão standalone, consulte a seção de conexão direta abaixo.
Conexão do conjunto de réplicas
Ao conectar a um conjunto de réplicas, basta passar o endereço de qualquer nó no conjunto de réplicas para o driver. O nó não precisa ser o primário e pode ser um nó oculto. Em seguida, o driver descobrirá automaticamente os nós restantes.
No entanto, é recomendável especificar todos os nós que fazem parte do conjunto de réplicas, para que, no evento de um ou mais nós indisponíveis (por exemplo, devido a manutenção ou reconfiguração), o driver ainda possa se conectar ao conjunto de réplicas.
Exemplos de conexão do conjunto de réplicas:
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb")
Para fazer com que o driver verifique o nome do conjunto de réplicas na conexão, passe-o usando a opção Ruby replica_set
ou a opção URI replicaSet
:
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', replica_set: 'myapp') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?replicaSet=myapp")
Se o sistema não for um conjunto de réplicas ou usar um nome do conjunto diferente, todas as operações falharão (até que o conjunto de réplicas esperado seja retornado pelo servidor).
Também é possível forçar uma conexão de conjunto de réplicas sem especificar o nome do conjunto de réplicas. Fazer isso geralmente é desnecessário e está obsoleto:
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :replica_set) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=replica_set")
Para se conectar a um MongoDB Atlas cluster que é implantado como um conjunto de réplicas, conecte-se ao URI:
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
Revise as notas de URI SRV se estiver usando URIs SRV.
Conexão de Cluster Fragmentado
Para se conectar a um cluster fragmentado , especifique os endereços dos roteadores mongos
:
Mongo::Client.new([ '1.2.3.4:27017', '1.2.3.5:27017' ], database: 'mydb') Mongo::Client.new("mongodb://1.2.3.4:27017,1.2.3.5:27017/mydb")
Note que, ao contrário de uma conexão de conjunto de réplicas, você pode optar por se conectar a um subconjunto dos roteadores mongos
existentes no sistema. O driver monitorará cada roteador e usará os que estiverem disponíveis (ou seja, o driver geralmente lidará com roteadores individuais que ficam indisponíveis devido a falhas ou manutenção). Ao especificar a lista de roteadores explicitamente, o driver não descobrirá os roteadores restantes que podem ser configurados e não tentará se conectar a eles.
O driver equilibrará automaticamente a carga de operação entre os roteadores que ele conhece.
Para se conectar a um MongoDB Atlas cluster que é implantado como um sharded cluster, conecte-se ao URI:
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
Quando o driver se conecta a um cluster fragmentado por meio de um URI de SRV, ele pesquisa periodicamente os registros SRV do endereço especificado no URI em busca de alterações e adiciona e remove automaticamente os hosts mongos
de/para sua lista de servidores, pois eles são adicionados e removidos do/para o cluster fragmentado.
Para forçar uma conexão de cluster fragmentado, utilize a opção connect: :sharded
. Fazer isso geralmente é desnecessário e está obsoleto:
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :sharded) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=sharded")
Revise as notas de URI SRV se estiver usando URIs SRV.
Conexão direta
Para desabilitar a descoberta do tipo de implantação e forçar todas as operações a serem executadas em um servidor específico, especifique a opção direct_connection
:
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', direct_connection: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?directConnection=true")
Alternativamente, a opção connect: :direct
obsoleta é equivalente:
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', connect: :direct) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?connect=direct")
O modo de conexão direta é mais útil para executar operações em um nó do conjunto de réplicas específico, embora também permita que o servidor subjacente altere o tipo (por exemplo, de um nó do conjunto de réplicas para um roteador mongos
ou vice-versa).
Conexão do balancer de carga
Diferentemente de outros tipos de sistema, o driver não detecta automaticamente no momento um sistema com balanceamento de carga.
Para se conectar a um balancer de carga, especifique a opção Ruby load_balanced: true
ou a opção URI loadBalanced=true
:
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true")
Ao usar essas opções, se o servidor especificado não for um balancer de carga, o cliente falhará em todas as operações (até que o servidor se torne um balancer de carga).
Para tratar o servidor como um balancer de carga mesmo que ele não se identifique como tal, use a opção Ruby connect: :load_balanced
ou a opção URI connect=load_balanced
:
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true, connect: :load_balanced) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true&connect=load_balanced")
Conexão do MongoDB Atlas
Para se conectar a uma MongoDB deployment no Atlas, primeiro crie uma instância Mongo::Client
usando a string de conexão do cluster e outras opções do cliente.
Você pode definir a versão stable API como uma opção do cliente para evitar alterações significativas ao atualizar para uma nova versão do servidor.
O código a seguir mostra como você pode especificar a cadeia de conexão e a opção de cliente Stable API ao se conectar a uma implementação do MongoDB e verificar se a conexão foi bem-sucedida:
require 'mongo' # Replace the placeholders with your credentials uri = "mongodb+srv://<username>:<password>@cluster0.sample.mongodb.net/?retryWrites=true&w=majority" # Set the server_api field of the options object to Stable API version 1 options = { server_api: { version: "1" } } # Create a new client and connect to the server client = Mongo::Client.new(uri, options) # Send a ping to confirm a successful connection begin admin_client = client.use('admin') result = admin_client.database.command(ping: 1).documents.first puts "Pinged your deployment. You successfully connected to MongoDB!" rescue Mongo::Error::OperationFailure => ex puts ex ensure client.close end
Conecte-se ao MongoDB Atlas do AWS Lambda
Para saber como se conectar ao Atlas a partir do AWS Lambda, consulte a documentação Gerenciar conexões com o AWS Lambda.
Notas de URI do SRV
Quando o driver se conecta a um URI de protocolo mongodb+srv , lembre-se do seguinte:
A pesquisa de URI do SRV é realizada de forma síncrona quando o cliente é construído. Se essa pesquisa falhar por algum motivo, a construção do cliente falhará com uma exceção. Quando um cliente é construído com uma lista de hosts, o driver tentará entrar em contato e monitorar esses hosts enquanto o objeto do cliente existir. Se um desses hosts não for resolvido inicialmente, mas puder ser resolvido mais tarde, o driver poderá estabelecer uma conexão com esse host quando ele ficar disponível. A pesquisa inicial do URI do SRV deve ser bem-sucedida na primeira tentativa; pesquisas de host subsequentes serão repetidas pelo driver conforme necessário.
O driver procura opções de URI nos registros TXT do DNS correspondentes aos registros SRV. Essas opções podem ser substituídas pelas opções de URI especificadas no URI e pelas opções Ruby, nessa ordem.
Como as opções de URI são recuperadas em uma query de DNS separada da pesquisa de SRV, em ambientes com conectividade de rede não confiável, a query de opção de URI pode falhar quando a pesquisa de SRV for bem-sucedida. Essa falha faria com que o driver usasse a fonte de autenticação errada, levando a falhas de autenticação. Isso pode ser resolvido especificando explicitamente a fonte de autenticação:
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority&authSource=admin") Se a topologia do objeto
Client
construído for desconhecida ou for um cluster fragmentado, o driver começará a monitorar os registros DNS SRV especificados em busca de alterações e atualizará automaticamente a lista de servidores no cluster. As atualizações serão interrompidas se a topologia se tornar única ou um conjunto de réplicas.
Opções do cliente
Mongo::Client
o construtor do aceita uma série de opções que configuram o comportamento do driver. As opções podem ser fornecidas no hash de opções como opções Ruby, no URI como opções de URI ou ambos. Se uma opção Ruby e a opção análoga URI forem fornecidas, a opção Ruby terá precedência.
Opções de Ruby
Observação
As opções passadas diretamente devem ser símbolos.
Observação
A menos que especificado de outra forma, as opções Ruby que lidam com tempos são dadas em segundos.
Opção | Descrição | Tipo | Default | ||||||
---|---|---|---|---|---|---|---|---|---|
| Nome do aplicativo que é impresso nos registros do mongod ao estabelecer uma conexão nas versões do servidor >= 3.4. |
| none | ||||||
| Especifica o mecanismo de autenticação a ser usado. Pode ser um dos seguintes: |
| Se as credenciais do usuário não forem fornecidas, | ||||||
| Fornece propriedades adicionais do mecanismo de autenticação. As chaves nas propriedades são interpretadas sem distinção entre maiúsculas e minúsculas. Quando o cliente é criado, as chaves são minúsculas. |
| Ao utilizar o mecanismo de autenticação GSSAPI, as propriedades padrão são | ||||||
| Especifica a origem de autenticação. |
| Para MongoDB 2.6 e posterior: admin se as credenciais forem fornecidas, caso contrário, o reconhecimento de data center atual | ||||||
| Um
Para obter mais informações sobre como formatar essas opções, consulte a seção "Opções de criptografia automática" do tutorial Criptografia do lado do cliente. |
| none | ||||||
| Experimental. Controla se e como os backtraces são registrados quando ocorrem erros em threads em background. Se |
| none | ||||||
| Uma lista de compressores em potencial a serem usados, em ordem de preferência. Veja abaixo detalhes sobre como o driver implementa a compactação. |
| none | ||||||
| Obsoleto. Desabilita a descoberta da topologia de implantação normalmente executada pelo driver e força a topologia do cluster para um tipo específico. Os valores válidos são |
| none | ||||||
| O número de segundos para aguardar para estabelecer uma conexão de soquete antes de criar uma exceção. Esse tempo limite também é usado para a resolução de registros DNS SRV. |
| 10 | ||||||
| O nome do reconhecimento de data center ao qual se conectar. |
| admin | ||||||
| Conecte-se diretamente ao host especificado, não descobre a topologia de implantação. |
| false | ||||||
| O número de segundos para que os monitores do servidor atualizem os estados do servidor de forma assíncrona. |
| 10 | ||||||
| Um objeto personalizado para gerar ID para documento. Deve responder a #generate. |
| none | ||||||
| Se deve esperar para se conectar a um balancer de carga. |
| false | ||||||
| Especifica a latência máxima em segundos entre o servidor mais próximo e os servidores que podem estar disponíveis para seleção operar. |
| 0.015 | ||||||
| Um registrador personalizado. |
|
| ||||||
| O número máximo de conexões que o pool de conexões tentará estabelecer em paralelo. |
| 2 | ||||||
| O tempo máximo, em segundos, que uma conexão pode ficar ociosa antes de ser fechada pelo pool de conexões. Aviso: quando conectado a um balanceador de carga, o driver usa as conexões existentes para iterar cursor (o que inclui change stream) e executar transação. Definir um tempo ocioso por meio dessa opção pode fazer com que o driver feche conexões necessárias para operações subsequentes, causando falha nessas operações. |
| none | ||||||
| O tamanho máximo do pool de conexões para cada servidor. Definir essa opção como zero remove o limite de tamanho máximo do pool de conexões, permitindo que ele cresça para qualquer número de conexões. |
| 20 | ||||||
| O número máximo de tentativas de leitura, quando as tentativas de leitura legadas são usadas. Defina como 0 para desabilitar as novas tentativas de leitura de legado. |
| 1 | ||||||
| O número máximo de tentativas de gravação, quando novas tentativas de gravação legadas são usadas. Defina como 0 para desabilitar as novas tentativas de gravação legado. |
| 1 | ||||||
| O número mínimo de conexões no pool de conexões para cada servidor. O driver estabelecerá conexões em segundo plano até que o pool contenha esse número de conexões. |
| 0 | ||||||
| O objeto de monitoramento. |
| none | ||||||
| A senha do usuário com a qual autenticar. |
| none | ||||||
| Informações da plataforma que devem ser incluídas nos metadados impressos nos registros do mongod ao estabelecer uma conexão nas versões do servidor >= 3.4. |
| none | ||||||
| Especifica o modo de preferência de leitura e conjunto de tags para selecionar servidor como um
Se conjuntos de tags forem fornecidos, eles deverão ser uma array de hashes. Um servidor satisfaz a preferência de leitura se suas tags corresponderem a qualquer hash nos conjunto de tags fornecidos. Cada conjunto de tags deve ser um hash e será convertido internamente em uma instância |
|
| ||||||
| Especifica as opções de preocupação de leitura . A única chave válida é |
| none | ||||||
| O intervalo, em segundos, no qual as leituras em um mongos são repetidas. |
| 5 | ||||||
| Ao conectar a um conjunto de réplicas, este é o nome do conjunto para filtrar os servidores. |
| none | ||||||
| Se uma operação de gravação de instrução única falhar devido a um erro de rede, o driver tentará automaticamente novamente uma vez quando conectado às versões 3.6+ do servidor. |
| true | ||||||
| Como o cliente começa a monitorar a implantação em segundo plano assim que ela é construída, construir um cliente e, em seguida, assinar eventos SDAM em uma declaração separada pode fazer com que o assinante não receba alguns dos eventos SDAM. A opção Passe um Observação: o cliente não está totalmente construído quando o |
| none | ||||||
| A versão da API do servidor solicitada. Este é um hash com os seguintes itens permitidos: - Observe que a versão da API do servidor só pode ser especificada como uma opção Ruby, não como uma opção URI, e não pode ser substituída para objeto de reconhecimento de data center e collection. Se a versão da API do servidor for alterada em um cliente (por exemplo, por meio da chamada |
| none | ||||||
| O número de segundos para aguardar a seleção de um servidor apropriado para que uma operação seja executada antes de criar uma exceção. |
| 30 | ||||||
| O número de segundos para aguardar a execução de uma operação em um soquete antes de gerar uma exceção. |
| none | ||||||
| O número máximo de mongos com o qual o driver se comunicará para topologias fragmentadas. Se esta opção estiver definida para 0, não haverá nenhum número máximo de mongos. Se o URI fornecido for resolvido para mais hosts do que |
| 0 | ||||||
| O nome do serviço a ser usado na query DNS do SRV. |
| mongodb | ||||||
| Diga ao cliente para se conectar aos servidores via TLS. |
| false | ||||||
| O caminho do arquivo contendo certificados de autoridade de certificação concatenados usados para validar certificados passados da outra extremidade da conexão. Um de |
| none | ||||||
| Uma array de OpenSSL::X509::Certificate representando os certificados de autoridade de certificação usados para validar os certificados passados da outra extremidade da conexão. Um de |
| none | ||||||
| Uma string contendo certificados de autoridade de certificação concatenados usados para validar certificados passados da outra extremidade da conexão. Um de |
| none | ||||||
| Caminho para o arquivo de certificado do cliente usado para identificar a aplicação para o MongoDB Server. O arquivo também pode conter a chave privada do certificado; em caso afirmativo, a chave privada é ignorada por esta opção. O arquivo também pode conter certificados intermediários que formam a cadeia de certificados do certificado do cliente para o certificado da CA; quaisquer certificados intermediários serão analisados pelo driver e fornecidos ao contexto OpenSSL no atributo Esta opção, se presente, tem precedência sobre as opções |
| none | ||||||
| The OpenSSL::X509::Certificate used to identify the application to the MongoDB servers. Somente um certificado pode ser passado por esta opção. |
| none | ||||||
| Uma string contendo o certificado codificado PEM usado para identificar a aplicação para o MongoDB Server. A string também pode conter a chave privada do certificado; em caso afirmativo, a chave privada é ignorada por esta opção. A string também pode conter certificados intermediários que formam a cadeia de certificados do certificado do cliente para o certificado da CA; quaisquer certificados intermediários serão analisados pelo driver e fornecidos ao contexto OpenSSL no atributo Esta opção, se presente, tem precedência sobre a opção |
| none | ||||||
| O arquivo de chave privada usado para identificar a conexão com o MongoDB. Observe que, mesmo que a chave seja armazenada no mesmo arquivo que o certificado, ambos precisam ser explicitamente especificados. Esta opção, se presente, tem precedência sobre os valores de :ssl_key_string e :ssl_key_object. |
| none | ||||||
| A chave privada usada para identificar a conexão com o MongoDB. |
| none | ||||||
| Uma senha para a chave privada. |
| none | ||||||
| Uma string contendo a chave privada codificada PEM usada para identificar a conexão com o MongoDB. Este parâmetro, se presente, tem precedência sobre o valor da opção :ssl_key_object. |
| none | ||||||
| Se deve ser executada a validação do certificado de Peering, nome do host e endpoint OCSP. Observe que a decisão de validar certificados será substituída se |
| true | ||||||
| Se a validação do certificado de Peering deve ser executada. Essa configuração substitui a configuração |
| true | ||||||
| Se a validação do nome do host de Peering deve ser executada. Essa configuração substitui a configuração |
| true | ||||||
| Se o certificado fornecido pelo servidor deve ser validado em relação ao endpoint OCSP especificado no certificado, se o endpoint OCSP for especificado no certificado. Essa configuração substitui :ssl_verify em relação ao fato de a validação do endpoint OCSP ser executada. |
| true | ||||||
| Se os registros devem ser truncados nos 250 caracteres padrão. |
| true | ||||||
| O nome do usuário com o qual autenticar. |
| none | ||||||
| O número de segundos para aguardar uma conexão no pool de conexões ficar disponível. |
| 10 | ||||||
| Informações sobre bibliotecas, como ODMs, que estão envolvendo o driver. Especifique primeiro as bibliotecas de nível inferior. Chaves de hash permitidas: :name, :version, :platform. Exemplo: |
| none | ||||||
| Obsoleto. Equivalente à opção |
|
| ||||||
| Especifica as opções de referência de escrita como
|
|
| ||||||
| O nível de compressão zlib a ser usado, se estiver usando compressão. Consulte o módulo zlib do Ruby para obter níveis válidos. |
| none |
Observação
O driver Ruby não implementa a verificação da lista de revogação de certificados (CRL).
Opções de URI
Como as opções de URI devem estar em camel case, que não é o padrão Ruby, a tabela a seguir mostra as opções de URI e suas opções Ruby correspondentes.
As opções de URI são explicadas em detalhes na referência de URI de conexão.
Observação
As opções definidas em milissegundos no URI são representadas como float
em Ruby e as unidades são segundos.
Opção de URI | Opção Ruby |
---|---|
appName=String |
|
authMechanism=String |
Os valores do mecanismo de autenticação são convertidos da seguinte maneira de opções de URI para opções Ruby:
Se um valor diferente for fornecido para o mecanismo de autenticação, ele será convertido para a opção Ruby não modificada e manterá seu tipo |
authMechanismProperties=Strings |
Especificado como chave separada por vírgula:pares de valores, por exemplo |
authSource=String |
|
compressors=Strings |
Uma lista separada por vírgulas de possíveis compressores a serem usados, em ordem de preferência. Veja abaixo detalhes sobre como o driver implementa a compactação. |
connect=String |
Os mesmos valores que a opção Ruby |
connectTimeoutMS=Integer |
Ao contrário da opção Ruby correspondente, que falha na criação do cliente em valores inválidos (por exemplo, valores negativos e não numéricos), os valores inválidos fornecidos por meio dessa opção de URI são ignorados com um aviso. |
diretaConnection=Boolean |
|
fsync=Boolean |
|
heartbeatFrequencyMS=Integer |
|
journal=Boolean |
|
loadBalanced=Boolean |
|
LocalThresholdMS=Integer |
|
maxConnecting=Integer |
|
maxIdleTimeMS=Integer |
|
maxStalenessSeconds=Inteiro |
Se o valor da opção maxStalenessSeconds URI for -1, o driver trata isso como se a opção não tenha sido fornecida. Caso contrário, se o valor da opção for numérico, a opção Ruby será definida para o valor especificado convertido em |
maxPoolSize=Inteiro |
|
minPoolSize=Integer |
|
readConcernLevel=String |
|
readPreference=String |
|
readPreferenceTags=Strings |
Cada instância do campo readPreferenceTags é uma chave separada por vírgula:par de valores que aparecerá na array :tag_sets na ordem em que são especificados. Por exemplo, |
replicaSet=String |
|
retryWrites=Boolean |
|
serverSelectionTimeoutMS=Integer |
|
socketTimeoutMS=Integer |
Ao contrário da opção Ruby correspondente, que falha na criação do cliente em valores inválidos (por exemplo, valores negativos e não numéricos), os valores inválidos fornecidos por meio dessa opção de URI são ignorados com um aviso. |
srvMaxHosts=Integer |
|
srvServiceName=String |
|
ssl=Boolean |
|
tls=Boolean |
|
tlsAllowInvalidCertificates=Booleano |
Como |
tlsAllowInvalidHostnames=Boolean |
Como |
tlsCAFile=String |
|
tlsCertificateKeyFile=String |
|
tlsCertificateKeyFile=String |
|
tlsCertificateKeyFilePassword=String |
|
tlsDisableOCSPEndpointCheck=Boolean |
Como |
tlsInsecure=Boolean |
Como o tlsInsecure usa |
w=Integer|String |
|
waitQueueTimeoutMS=Integer |
|
wtimeoutMS=Integer |
|
zlibCompressionLevel=Integer |
|
Observação
O driver Ruby só falha nas conexões quando recebe uma resposta assinada definitiva indicando que o certificado do servidor foi revogado. Devido a isso, o driver não reconhece a opção tlsDisableCertificateRevocationCheck
URI. Se esta opção for fornecida em um URI, ela será ignorada.
Opções de tempo limite
server_selection_timeout
Ao executar uma operação, o número de segundos para aguardar o driver encontrar um servidor apropriado para enviar uma operação. O padrão é 30.
Um valor de 0 significa que não há tempo limite.
Quando um valor inválido (por exemplo, um valor negativo ou um valor não numérico) é passado por meio da opção URI, a entrada inválida é ignorada com um aviso. Quando um valor inválido é passado diretamente para o Cliente por meio de uma opção Ruby, a construção do Cliente falha com um erro.
Em implantações de conjuntos de réplicas, esse tempo limite deve ser definido para exceder os tempos típicos de eleição de conjuntos de réplicas para que o driver lide com as alterações primárias de forma transparente. Esse tempo limite também permite que o aplicativo e o banco de dados sejam iniciados simultaneamente; o aplicativo aguardará até esse momento para que o banco de dados fique disponível.
Se o servidor de aplicativos estiver atrás de um proxy reverso, o tempo limite de seleção do servidor deverá ser menor do que o tempo limite da solicitação configurado no proxy reverso (por exemplo, isso se aplica a implementações no Herku, que tem um tempo limite fixo de 30 segundos na camada de roteamento). Em desenvolvimento, esse valor pode ser reduzido para fornecer falhas mais rápidas quando o servidor não estiver em execução.
socket_timeout
O número de segundos para aguardar a conclusão de uma leitura ou gravação de soquete em conexões regulares (não de monitoramento). O padrão não é um tempo limite.
Um valor de 0 significa que não há tempo limite.
Quando um valor inválido (por exemplo, um valor negativo ou um valor não numérico) é passado por meio da opção URI, a entrada inválida é ignorada com um aviso. Quando um valor inválido é passado diretamente para o Cliente por meio de uma opção Ruby, a construção do Cliente falha com um erro.
Esse tempo limite deve levar em conta a latência da rede e a duração da operação. Por exemplo, definir esse tempo limite para 5 segundos cancelará as query que levam mais de 5 segundos para serem executadas no servidor com Mongo::Error::SocketTimeoutError
.
Observe que, embora por padrão não haja um tempo limite de soquete definido, o sistema operacional ainda pode atingir o tempo limite das operações de leitura, dependendo de sua configuração. As configurações de keepalive destinam-se a detectar conexões de rede interrompidas (em vez de abortar as operações simplesmente porque elas levam muito tempo para serem executadas).
Observe que, se uma operação atingir o tempo limite pelo driver devido a exceder o valor socket_timeout
, ela não será cancelada no servidor. Por esse motivo, é recomendável usar a opção max_time_ms
para operações de execução potencialmente longa, pois isso interromperá sua execução no servidor.
Essa opção não se aplica ao monitoramento de conexões.
connect_timeout
O número de segundos para aguardar o estabelecimento de uma conexão de soquete com um servidor. O padrão é 10.
Esse tempo limite também é usado como tempo limite de conexão e tempo limite de soquete para monitorar conexões.
Ao usar um URI mongodb+srv://
, esse tempo limite também é usado para pesquisas de DNS SRV e TXT. Observe que o tempo limite se aplica por pesquisa; devido às listas de pesquisa de sufixos DNS, várias pesquisas podem ser realizadas como parte de uma única resolução de nome.
wait_queue_timeout
O número de segundos para aguardar uma conexão no pool de conexões ficar disponível. O padrão é 10.
A partir da versão 2.11 do driver, esse tempo limite deve ser definido para um valor pelo menos tão grande quanto connect_timeout
, pois o pool de conexões agora estabelece totalmente as conexões antes de devolvê-las, o que pode exigir várias viagens de ida e volta da rede.
max_time_ms
Especificado como uma opção em uma operação específica, o número de milissegundos para permitir a execução da operação no servidor. Não definido por padrão.
Considere usar esta opção em vez de um socket_timeout
para que operações de execução potencialmente longas sejam interrompidas no servidor quando demorarem muito.
wtimeout
O número de milissegundos para aguardar o reconhecimento de uma gravação pelo número de servidor especificados na referência de escrita. Não definido por padrão, o que instrui o servidor a aplicar seu padrão. Esta opção pode ser definida globalmente no cliente ou passada para operações individuais em :write_concern
.
Conexões TLS
Para se conectar ao MongoDB deployment usando TLS:
Ative conexões TLS em
Mongo::Client
.Especifique o certificado TLS do cliente.
Especifique o certificado CA para verificar o certificado TLS do servidor.
Observação
Ao usar JRuby, os certificados ECDSA não são atualmente suportados.
Nomes de opção TLS versus SSL
Todas as versões do MongoDB Server suportadas pelo Ruby (2.6 e superior) implementam apenas TLS. 2.6 e servidores superiores não usam SSL.
Por motivos históricos, os nomes das opções Ruby referentes à configuração TLS usam o prefixo ssl
em vez do prefixo tls
. The next major version of the Ruby driver (3.0) will use the tls
prefix for Ruby option names.
Os nomes das opções de URI usam o prefixo tls
, com uma exceção: há uma opção de URI ssl
que é preterida e equivalente à opção de URI tls
.
Habilitar conexões TLS
O TLS deve ser solicitado explicitamente no lado do cliente quando a implantação exige conexões TLS — atualmente não há detecção automática se a implantação exige TLS.
Para solicitar conexões TLS, especifique as seguintes opções do cliente ao construir um Mongo::Client
:
A opção
:ssl
Ruby.A opção
tls
URI .A opção
ssl
URI (obsoleto).
Especificar certificado TLS do cliente
Por padrão, o MongoDB Server tentará verificar os certificados TLS dos clientes em conexão, o que exige que os clientes especifiquem seus certificados TLS ao se conectar. Isso pode ser feito via:
As opções Ruby
:ssl_cert
/:ssl_cert_object
/:ssl_cert_string
e:ssl_key
/:ssl_key_object
/:ssl_key_string
/:ssl_key_pass_phrase
.A opção
tlsCertificateKeyFile
URI .
Ao usar as opções Ruby, o certificado TLS do cliente e a chave privada correspondente podem ser fornecidos separadamente. Por exemplo, se o certificado for armazenado em client.crt
e a chave privada for armazenada em client.key
, um Mongo::Client
poderá ser construído da seguinte forma:
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt', )
ssl_cert
, ssl_cert_string
, ssl_key
e ssl_key_string
As opções Ruby também permitem que o certificado e a chave sejam fornecidos no mesmo arquivo ou string, respectivamente. Os arquivos que contêm certificado e chave privada frequentemente têm a extensão .pem
. Quando o certificado e a chave privada são fornecidos no mesmo arquivo ou string, as opções de certificado e chave devem ser utilizadas, da seguinte forma:
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
Ao usar a opção URI, o certificado e a chave devem ser armazenados em um arquivo e ambos devem ser armazenados no mesmo arquivo. Exemplo de uso:
client = Mongo::Client.new( "mongodb://localhost:27017/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCertificateKeyFile=path%2fto%2fca.crt")
Observação
Os valores das opções de URI devem ser escapados corretamente de URI. Isso se aplica, por exemplo, a barras nos caminhos.
Modificando SSLContext
Pode ser desejável configurar ainda mais as opções de TLS no driver, por exemplo, ativando ou desativando determinadas cifras. Atualmente, o driver Ruby não fornece uma maneira de fazer isso ao inicializar um Mongo::Client
.
No entanto, o driver Ruby fornece uma maneira de definir "ganchos de contexto TLS" globais - esses são objetos Proc``s that will be invoked before any TLS socket
connection and can be used to modify the underlying ``OpenSSL::SSL::SSLContext
fornecidos pelo usuário usados pelo soquete.
Para definir os ganchos de contexto TLS, adicione a array Proc``s to the ``Mongo.tls_context_hooks
. Isso deve ser feito antes de criar qualquer instância do Mongo::Client. Por exemplo, em um aplicativo Rails, esse código pode ser colocado em um inicializador.
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } ) # Only the AES256-SHA cipher will be enabled from this point forward
Cada Proc
em Mongo.tls_context_hooks
passará um objeto OpenSSL::SSL::SSLContext
como seu único argumento. Esses objetos Proc``s will
be executed sequentially during the creation of every ``Mongo::Socket::SSL
.
É possível atribuir toda a array de hooks chamando Mongo.tls_context_hooks=
, mas isso removerá todos os hooks atribuídos anteriormente. É recomendável usar os métodos Array#push
ou Array#unshift
para adicionar novos hooks.
Também é possível remover os hooks do Mongo.tls_context_hooks
armazenando uma referência aos Procs em outro lugar do aplicativo e, em seguida, usando o Array#delete_if
para remover os hooks desejados.
Aviso
Os hooks de contexto TLS são globais e afetarão todas as instâncias de Mongo::Client
. Qualquer biblioteca que permita que aplicativos habilitem esses hooks deve expor métodos para modificar os hooks (que podem ser chamados pelo aplicativo) em vez de habilitar automaticamente os hooks quando a biblioteca é carregada.
Mais informações sobre como configurar o servidor MongoDB para TLS estão disponíveis no manual do MongoDB .
Usando certificados intermediários
É possível usar cadeias de certificados para os certificados do cliente e do servidor. Ao usar cadeias, o parâmetro da autoridade de certificação deve ser configurado para conter somente os certificados raiz confiáveis; os certificados intermediários, se houver, devem ser fornecidos nos certificados do servidor ou do cliente, concatenando-os após os certificados do servidor da folha e do cliente, respectivamente.
:ssl_cert
e as opções :ssl_cert_string
Ruby, bem como a opção tlsCertificateKeyFile
URI, suportam cadeias de certificados. A opção Ruby :ssl_cert_object
, que usa uma instância de OpenSSL::X509::Certificate
, não oferece suporte a cadeias de certificados.
O driver Ruby executa a verificação rigorosa do certificado X.509, o que exige que ambos os campos a seguir sejam definidos no(s) certificado(s) intermediário(s):
Restrições básicas do X509v3: CA: true -- Pode assinar certificados
Uso da chave X509v3: Key Cert Sign -- Pode assinar certificados
Mais informações sobre esses sinalizadores podem ser encontradas nesta pergunta do Stack Overflow.
É uma armadilha comum concatenar certificados intermediários para os certificados CA raiz passados nas opções tlsCAFile
/ ssl_ca_cert
. Ao fazer isso, os certificados intermediários são elevados ao status confiável e não são verificados em relação à raiz real da CA. Mais informações sobre este problema estão disponíveis nesta publicação da lista de e-mails.
Especificar certificado CA
O driver tentará verificar o certificado TLS do servidor por padrão e cancelará a conexão se essa verificação falhar. Por padrão, o driver usará o armazenamento de certificados raiz do sistema padrão como âncora de confiança. Para especificar o certificado CA com o qual o certificado do servidor é assinado, use:
As opções
:ssl_ca_cert
/:ssl_ca_cert_string
/:ssl_ca_cert_object
RubyA opção
tlsCAFile
URI .
Se alguma dessas opções for fornecida, o certificado do servidor será verificado somente em relação ao certificado CA especificado e o armazenamento de certificados raiz do sistema padrão não será usado.
Para não executar a verificação do certificado TLS do servidor, o que não é recomendado, especifique a opção ssl_verify: false
Ruby ou a opção tlsInsecure=true
URI.
Especificando vários certificados CA
A opção :ssl_ca_cert
Ruby e a opção tlsCAFile
URI podem ser usadas com um arquivo contendo vários certificados. Todos os certificados assim referenciados se tornarão âncoras de confiança.
A opção :ssl_ca_cert_object
recebe uma array de certificados e, portanto, também pode ser usada para adicionar vários certificados como autoridades de certificação.
A opção :ssl_ca_cert_string
suporta a especificação de somente um certificado CA.
Aviso
Os certificados intermediários não devem ser fornecidos em arquivos especificados pelas opções de certificado CA. Isso elevaria os certificados intermediários ao status de certificados raiz, em vez de verificar os certificados intermediários em relação aos certificados raiz.
Se for necessário usar certificados intermediários, especifique-os como parte dos arquivos de certificado TLS do cliente ou servidor.
Verificação do OCSP
Se o certificado fornecido pelo servidor contiver um URI de endpoint OCSP, o driver emitirá uma solicitação OCSP para o endpoint especificado para verificar a validade do certificado.
A verificação de ponto de conexão do OCSP pode ser desabilitada configurando a opção Ruby :ssl_verify_ocsp_endpoint
para false
ou configurando a opção tlsDisableOCSPEndpointCheck
URI para true
ao criar um cliente.
Observação
A verificação de endpoints OCSP não é realizada atualmente ao ser executado no JRuby, pois o JRuby não expõe corretamente o URI do endpoint OCSP.
Conexões IPv4/IPv6
Quando um cliente é construído com localhost
como o nome do host, ele tentará uma conexão IPv4 somente (ou seja, se localhost
resolver para 127.0.0.1
e ::1
, o driver tentará se conectar apenas a 127.0.0.1
).
Quando um cliente é construído com nomes de host diferentes de localhost
, ele tentará as conexões IPv4 e IPv6, dependendo dos endereços para os quais os nomes de host são resolvidos. O driver respeita a ordem em que getaddrinfo
retorna os endereços e tentará se conectar a eles sequencialmente. A primeira conexão bem-sucedida será usada.
Atualmente, o driver não implementa o algoritmoHappyEeballs.
Configuração de manutenção de atividade TCP
Quando permitido pela configuração do sistema e pelo tempo de execução da linguagem Ruby, o driver habilita a manutenção de atividade TCP e, para cada um dos parâmetros de manutenção listados abaixo, define o valor do respectivo parâmetro para o valor especificado se o valor do sistema puder ser determinado e for maior que o valor do driver listado:
tcp_keepalive_time
: 120 segundostcp_keepalive_intvl
: 10 segundostcp_keepalive_cnt
: 9 sondas
Observação
A partir do JRuby 9.2.14.0, O JRuby não implementa a API necessária para definir os parâmetros de keepalive. Ao usar o JRuby, o driver não poderá definir os parâmetros de manutenção e a configuração do sistema estará em vigor.
Para usar valores mais baixos ou alterar os parâmetros em ambientes como o JRuby que não expõem as APIs necessárias, ajuste os parâmetros no nível do sistema, conforme descrito na seção de manutenção de atividade das Perguntas frequentes do MongoDB Diagnostics.
Pool de conexões
Mongo::Client
instâncias têm um pool de conexões por servidor ao qual o cliente está conectado. O pool cria conexões sob demanda para dar suporte às operações simultâneas do MongoDB emitidas pelo aplicativo. Não há afinidade de thread para conexões.
A instância do cliente abre uma conexão adicional por servidor conhecido para monitorar o estado do servidor.
O tamanho de cada pool de conexões é limitado a max_pool_size
, que o padrão é 5. Quando um thread no aplicativo inicia uma operação no MongoDB, ele tenta recuperar uma conexão do pool para enviar essa operação. Se houver algumas conexões disponíveis no pool, ele verificará uma conexão do pool e a usará para a operação. Se não houver conexões disponíveis e o tamanho do pool for menor que max_pool_size
, uma nova conexão será criada. Se todas as conexões estiverem em uso e o pool tiver atingido seu tamanho máximo, o thread aguardará que uma conexão seja retornada ao pool por outro thread. Se max_pool_size
estiver definido como zero, não haverá limite para o número máximo de conexões no pool.
Cada pool tem um limite de número de conexões que podem se conectar simultaneamente a um servidor. Esse limite é chamado de max_connecting
e o padrão é 2. Se o número de conexões que estão se conectando a um servidor atingir esse limite, o pool aguardará que uma tentativa de conexão seja bem-sucedida ou falhe antes de tentar criar uma nova conexão. Se o seu aplicativo tiver um grande número de threads, talvez você queira aumentar max_connecting
para evitar que os threads aguardem o estabelecimento de uma conexão.
O número de segundos que a thread aguardará até que uma conexão fique disponível é configurável. Esta configuração, chamada wait_queue_timeout
, é definida em segundos. Se esse tempo limite for atingido, um Timeout::Error
será gerado. O padrão é 1 segundo.
A partir da versão 2.11 do driver, o driver cria conexões até a configuração min_pool_size
. Antes da versão 2.11 do driver, o driver sempre criava conexões sob demanda. Em todas as versões do driver, depois que uma conexão for estabelecida, ela será mantida no pool pelo driver, desde que o tamanho do pool não exceda min_pool_size
.
Observe que, se min_pool_size
estiver definido para um valor maior que zero, o driver estabelecerá esse número de conexões com secundários em sistemas de conjuntos de réplicas, mesmo que o aplicativo não execute leituras secundárias. O objetivo dessas conexões é fornecer failover mais rápido quando o primário muda.
Veja um exemplo de estimativa do número de conexões que um aplicativo multithread abrirá: Um cliente conectado a um conjunto de réplicas de 3 nós abre 3 soquetes de monitoramento. Ele também abre quantos soquetes forem necessários para oferecer suporte às operações simultâneas de um aplicativo multithread em cada servidor, até max_pool_size
. Se o aplicativo usar apenas o primário (o padrão), somente o pool de conexões primárias crescerá e o total de conexões será de no máximo 8 (5 conexões para o pool primário + 3 conexões de monitoramento). Se o aplicativo usar uma read preference para consultar os secundários, seus pools também crescerão e o total de conexões poderá chegar a 18 (5 + 5 + 5 + 3).
A configuração padrão de um Mongo::Client
funciona para a maioria dos aplicativos:
client = Mongo::Client.new(["localhost:27017"])
Crie este cliente uma vez para cada processo e reutilize-o para todas as operações. É um erro comum criar um novo cliente para cada solicitação, o que é muito ineficiente e não é para isso que o cliente foi projetado.
Para suportar um número extremamente alto de operações simultâneas do MongoDB em um processo, aumente max_pool_size
:
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200)
Para oferecer suporte a um número extremamente alto de threads que compartilham o mesmo cliente em um processo, aumente max_connecting
:
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200, max_connecting: 10)
Qualquer número de threads pode aguardar a disponibilidade das conexões e pode aguardar a configuração padrão (1 segundo) ou wait_queue_timeout
:
client = Mongo::Client.new(["localhost:27017"], wait_queue_timeout: 0.5)
Quando #close
é chamado em um cliente por qualquer thread, todas as conexões são fechadas:
client.close
Observe que, ao criar um cliente usando a sintaxe de bloco descrita acima, o cliente é automaticamente fechado após o término da execução do bloco.
Uso com servidores forking
Observação
Os aplicativos que usam o Mongoid devem seguir a documentação "Uso com servidores forking" do Mongoid. A orientação abaixo é fornecida para aplicativos que usam diretamente o driver Ruby.
Ao usar o mongo Ruby driver em um aplicativo Web com um servidor Web de bifurcação, como o Puma, ou quando o aplicativo de outra forma bifurca, cada processo (pai e filho) deve ter suas próprias conexões de cliente. Isso ocorre porque:
Os threads Ruby em segundo plano, como aqueles usados pelo driver Ruby MongoDB para monitorar o estado da conexão, não são transferidos para o processo filho.
Descritores de arquivo, como soquetes de rede, são compartilhados entre processos pai e filho, o que pode causar conflitos de E/S.
Em relação (1), se você não reiniciar os threads de monitoramento do driver no processo filho após a bifurcação, embora seu filho possa inicialmente parecer funcionar corretamente, você eventualmente verá Mongo::Error::NoServerAvailable
exceções se/quando o estado do cluster MongoDB mudar, por exemplo , devido a erros de rede ou um evento de manutenção.
Em relação ao 2, se um processo filho reutilizar os descritores de arquivo dos pais, você verá Mongo::Error::SocketError
erros com mensagens como Errno::EPIPE: Broken pipe
e EOFError: end of file reached
.
Quando o driver Ruby for usado em um aplicação da web, se possível, recomendamos não criar nenhuma instância Mongo::Client
no processo pai (antes da bifurcação dos funcionários) e, em vez disso, criar apenas instâncias de cliente nos funcionários.
Manipulação manual de bifurcações de processo
Alguns casos de uso avançados, como a opção fork_worker do Puma, exigem que Mongo::Client
as instâncias estejam abertas nos processos pai e filho. Nesse caso, você deve lidar com a reconexão do cliente manualmente.
Para fazer isso, imediatamente antes da bifurcação, feche todas as conexões de cliente existentes em seu processo principal. Isso evitará que o processo principal sofra erros de rede e monitoramento devido à reutilização dos descritores de arquivos dos pais pelo filho.
# Immediately before fork client.close
Observação
A chamada de Client#close
não interrompe as operações do banco de dados atualmente a bordo. Os clientes se reconectarão automaticamente quando você realizar novas operações.
Em seguida, imediatamente após a bifurcação, reconecte seus clientes no processo filho recém-bifurcado, que reabilitará os threads de monitoramento do driver.
# Immediately after fork client.reconnect
A maioria dos servidores web fornece hooks que podem ser usados por aplicativos para executar ações quando os processos de trabalho são bifurcados. Os hooks recomendados são:
Para Puma, use
before_fork
eon_refork
para fechar clientes no processo pai eon_worker_boot
para se reconectar nos processos filho.Para unicórnio,
before_fork
para fechar clientes no processo pai eafter_fork
para reconectar clientes nos processos filho.Para Passageiro,
starting_worker_process
para reconectar clientes nos processos filho (o Passageiro parece não ter um hook pré-fork).
Consulte a documentação "Uso com servidores forking" do Mongoid para obter mais exemplos.
Solução de problemas
O método summary
do cliente retorna o estado atual do cliente, incluindo servidores que o cliente está monitorando e seu estado. Se algum dos servidores não estiver sendo monitorado, isso será indicado pelo sinalizador NO-MONITORING
.
Um cliente operando normalmente produzirá um resumo semelhante ao seguinte:
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
Um cliente sem threads em segundo plano produzirá um resumo semelhante ao seguinte:
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
Leituras repetíveis
O driver implementa dois mecanismos para tentar ler novamente: moderno e legado. A partir da versão 2.9.0 do driver, o mecanismo moderno é usado por padrão e o mecanismo legado é preterido.
Leituras repetíveis e modernas
Quando o mecanismo moderno é usado, as operações de leitura são tentadas novamente uma vez no evento de um erro de rede, um erro "não mestre" ou um erro "o nó está se recuperando". As seguintes operações são cobertas:
Collection#find e métodos relacionados
Alterar auxiliares de fluxo: Collection#watch, Database#watch, Client#watch
Comandos de enumeração: Client#list_mongo_databases, Client#list_databases, Client#database_names, Database#collection_names, Database#collections, Database#list_collections, Collection#indexes
Quando uma operação retorna um cursor, somente o comando de leitura inicial pode ser repetido. As operações getMore
nos cursores não são repetidas pela versão 2.9.0 ou mais recente do driver. Além disso, quando uma operação de leitura é tentada novamente, um novo servidor para a operação é selecionado; isso pode fazer com que a nova tentativa seja enviada para um servidor diferente daquele que recebeu a primeira leitura.
O comportamento das leituras repetíveis modernas é abordado em detalhes pela especificação de leituras repetíveis .
Observe que as leituras repetíveis modernas só podem ser usadas com servidores MongoDB 3.6 e superiores. Quando usado com servidor MongoDB 3.4 e inferiores, o Ruby versão 2.9.0 e superior não repetirá leituras por padrão - a aplicação deve solicitar explicitamente leituras legado definindo a opção retry_reads: false
do cliente ou usando a opção retryReads=false
URI.
Leituras legadas que podem ser repetidas
O comportamento de novas tentativas de leitura legado do Ruby está disponível definindo a opção retry_reads: false
do cliente ou passando a opção retryReads=false
URI para o cliente.
Ao usar o comportamento de novas tentativas de leitura legado, o número de novas tentativas pode ser definido especificando a opção max_read_retries
do cliente. Ao usar a versão 2.9.0 ou superior do driver, o conjunto de operações que seria repetido com leituras repetíveis legadas é idêntico ao descrito acima para leituras repetíveis modernas. Em versões mais antigas do driver, o comportamento das retryable writes legadas era diferente, pois algumas das operações não eram repetidas.
A partir da versão 2.9.0 do driver, as novas tentativas de leitura legadas executam a seleção do servidor antes de tentar novamente a operação, como fazem as gravações repetíveis modernas. Nas versões mais antigas do driver, as tentativas de leitura seriam enviadas para o mesmo servidor para o qual a leitura inicial foi enviada.
Desabilitar leituras repetíveis
Para desabilitar todas as tentativas de leitura, defina as seguintes opções do cliente: retry_reads: false, max_read_retries: 0
.
Gravações repetíveis
O driver implementa dois mecanismos para tentar novamente as gravações: moderno e legado. A partir da versão 2.9.0 do driver, o mecanismo moderno é usado por padrão em servidores que o suportam, e o mecanismo legado é preterido e desabilitado por padrão em todas as versões do servidor.
Os seguintes métodos de gravação usados nas operações diárias em collection estão sujeitos a novas tentativas de gravação:
collection#insert_one
collection#update_one
collection#delete_one
collection#replace_one
collection#find_one_and_update
collection#find_one_and_replace
collection#find_one_and_delete
collection#bulk_write
(para todas as operações de declaração única, ou seja, não paraupdate_many
oudelete_many
)
Retryable writes modernas
O mecanismo moderno tentará novamente a falha nas gravações uma vez, quando o driver estiver conectado a um conjunto de réplicas MongoDB 3.6 ou superior ou a um cluster fragmentado, porque exige um oplog no seridor. O mecanismo moderno não tentará novamente as gravações quando o driver estiver conectado a um MongoDB Server autônomo ou a versões 3.4 ou anteriores do servidor.
Os erros a seguir farão com que as gravações sejam repetidas:
Erros de rede, incluindo tempos limite
erros "não mestre"
erros "o nó está se recuperando"
Antes de tentar novamente a gravação, o driver realizará a seleção do servidor, pois o servidor para o qual a gravação original foi enviada provavelmente não pode mais ser usado.
Gravações legadas que podem ser repetidas
Se o mecanismo moderno de gravações repetidas for desabilitado pela configuração da opção retry_writes: false
do cliente ou pelo uso da opção URI retryWrites=false
, o driver utilizará o mecanismo legado de gravações repetidas. O mecanismo legado tenta novamente gravações nas mesmas operações que o mecanismo moderno. Por padrão, o mecanismo legado tenta novamente uma vez, como o mecanismo moderno faz; para alterar o número de tentativas, defina a opção :max_write_retries
do cliente.
A diferença entre os mecanismos de nova tentativa legados e modernos é que o mecanismo legado tenta novamente gravações para um conjunto diferente de erros em comparação com o mecanismo moderno e, especificamente, não tenta novamente gravações quando um tempo limite de rede é encontrado.
Desabilitação de retryable writes
Para desabilitar todas as tentativas de gravação, defina as seguintes opções do cliente: retry_writes: false, max_write_retries: 0
.
Exploração madeireira
Você pode usar o registrador de driver global padrão ou definir o seu. Para definir o seu:
Mongo::Logger.logger = other_logger
Consulte a documentação do Ruby Logger para obter mais informações sobre a API padrão do registrador e os níveis disponíveis.
Alterando o nível do registrador
Para alterar o nível do registrador:
Mongo::Logger.logger.level = Logger::WARN
Para obter mais controle, um registrador pode ser passado para um cliente para controle por cliente sobre o registro.
my_logger = Logger.new(STDOUT) Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :logger => my_logger )
Truncamento
O registro padrão trunca os registros em 250 caracteres por padrão. Para desativar isso, passe uma opção para a instância do cliente.
Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :truncate_logs => false )
Compressão
Para usar a compactação de protocolo de conexão, pelo menos um compressor deve ser explicitamente solicitado usando a opção Ruby :compressors
ou a opção compressors
URI. Se nenhum compressor for explicitamente solicitado, o driver não usará a compressão, mesmo que as dependências necessárias para um ou mais compressores estejam presentes no sistema.
O driver escolhe o primeiro compressor dos solicitados que também é suportado pelo servidor. Atualmente, o driver suporta os compressores zstd
, snappy
e zlib
. O compressor zstd
é recomendado, pois produz a maior compressão com o mesmo consumo de CPU em comparação com os outros compressores. Para compatibilidade máxima do servidor, todos os três compressores podem ser especificados, por exemplo, como compressors: ["zstd", "snappy", "zlib"]
.
zstd
compressor requer o zstd-ruby biblioteca a ser instalada. snappy
O compressor requer o snappy biblioteca a ser instalada. Se a compactação zstd
ou snappy
for solicitada e a respectiva biblioteca não for carregável, o driver gerará um erro durante a criação do Mongo::Client
. A compactação zlib
requer que a extensão de biblioteca padrão zlib
esteja presente.
O suporte do servidor para vários compressores é o seguinte:
zstd
exige e é habilitado por padrão no MongoDB 4.2 ou superior.snappy
requer MongoDB 3.4 ou superior e está habilitado por padrão no MongoDB 3.6 ou superior.zlib
requer MongoDB 3.6 ou superior e é habilitado por padrão no MongoDB 4.2 e superior.
Parâmetros da API do servidor
A partir do MongoDB 5.0, os aplicativos podem solicitar que o servidor se comporte de acordo com uma versão específica da API do servidor.
Os parâmetros da API do servidor podem ser especificados por meio da opção :server_api
para Client
. Esses parâmetros não podem ser fornecidos por meio de um URI.
Atualmente, a única versão de API definida é "1"
. Ele pode ser solicitado da seguinte forma:
client = Mongo::Client.new(['localhost'], server_api: {version: "1"})
MongoDB Server define versões da API como valores de string. Para conveniência, se a versão da API for fornecida como um número inteiro, o driver Ruby a stringificará e a enviará ao servidor como uma string:
client = Mongo::Client.new(['localhost'], server_api: {version: 1})
Observe que o servidor pode definir versões de API que não são inteiras em string. Os aplicativos não devem presumir que todas as versões legais da API podem ser expressas como números inteiros.
Quando uma determinada versão de API é solicitada, as operações que fazem parte dessa versão da API se comportam conforme especificado nessa versão da API. As operações que não fazem parte da versão de API especificada se comportam como se a versão de API não tivesse sido especificada. As operações cujo comportamento está sujeito à versão da API configurada são comandos, incluindo argumentos de comando, query, estágios de pipeline de agregação e argumentos.
Os aplicativos podem solicitar que o servidor rejeite todas as operações que não fazem parte da versão da API especificada definindo a opção :strict
:
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true})
Por exemplo, como a opção :tailable
não faz parte da API do servidor versão 1, a seguinte query falharia:
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true}) client['collection'].find({}, tailable: true) # => Mongo::Error::OperationFailure (BSON field 'FindCommand.tailable' is not allowed with apiStrict:true. (323) (on localhost:27017, modern retry, attempt 1))
Os aplicativos podem solicitar que o servidor rejeite todas as operações que estão obsoletas na versão da API especificada, configurando a opção :deprecation_errors
:
client = Mongo::Client.new(['localhost'], server_api: {version: "1", deprecation_errors: true})
Observe que, no momento em que este artigo foi escrito, não há operações obsoletas na versão "1"
da API.
Se os parâmetros da API do servidor tiverem sido definidos em um objeto Client
, eles serão enviados pelo cliente como parte de cada operação executada [1] .
[1] | getMore comandos e comandos em transação não aceitam parâmetros de API, portanto, o driver não os enviará nesses casos. |
O MongoDB Server anterior ao 5.0 não reconhece os parâmetros da API e produzirá uma variedade de erros caso a aplicação os configure. O driver Ruby enviará os parâmetros de API para todos os servidores do MongoDB 3.6 e mais recentes, mas os parâmetros da API só devem ser configurados quando o aplicativo estiver se comunicando com os servidores do MongoDB 5.0 ou mais recentes. Os parâmetros da API não podem ser enviados para servidor MongoDB 3.4 e mais antigos que usam o protocolo de conexão legado; se uma aplicação configurar os parâmetros da API e se conectar ao MongoDB 3.4 ou servidor mais antigos, o driver produzirá um erro em cada operação.
O auxiliar de comando permite que o aplicativo envie comandos construídos manualmente para o servidor. Se o cliente não estiver configurado com parâmetros de API do servidor, o auxiliar de comando poderá ser usado para emitir comandos com parâmetros de API:
client.database.command( ping: 1, apiVersion: "1", apiStrict: false, apiDeprecationErrors: false, )
Se o cliente estiver configurado com parâmetros de API do servidor, o auxiliar de comando não poderá ser usado para emitir comandos com parâmetros de API do servidor. Isso inclui o caso em que os parâmetros da API do servidor fornecidos ao cliente e ao auxiliar de comando são idênticos. Se um cliente for construído com parâmetros de API do servidor, para enviar parâmetros de API diferentes (ou nenhum), um novo cliente deverá ser construído, do zero ou usando o método with
.
Os parâmetros da API do servidor só podem ser especificados no nível do cliente. Eles não podem ser especificados no reconhecimento de data center, collection, sessão, transação ou nível de operação individual.
Configuração de desenvolvimento
A configuração padrão do impulsionador é adequada para o sistema de produção. Em desenvolvimento, algumas configurações podem ser ajustadas para proporcionar uma melhor experiência ao desenvolvedor.
:server_selection_timeout
: defina isso como um valor baixo (por exemplo,1
) se o servidor MongoDB estiver sendo executado localmente e você o iniciar manualmente. Um tempo limite de seleção de servidor baixo fará com que o driver falhe rapidamente quando não houver nenhum servidor em execução.
Configuração de produção
Considere o seguinte ao implantar um aplicativo usando o driver Ruby na produção:
A partir da versão 2.11 do driver, a opção
:min_pool_size
do cliente é totalmente respeitada - o driver criará esse número de conexões para cada servidor identificado como autônomo, primary ou secundário. Nas versões anteriores do driver, o driver criava conexões sob demanda. Os aplicativos que usam:min_pool_size
verão um aumento no número de conexões ociosas em todos os servidores a partir da versão 2.11 do driver e, especialmente, nos secundários em implantações de conjuntos de réplicas e nos nós em clusters fragmentados.Se o aplicativo for submetido a proxy reverso por outro servidor da web ou um balanceador de carga,
server_selection_timeout
geralmente deve ser definido como um valor mais baixo do que o tempo limite de leitura do proxy reverso. Por exemplo, otempo limite da 30 solicitação do Herói é segundos e não é configurável; se implantar um aplicativo Ruby usando MongoDB no Herói, considere reduzir o tempo limite de seleção do servidor para 20 ou 15 segundos.
Sinalizadores de recursos
A seguir está uma lista de sinalizadores de recursos que o mongo Ruby Driver fornece:
bandeira | Descrição |
---|---|
| Quando esse sinalizador estiver desativado, uma agregação feita em uma visualização será executada sobre os documentos incluídos nessa visualização, em vez de todos os documentos da collection. Quando esse sinalizador está ativado, o filtro de visualização é ignorado e a aggregation é aplicada sobre todos os documentos na collection do modo de exibição. (padrão: verdadeiro) |
| Quando esse sinalizador estiver desativado, as opções de visualização serão propagadas corretamente para os métodos |
| Valida que não há operadores atômicos (aqueles que começam com $) na raiz de um documento de substituição e que há apenas operadores atômicos na raiz de um documento de atualização. Se esse sinalizador de recurso estiver ativado, será gerado um erro em uma atualização ou documento de substituição inválido; caso contrário, um aviso será gerado nos registros. (padrão: falso) |
Estes sinalizadores de feição podem ser definidos diretamente no módulo Mongo
ou utilizando o método options
:
Mongo.validate_update_replace = true Mongo.options = { validate_update_replace: true }