{"id":58063,"date":"2023-03-16T04:42:04","date_gmt":"2023-03-16T07:42:04","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=58063&#038;preview=true&#038;preview_id=58063"},"modified":"2023-08-24T02:32:16","modified_gmt":"2023-08-24T05:32:16","slug":"replica-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/","title":{"rendered":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)"},"content":{"rendered":"<p>MongoDB \u00e9 um banco de dados <a href=\"https:\/\/kinsta.com\/pt\/blog\/mongodb-vs-mysql\/\">NoSQL<\/a> que utiliza documentos do tipo JSON com esquemas din\u00e2micos. Ao trabalhar com bancos de dados, \u00e9 sempre bom ter um plano de conting\u00eancia caso um de seus servidores de banco de dados falhe. Al\u00e9m disso, voc\u00ea pode reduzir as chances de isso acontecer utilizando uma <a href=\"https:\/\/kinsta.com\/pt\/mykinsta\/\">ferramenta de gerenciamento interessante<\/a> em seu site WordPress.<\/p>\n<p>Por isso a utilidade de possuir muitas c\u00f3pias de seus dados. Isso tamb\u00e9m reduz as lat\u00eancias de leitura. Ao mesmo tempo, ele pode melhorar a escalabilidade e a disponibilidade do banco de dados. \u00c9 aqui que entra a replica\u00e7\u00e3o. Replica\u00e7\u00e3o \u00e9 definida como a pr\u00e1tica de <a href=\"https:\/\/kinsta.com\/pt\/blog\/mysql-backup-database\/\">sincroniza\u00e7\u00e3o<\/a> de dados entre m\u00faltiplos <a href=\"https:\/\/kinsta.com\/pt\/blog\/banco-de-dados-de-codigo-aberto\/\">bancos de dados<\/a>.<\/p>\n<p>Neste artigo, analisaremos v\u00e1rios aspectos relevantes da replica\u00e7\u00e3o do MongoDB, como suas funcionalidades e mecanismo, para citar alguns exemplos.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>O que \u00e9 replica\u00e7\u00e3o no MongoDB?<\/h2>\n<p>No MongoDB, conjuntos de r\u00e9plicas (replica sets) realizam a replica\u00e7\u00e3o. Trata-se de um grupo de servidores que mant\u00eam o mesmo conjunto de dados atrav\u00e9s da replica\u00e7\u00e3o. Voc\u00ea tamb\u00e9m pode utilizar a replica\u00e7\u00e3o do MongoDB como parte do balanceador de carga. Nesse caso, \u00e9 poss\u00edvel distribuir as opera\u00e7\u00f5es de escrita e leitura entre todas as inst\u00e2ncias, de acordo com a necessidade do caso de uso.<\/p>\n\n<h2>O que \u00e9 um conjunto de r\u00e9plicas MongoDB?<\/h2>\n<p>Cada inst\u00e2ncia do <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mongodb\/\">MongoDB<\/a> que faz parte de um determinado conjunto de r\u00e9plicas \u00e9 um membro. Cada conjunto de r\u00e9plicas precisa ter um membro principal e pelo menos um membro secund\u00e1rio.<\/p>\n<p>O membro prim\u00e1rio \u00e9 o principal ponto de acesso para transa\u00e7\u00f5es com o conjunto de r\u00e9plicas. \u00c9 tamb\u00e9m o \u00fanico membro que pode aceitar opera\u00e7\u00f5es de escrita. A r\u00e9plica primeiro copia o oplog (registro de opera\u00e7\u00f5es) do membro principal. Em seguida, ela repete as altera\u00e7\u00f5es registradas nos respectivos conjuntos de dados dos secund\u00e1rios. Portanto, cada conjunto de r\u00e9plicas s\u00f3 pode ter um membro principal de cada vez. V\u00e1rios membros prim\u00e1rios que recebem opera\u00e7\u00f5es de escrita podem causar conflitos de dados.<\/p>\n<p>Normalmente, os aplicativos consultam apenas o membro prim\u00e1rio para opera\u00e7\u00f5es de escrita e leitura. Voc\u00ea pode projetar sua configura\u00e7\u00e3o para ler de um ou mais dos membros secund\u00e1rios. A transfer\u00eancia de dados ass\u00edncrona pode fazer com que leituras nos n\u00f3s secund\u00e1rios sirvam dados antigos. Portanto, essa disposi\u00e7\u00e3o n\u00e3o \u00e9 ideal para todos os casos de uso.<\/p>\n<h3>Funcionalidades do conjunto de r\u00e9plicas<\/h3>\n<p>O mecanismo autom\u00e1tico de failover faz com que a r\u00e9plica da MongoDB se diferencie da concorr\u00eancia. Na aus\u00eancia de um prim\u00e1rio, uma elei\u00e7\u00e3o automatizada entre os secund\u00e1rios escolhe um novo prim\u00e1rio.<\/p>\n<h3>Conjunto de r\u00e9plicas MongoDB vs MongoDB Cluster<\/h3>\n<p>Um conjunto de r\u00e9plicas MongoDB ir\u00e1 criar v\u00e1rias c\u00f3pias do mesmo conjunto de dados atrav\u00e9s do conjunto de r\u00e9plicas. O objetivo principal de um conjunto de r\u00e9plicas \u00e9:<\/p>\n<ul>\n<li>Oferecer uma solu\u00e7\u00e3o de backup integrada<\/li>\n<li>Aumentar a disponibilidade dos dados<\/li>\n<\/ul>\n<p>Um cluster MongoDB \u00e9 um jogo completamente diferente. Ele distribui os dados por v\u00e1rios nodes atrav\u00e9s de uma chave shard (shard key). Esse processo fragmenta os dados em v\u00e1rias partes chamadas de shards. Em seguida, cada shard \u00e9 copiado para um node diferente. Um cluster visa suportar grandes conjuntos de dados e opera\u00e7\u00f5es de alto rendimento, alcan\u00e7ando isso atrav\u00e9s do escalonamento horizontal da carga de trabalho. Isso permite que o sistema cres\u00e7a de forma eficiente \u00e0 medida que mais dados s\u00e3o adicionados e mais opera\u00e7\u00f5es s\u00e3o realizadas.<\/p>\n<p>Aqui est\u00e1 a diferen\u00e7a entre um conjunto de r\u00e9plicas e um agrupamento, em termos leigos:<\/p>\n<ul>\n<li>Um cluster distribui a carga de trabalho. Ele tamb\u00e9m armazena fragmentos de dados (shards) em muitos servidores.<\/li>\n<li>Um conjunto de r\u00e9plicas duplica completamente o conjunto de dados.<\/li>\n<\/ul>\n<p>O MongoDB permite que voc\u00ea combine essas funcionalidades criando um cluster particionado. Aqui, voc\u00ea pode replicar cada shard para um servidor secund\u00e1rio. Isso permite que um shard ofere\u00e7a alta redund\u00e2ncia e disponibilidade de dados.<\/p>\n<p>Manter e configurar um conjunto de r\u00e9plicas pode ser tecnicamente desafiador e demorado. E encontrar o servi\u00e7o de hospedagem certo? Isso \u00e9 uma dor de cabe\u00e7a totalmente diferente. Com tantas op\u00e7\u00f5es por a\u00ed, \u00e9 f\u00e1cil perder horas pesquisando em vez de construir seu neg\u00f3cio.<\/p>\n<p>Aqui est\u00e1 uma breve explica\u00e7\u00e3o sobre uma ferramenta que faz tudo isso e muito mais, para que voc\u00ea possa continuar sendo bem-sucedido com seu servi\u00e7o\/produto.<\/p>\n<p>A solu\u00e7\u00e3o\u00a0<a href=\"https:\/\/sevalla.com\/application-hosting\/\">Hospedagem de Aplicativos<\/a> da Kinsta, usada por mais de 55.000 desenvolvedores, permite que voc\u00ea esteja pronto para trabalhar em apenas 3 etapas simples. Se isso parece bom demais para ser verdade, aqui est\u00e3o mais alguns benef\u00edcios de usar a Kinsta:<\/p>\n<ul>\n<li><strong>Aproveite o melhor desempenho com as conex\u00f5es internas da Kinsta<\/strong>: Esque\u00e7a suas lutas com bancos de dados compartilhados. Mude para bancos de dados dedicados com conex\u00f5es internas que n\u00e3o t\u00eam limite de contagem de consultas ou de linhas. Kinsta \u00e9 mais r\u00e1pido, mais seguro e n\u00e3o lhe cobra pela largura de banda\/tr\u00e1fego interno.<\/li>\n<li><strong>Um conjunto de recursos sob medida para desenvolvedores<\/strong>: Escale seu aplicativo na plataforma robusta que suporta Gmail, YouTube e Google Search. Fique tranquilo, voc\u00ea est\u00e1 em m\u00e3os seguras.<\/li>\n<li><strong>Desfrute de velocidades inigual\u00e1veis com um centro de dados da sua escolha<\/strong>: Escolha a regi\u00e3o que funciona melhor para voc\u00ea e seus clientes. Com mais de 25 centros de dados \u00e0 sua escolha, os 300 PoPs da Kinsta garantem a m\u00e1xima velocidade e uma presen\u00e7a global ao seu site.<\/li>\n<\/ul>\n<p>Experimente a solu\u00e7\u00e3o de <a href=\"https:\/\/kinsta.com\/pt\/inscreva-se\/?product_type=app-db\">hospedagem de aplicativos da Kinsta gratuitamente hoje mesmo<\/a>!<\/p>\n<h2>Como funciona a replica\u00e7\u00e3o no MongoDB?<\/h2>\n<p>No MongoDB, voc\u00ea envia opera\u00e7\u00f5es de escrita para o servidor prim\u00e1rio (node). O servidor prim\u00e1rio atribui as opera\u00e7\u00f5es atrav\u00e9s dos servidores secund\u00e1rios, replicando os dados.<\/p>\n<figure id=\"attachment_148331\" aria-describedby=\"caption-attachment-148331\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/MongoDB-Replica-Set-Election.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148331 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/MongoDB-Replica-Set-Election.png\" alt=\"Ilustra\u00e7\u00e3o do Processo de Replica\u00e7\u00e3o MongoDB\" width=\"1024\" height=\"763\"><\/a><figcaption id=\"caption-attachment-148331\" class=\"wp-caption-text\">Ilustra\u00e7\u00e3o do Processo de Replica\u00e7\u00e3o MongoDB (Fonte de Imagem: <a href=\"https:\/\/www.mongodb.com\/basics\/replication\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB<\/a>)<\/figcaption><\/figure>\n<h3>Tr\u00eas tipos de Nodes MongoDB<\/h3>\n<p>Dos tr\u00eas tipos de nodes do MongoDB, dois j\u00e1 foram mencionados anteriormente: nodes prim\u00e1rios e secund\u00e1rios. O terceiro tipo de node do MongoDB que se mostra \u00fatil durante a replica\u00e7\u00e3o \u00e9 um \u00e1rbitro. O node \u00e1rbitro n\u00e3o possui uma c\u00f3pia do conjunto de dados e n\u00e3o pode se tornar um prim\u00e1rio. Dito isso, o \u00e1rbitro participa das elei\u00e7\u00f5es para o prim\u00e1rio.<\/p>\n<p>N\u00f3s j\u00e1 mencionamos anteriormente o que acontece quando o node prim\u00e1rio fica indispon\u00edvel, mas e se os nodes secund\u00e1rios forem perdidos? Nesse cen\u00e1rio, o node prim\u00e1rio passa a ser secund\u00e1rio e o banco de dados fica inacess\u00edvel.<\/p>\n<p>\u00a0<\/p>\n<h3>Elei\u00e7\u00e3o de membro<\/h3>\n<p>As elei\u00e7\u00f5es podem ocorrer nos seguintes cen\u00e1rios:<\/p>\n<ul>\n<li>Inicializa\u00e7\u00e3o de um conjunto de r\u00e9plicas<\/li>\n<li>Perda de conectividade com o node prim\u00e1rio (que pode ser detectada por batimentos card\u00edacos)<\/li>\n<li>Manuten\u00e7\u00e3o de um conjunto de r\u00e9plicas usando os m\u00e9todos <code>rs.reconfig<\/code> ou <code>stepDown<\/code><\/li>\n<li>Adicionando um novo node a um conjunto de r\u00e9plicas existentes<\/li>\n<\/ul>\n<p>Uma r\u00e9plica pode possuir at\u00e9 50 membros, mas s\u00f3 at\u00e9 7 podem votar em qualquer elei\u00e7\u00e3o.<\/p>\n<p>O tempo m\u00e9dio antes que um cluster eleja um novo prim\u00e1rio n\u00e3o deve ultrapassar 12 segundos. O algoritmo de elei\u00e7\u00e3o tentar\u00e1 ter o secund\u00e1rio com a maior prioridade dispon\u00edvel. Ao mesmo tempo, os membros com um valor de prioridade de 0 n\u00e3o podem se tornar prim\u00e1rios e n\u00e3o participam da elei\u00e7\u00e3o.<\/p>\n<figure id=\"attachment_148334\" aria-describedby=\"caption-attachment-148334\" style=\"width: 900px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Secondary-Node-Becomes-a-Primary-in-MongoDB-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148334 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Secondary-Node-Becomes-a-Primary-in-MongoDB-2.png\" alt=\"Node secund\u00e1rio tornando-se prim\u00e1rio\" width=\"900\" height=\"509\"><\/a><figcaption id=\"caption-attachment-148334\" class=\"wp-caption-text\">Node secund\u00e1rio tornando-se prim\u00e1rio (Fonte da imagem: <a href=\"https:\/\/medium.com\/condorlabs-engineering\/mongodb-replication-what-you-need-to-know-42a62a98b320\">Medium<\/a>)<\/figcaption><\/figure>\n<p>\u00a0<\/p>\n<h3>A preocupa\u00e7\u00e3o com a escrita (Write Concern)<\/h3>\n<p>Para garantir a durabilidade, as opera\u00e7\u00f5es de escrita possuem uma framework para copiar os dados em um n\u00famero especificado de nodes. Voc\u00ea at\u00e9 pode oferecer feedback ao cliente com isso. Essa framework \u00e9 tamb\u00e9m conhecida como &#8220;preocupa\u00e7\u00e3o com a escrita&#8221; (&#8220;write concern&#8221;). Ela possui membros que carregam dados e que precisam reconhecer uma preocupa\u00e7\u00e3o com a escrita antes que a opera\u00e7\u00e3o seja considerada bem-sucedida. Geralmente, os conjuntos de r\u00e9plicas t\u00eam um valor de 1 como preocupa\u00e7\u00e3o com a escrita. Portanto, apenas o node prim\u00e1rio deve reconhecer a escrita antes de retornar o reconhecimento da preocupa\u00e7\u00e3o com a escrita.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode aumentar o n\u00famero de membros necess\u00e1rios para reconhecer a opera\u00e7\u00e3o de escrita. N\u00e3o h\u00e1 limite para o n\u00famero de membros que voc\u00ea pode ter. No entanto, se os n\u00fameros forem altos, \u00e9 necess\u00e1rio lidar com alta lat\u00eancia. Isso ocorre porque o cliente precisa esperar pelo reconhecimento de todos os membros. Al\u00e9m disso, voc\u00ea pode definir a preocupa\u00e7\u00e3o com a escrita da &#8220;maioria&#8221;. Isso calcula mais da metade dos membros ap\u00f3s receber o reconhecimento deles.<\/p>\n<h3>Prefer\u00eancia de leitura<\/h3>\n<p>Para as opera\u00e7\u00f5es de leitura, voc\u00ea pode mencionar a prefer\u00eancia de leitura que descreve como o banco de dados direciona a consulta para os membros do conjunto de r\u00e9plicas. Geralmente, o node prim\u00e1rio recebe a opera\u00e7\u00e3o de leitura, mas o cliente pode mencionar uma prefer\u00eancia de leitura para enviar as opera\u00e7\u00f5es de leitura para nodes secund\u00e1rios. Aqui est\u00e3o as op\u00e7\u00f5es para a prefer\u00eancia de leitura:<\/p>\n<ul>\n<li><strong>primaryPreferred<\/strong>: Geralmente, as opera\u00e7\u00f5es de leitura v\u00eam do node prim\u00e1rio, mas se ele n\u00e3o estiver dispon\u00edvel, os dados s\u00e3o obtidos dos nodes secund\u00e1rios.<\/li>\n<li><strong>primary<\/strong>: Todas as opera\u00e7\u00f5es de leitura v\u00eam do node prim\u00e1rio.<\/li>\n<li><strong>secondary<\/strong>: Todas as opera\u00e7\u00f5es de leitura s\u00e3o executadas pelos nodes secund\u00e1rios.<\/li>\n<li><strong>nearest<\/strong>: Aqui, as solicita\u00e7\u00f5es de leitura s\u00e3o roteadas para o node mais pr\u00f3ximo que pode ser alcan\u00e7ado, o que pode ser detectado executando o comando de <code>ping<\/code>. O resultado das opera\u00e7\u00f5es de leitura pode vir de qualquer membro do conjunto de r\u00e9plicas, independentemente de ser o prim\u00e1rio ou o secund\u00e1rio.<\/li>\n<li><strong>secondaryPreferred<\/strong>: Aqui, a maioria das opera\u00e7\u00f5es de leitura vem dos nodes secund\u00e1rios, mas se nenhum deles estiver dispon\u00edvel, os dados s\u00e3o obtidos do node prim\u00e1rio.<\/li>\n<\/ul>\n<h3>Sincroniza\u00e7\u00e3o de dados do conjunto de replica\u00e7\u00e3o<\/h3>\n<p>Para manter c\u00f3pias atualizadas do conjunto de dados compartilhados, os membros secund\u00e1rios de um conjunto de r\u00e9plicas replicam ou sincronizam dados de outros membros.<\/p>\n<p>O MongoDB utiliza duas formas de sincroniza\u00e7\u00e3o de dados. A primeira \u00e9 a sincroniza\u00e7\u00e3o inicial (initial sync), que popula novos membros com o conjunto completo de dados. A segunda \u00e9 a replica\u00e7\u00e3o (replication), que executa altera\u00e7\u00f5es cont\u00ednuas no conjunto completo de dados para manter todos os membros atualizados.<\/p>\n<h4>Sincroniza\u00e7\u00e3o inicial<\/h4>\n<p>Durante a sincroniza\u00e7\u00e3o inicial, um node secund\u00e1rio executa o comando de sincroniza\u00e7\u00e3o inicial <code>init sync<\/code> para sincronizar todos os dados do node prim\u00e1rio para outro node secund\u00e1rio que cont\u00e9m os dados mais recentes. Portanto, o node secund\u00e1rio utiliza consistentemente a funcionalidade <code>tailable cursor<\/code> para consultar as entradas mais recentes do oplog na cole\u00e7\u00e3o local.oplog.rs do node prim\u00e1rio e aplica essas opera\u00e7\u00f5es dentro dessas entradas do oplog.<\/p>\n<p>A partir do MongoDB 5.2, sincroniza\u00e7\u00f5es iniciais podem ser baseadas em c\u00f3pia de arquivos ou l\u00f3gicas.<\/p>\n<h5>Sincroniza\u00e7\u00e3o l\u00f3gica<\/h5>\n<p>Quando voc\u00ea executa uma sincronia l\u00f3gica, o MongoDB:<\/p>\n<ol>\n<li>Desenvolve todos os \u00edndices de cole\u00e7\u00e3o \u00e0 medida que os documentos s\u00e3o copiados para cada cole\u00e7\u00e3o.<\/li>\n<li>Duplica todos os bancos de dados, exceto o banco de dados local. <code>mongod<\/code> examina cada cole\u00e7\u00e3o em todos os bancos de dados de origem e insere todos os dados em suas duplicatas dessas cole\u00e7\u00f5es.<\/li>\n<li>Executa todas as altera\u00e7\u00f5es no conjunto de dados. Ao aproveitar o oplog da fonte, o <code> mongod<\/code>\u00a0atualiza seu conjunto de dados para retratar o estado atual do conjunto de r\u00e9plicas.<\/li>\n<li>Extrai registros de oplog rec\u00e9m-adicionados durante a c\u00f3pia de dados. Certifique-se de que o membro de destino tenha espa\u00e7o em disco suficiente dentro do banco de dados local para armazenar tentativamente esses registros de oplog durante a dura\u00e7\u00e3o dessa etapa de c\u00f3pia de dados.<\/li>\n<\/ol>\n<p>Quando a sincroniza\u00e7\u00e3o inicial \u00e9 conclu\u00edda, o membro passa de <code>STARTUP2<\/code> para <code> SECONDARY <\/code>.<\/p>\n<h5>Sincroniza\u00e7\u00e3o inicial baseada em c\u00f3pia de arquivo<\/h5>\n<p>Logo de cara, voc\u00ea s\u00f3 pode executar isso se voc\u00ea usar o MongoDB Enterprise. Este processo executa a sincroniza\u00e7\u00e3o inicial duplicando e movendo os arquivos no sistema de arquivos. Este m\u00e9todo de sincroniza\u00e7\u00e3o pode ser mais r\u00e1pido que a sincroniza\u00e7\u00e3o inicial l\u00f3gica em alguns casos. Tenha em mente que a sincroniza\u00e7\u00e3o inicial baseada em c\u00f3pia de arquivo pode levar a contagens imprecisas se voc\u00ea executar o m\u00e9todo count() sem um predicado de consulta.<\/p>\n<p>Mas, este m\u00e9todo tamb\u00e9m tem sua parcela de limita\u00e7\u00f5es:<\/p>\n<ul>\n<li>Durante uma sincroniza\u00e7\u00e3o inicial baseada em c\u00f3pia de arquivo, voc\u00ea n\u00e3o pode escrever no banco de dados local do membro que est\u00e1 sendo sincronizado. Voc\u00ea tamb\u00e9m n\u00e3o pode executar um backup do membro que est\u00e1 sendo sincronizado ou do membro que est\u00e1 sendo sincronizado.<\/li>\n<li>Ao aproveitar o mecanismo de armazenamento criptografado, o MongoDB usa a chave de origem para criptografar o destino.<\/li>\n<li>Voc\u00ea s\u00f3 pode executar uma sincroniza\u00e7\u00e3o inicial de um determinado membro de cada vez.<\/li>\n<\/ul>\n<h4>Replica\u00e7\u00e3o<\/h4>\n<p>Os membros secund\u00e1rios replicam os dados consistentemente ap\u00f3s a sincroniza\u00e7\u00e3o inicial. Os membros secund\u00e1rios duplicar\u00e3o o oplog da sua sincroniza\u00e7\u00e3o a partir da fonte e executar\u00e3o estas opera\u00e7\u00f5es em um processo ass\u00edncrono.<\/p>\n<p>Os secund\u00e1rios s\u00e3o capazes de modificar automaticamente sua sincroniza\u00e7\u00e3o a partir da fonte conforme necess\u00e1rio, com base nas altera\u00e7\u00f5es no tempo de ping e estado da replica\u00e7\u00e3o dos outros membros.<\/p>\n<h5>Replica\u00e7\u00e3o em fluxo cont\u00ednuo<\/h5>\n<p>A partir do MongoDB 4.4, a sincroniza\u00e7\u00e3o a partir de fontes envia um fluxo cont\u00ednuo de entradas de oplog para seus secund\u00e1rios de sincroniza\u00e7\u00e3o. A replica\u00e7\u00e3o em fluxo cont\u00ednuo reduz o atraso de replica\u00e7\u00e3o em redes de alta carga e de alta lat\u00eancia. Ela tamb\u00e9m pode:<\/p>\n<ul>\n<li>Diminuir o risco de perder opera\u00e7\u00f5es de escrita com <code>w:1<\/code> devido ao failover prim\u00e1rio.<\/li>\n<li>Diminuir a impraticabilidade para leituras de secund\u00e1rias.<\/li>\n<li>Reduzir a lat\u00eancia nas opera\u00e7\u00f5es de escrita com <code>w:\u201cmajority\u201d<\/code> e <code>w:&gt;1<\/code>. Em resumo, qualquer preocupa\u00e7\u00e3o de escrita que precise esperar pela replica\u00e7\u00e3o.<\/li>\n<\/ul>\n<h5>Replica\u00e7\u00e3o multithreaded<\/h5>\n<p>O MongoDB costumava realizar opera\u00e7\u00f5es de escrita em lotes por meio de v\u00e1rias threads para melhorar a concorr\u00eancia. O MongoDB agrupa os lotes por ID de documento enquanto aplica cada grupo de opera\u00e7\u00f5es com uma thread diferente.<\/p>\n<p>O MongoDB sempre executa opera\u00e7\u00f5es de escrita em um determinado documento na sua ordem original de escrita. Isso mudou no MongoDB 4.0.<\/p>\n<p>A partir do MongoDB 4.0, opera\u00e7\u00f5es de leitura direcionadas a secund\u00e1rios e configuradas com um n\u00edvel de preocupa\u00e7\u00e3o de leitura de <code>\u201cmajority\u201d<\/code> ou <code>\u201clocal\u201d<\/code> agora ler\u00e3o de um snapshot WiredTiger dos dados, se a leitura ocorrer em um secund\u00e1rio onde os lotes de replica\u00e7\u00e3o est\u00e3o sendo aplicados. Ler de um snapshot garante uma visualiza\u00e7\u00e3o consistente dos dados e permite que a leitura ocorra simultaneamente com a replica\u00e7\u00e3o em andamento sem precisar de um bloqueio.<\/p>\n<p>Portanto, leituras secund\u00e1rias que necessitam desses n\u00edveis de preocupa\u00e7\u00e3o de leitura n\u00e3o precisam mais esperar que os lotes de replica\u00e7\u00e3o sejam aplicados e podem ser tratadas conforme s\u00e3o recebidas.<\/p>\n<h2>Como criar um conjunto de r\u00e9plicas MongoDB<\/h2>\n<p>Como mencionado anteriormente, o MongoDB trata a replica\u00e7\u00e3o atrav\u00e9s de r\u00e9plicas. Nas pr\u00f3ximas se\u00e7\u00f5es, vamos destacar alguns m\u00e9todos que voc\u00ea pode usar para criar r\u00e9plicas para o seu caso de uso.<\/p>\n<h3>M\u00e9todo 1: Criando um novo conjunto de r\u00e9plicas MongoDB no Ubuntu<\/h3>\n<p>Antes de come\u00e7armos, voc\u00ea precisar\u00e1 garantir que voc\u00ea tem pelo menos tr\u00eas servidores rodando no Ubuntu 20.04, com o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mongodb\/\">MongoDB<\/a> instalado em cada servidor.<\/p>\n<p>Para montar um conjunto de r\u00e9plicas, \u00e9 essencial fornecer um endere\u00e7o onde cada membro do conjunto de r\u00e9plicas possa ser alcan\u00e7ado por outros no conjunto. Neste caso, mantemos tr\u00eas membros no conjunto. Embora possamos usar <a href=\"https:\/\/kinsta.com\/pt\/blog\/ip-estaticos-e-dinamicos\/\">endere\u00e7os IP<\/a>, isso n\u00e3o \u00e9 recomendado, pois os endere\u00e7os podem mudar inesperadamente. Uma alternativa melhor pode ser usar os nomes de hosts DNS l\u00f3gicos ao configurar os conjuntos de r\u00e9plicas.<\/p>\n<p>Podemos fazer isso configurando o subdom\u00ednio para cada membro replicado. Embora isso possa ser ideal para um ambiente de produ\u00e7\u00e3o, esta se\u00e7\u00e3o ir\u00e1 delinear como configurar a resolu\u00e7\u00e3o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-dns\/\">DNS<\/a> editando os arquivos dos respectivos hosts de cada servidor. Este arquivo nos permite atribuir hostname leg\u00edveis a endere\u00e7os IP num\u00e9ricos. Assim, se em algum evento o seu endere\u00e7o IP mudar, tudo que voc\u00ea precisa fazer \u00e9 atualizar os arquivos de hosts nos tr\u00eas servidores, em vez de reconfigurar o conjunto de r\u00e9plicas do zero!<\/p>\n<p>Na maioria das vezes, <code>hosts<\/code> \u00e9 armazenado no diret\u00f3rio <code>\/etc\/<\/code>. Repita os comandos abaixo para cada um de seus tr\u00eas servidores:<\/p>\n<pre><code class=\"language-markdown\">sudo nano \/etc\/hosts<\/code><\/pre>\n<p>No comando acima, estamos usando o nano como nosso editor de texto, no entanto, voc\u00ea pode usar qualquer editor de texto que preferir. Ap\u00f3s as primeiras linhas que configuram o localhost, adicione uma entrada para cada membro do conjunto de r\u00e9plicas. Essas entradas t\u00eam a forma de um endere\u00e7o IP seguido pelo nome leg\u00edvel da sua escolha. Embora voc\u00ea possa nome\u00e1-los como preferir, certifique-se de ser descritivo para poder diferenciar entre cada membro. Para este tutorial, usaremos os seguintes hostname:<\/p>\n<ul>\n<li>mongo0.replset.membro<\/li>\n<li>mongo1.replset.membro<\/li>\n<li>mongo2.replset.membro<\/li>\n<\/ul>\n<p>Usando esses hostnames, seus arquivos \/etc\/hosts ficariam semelhantes \u00e0s linhas destacadas a seguir:<\/p>\n<figure id=\"attachment_148336\" aria-describedby=\"caption-attachment-148336\" style=\"width: 1222px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Hostnames-Illustration.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148336 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Hostnames-Illustration.png\" alt=\"Ilustra\u00e7\u00e3o dos Hostnames.\" width=\"1222\" height=\"339\"><\/a><figcaption id=\"caption-attachment-148336\" class=\"wp-caption-text\">Ilustra\u00e7\u00e3o dos Hostnames.<\/figcaption><\/figure>\n<p>Salve e feche o arquivo.<\/p>\n<p>Ap\u00f3s configurar a resolu\u00e7\u00e3o DNS para o conjunto de r\u00e9plicas, precisamos atualizar as regras do firewall para permitir que eles se comuniquem uns com os outros. Execute o seguinte comando <code>ufw<\/code> no mongo0 para fornecer acesso mongo1 \u00e0 porta 27017 no mongo0:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo1_server_ip to any port 27017<\/code><\/pre>\n<p>No lugar do par\u00e2metro <code>mongo1_server_ip<\/code>, digite o endere\u00e7o IP real do seu servidor mongo1. Al\u00e9m disso, se voc\u00ea atualizou a inst\u00e2ncia do MongoDB neste servidor para usar uma porta diferente do padr\u00e3o, certifique-se de alterar o n\u00famero 27017 para refletir a porta que sua inst\u00e2ncia do MongoDB est\u00e1 usando.<\/p>\n<p>Agora, adicione outra regra de firewall para dar ao mongo2 acesso \u00e0 mesma porta:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo2_server_ip to any port 27017<\/code><\/pre>\n<p>No lugar do par\u00e2metro <code>mongo2_server_ip<\/code>, digite o endere\u00e7o IP real do seu servidor mongo2. Depois, atualize as regras de firewall para os seus outros dois servidores. Execute os seguintes comandos no servidor mongo1, certificando-se de alterar os endere\u00e7os IP no lugar do par\u00e2metro server_ip para refletir os do mongo0 e mongo2, respectivamente:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo0_server_ip to any port 27017<\/code><\/pre>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo2_server_ip to any port 27017<\/code><\/pre>\n<p>Finalmente, execute estes dois comandos em mongo2. Mais uma vez, certifique-se de digitar os endere\u00e7os IP corretos para cada servidor:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo0_server_ip to any port 27017<\/code><\/pre>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo1_server_ip to any port 27017<\/code><\/pre>\n<p>Seu pr\u00f3ximo passo \u00e9 atualizar o arquivo de configura\u00e7\u00e3o de cada inst\u00e2ncia MongoDB para permitir conex\u00f5es externas. Para permitir isso, voc\u00ea precisa modificar o arquivo de configura\u00e7\u00e3o em cada servidor para refletir o endere\u00e7o IP e indicar o conjunto de r\u00e9plicas. Enquanto voc\u00ea pode usar qualquer editor de texto preferido, estamos usando o editor de texto nano mais uma vez. Vamos fazer as seguintes modifica\u00e7\u00f5es em cada arquivo mongod.conf.<\/p>\n<p><strong>Em mongo0:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo0.replset.member# replica set\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<p><strong>Em mongo1:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo1.replset.member\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<p><strong>Em mongo2:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo2.replset.member\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Caso queira mudar o valor da diretiva de rs0, certifique-se de substituir o mesmo nos comandos acima. Voc\u00ea pode nomear a diretiva como voc\u00ea quiser, entretanto, certifique-se de que ela seja descritiva o suficiente. Ap\u00f3s as atualiza\u00e7\u00f5es serem completadas, reinicie o servi\u00e7o mongod em cada inst\u00e2ncia para recarregar as configura\u00e7\u00f5es.<\/p>\n<\/aside>\n\n<pre><code class=\"language-markdown\">sudo systemctl restart mongod<\/code><\/pre>\n<p>Com isso, voc\u00ea habilitou a replica\u00e7\u00e3o para cada inst\u00e2ncia MongoDB do servidor.<\/p>\n<p>Agora voc\u00ea pode inicializar a r\u00e9plica definida usando o m\u00e9todo <code>rs.initiate()<\/code>. Este m\u00e9todo s\u00f3 \u00e9 necess\u00e1rio para ser executado em uma \u00fanica inst\u00e2ncia MongoDB no conjunto de r\u00e9plicas. Certifique-se de que o nome do conjunto de r\u00e9plicas e o membro correspondem \u00e0s configura\u00e7\u00f5es que voc\u00ea fez em cada arquivo de configura\u00e7\u00e3o anteriormente.<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(\n  {\n    _id: \"rs0\",\n    members: [\n      { _id: 0, host: \"mongo0.replset.member\" },\n      { _id: 1, host: \"mongo1.replset.member\" },\n      { _id: 2, host: \"mongo2.replset.member\" }\n    ]\n  }\n)<\/code><\/pre>\n<p>Caso o m\u00e9todo retorne &#8220;ok&#8221;: 1 na sa\u00edda, significa que o conjunto de r\u00e9plicas foi iniciado corretamente. Abaixo est\u00e1 um exemplo de como a sa\u00edda deve ser:<\/p>\n<pre><code class=\"language-markdown\"> \"ok\": 1,\n  \"$clusterTime\": {\n    \"clusterTime\": Timestamp(1612389071, 1),\n    \"signature\": {\n      \"hash\": BinData(0, \"AAAAAAAAAAAAAAAAAAAAAAAAAAA=\"),\n      \"keyId\": NumberLong(0)\n    }\n  },\n  \"operationTime\": Timestamp(1612389071, 1)\n}<\/code><\/pre>\n<h4>Desativando o servidor MongoDB<\/h4>\n<p>Voc\u00ea pode desativar um servidor MongoDB usando o m\u00e9todo <code>db.shutdownServer()<\/code>. Abaixo est\u00e1 a sintaxe para o mesmo. Ambos <code>force<\/code> e <code>timeoutsecs<\/code> s\u00e3o <a href=\"https:\/\/www.mongodb.com\/docs\/v5.0\/reference\/method\/db.shutdownServer\/#mongodb-method-db.shutdownServer\" target=\"_blank\" rel=\"noopener noreferrer\">par\u00e2metros opcionais<\/a>.<\/p>\n<pre><code class=\"language-markdown\">db.shutdownServer({\n  force: &lt;boolean&gt;,\n  timeoutSecs: &lt;int&gt;\n})<\/code><\/pre>\n<p>Este m\u00e9todo pode falhar se o membro do conjunto de r\u00e9plicas mongod executar certas opera\u00e7\u00f5es \u00e0 medida que o \u00edndice \u00e9 constru\u00eddo. Para interromper as opera\u00e7\u00f5es e for\u00e7ar o membro a desativar, voc\u00ea pode inserir o par\u00e2metro booleano <code> force<\/code> para true.<\/p>\n<h4>Reinicie o MongoDB com &#8211;replSet<\/h4>\n<p>Para redefinir a configura\u00e7\u00e3o, certifique-se de que cada node no seu conjunto de r\u00e9plicas esteja parado. Em seguida, exclua o banco de dados local para cada node. Inicie novamente usando a op\u00e7\u00e3o <code>\u2013replSet<\/code>e execute o comando <code>rs.initiate()<\/code> apenas em uma inst\u00e2ncia mongod do conjunto de r\u00e9plicas.<\/p>\n<pre><code class=\"language-markdown\">mongod --replSet \"rs0\"<\/code><\/pre>\n<p><code>rs.initiate()<\/code> pode pegar uma r\u00e9plica opcional do documento de configura\u00e7\u00e3o do conjunto, ou seja:<\/p>\n<ul>\n<li>A op\u00e7\u00e3o <code>Replication.replSetName<\/code> ou a op\u00e7\u00e3o <code>\u2014replSet<\/code> para especificar o nome do conjunto de r\u00e9plicas no campo <code>_id<\/code>.<\/li>\n<li>A array dos membros, que cont\u00e9m um documento para cada membro do conjunto de r\u00e9plicas.<\/li>\n<\/ul>\n<p>O m\u00e9todo <code>rs.initiate()<\/code> desencadeia uma elei\u00e7\u00e3o e elege um dos membros para ser o prim\u00e1rio.<\/p>\n<h4>Adicionando membros ao conjunto de r\u00e9plicas<\/h4>\n<p>Para adicionar membros ao conjunto, inicie inst\u00e2ncias mongod em v\u00e1rias m\u00e1quinas. Em seguida, inicie um cliente mongo e use o comando <code>rs.add()<\/code>.<\/p>\n<p>O comando <code>rs.add()<\/code> tem a seguinte sintaxe b\u00e1sica:<\/p>\n<pre><code class=\"language-markdown\">rs.add(HOST_NAME:PORT)<\/code><\/pre>\n<p>Por exemplo,<\/p>\n<p>Assuma que mongo1 \u00e9 sua inst\u00e2ncia mongod, e que est\u00e1 ouvindo na porta 27017. Use o comando do cliente Mongo <code>rs.add()<\/code> para adicionar esta inst\u00e2ncia ao conjunto de r\u00e9plicas.<\/p>\n<pre><code class=\"language-markdown\">rs.add(\"mongo1:27017\")<\/code><\/pre>\n<p>Somente depois que voc\u00ea estiver conectado ao node prim\u00e1rio voc\u00ea pode adicionar uma inst\u00e2ncia mongod ao conjunto de r\u00e9plicas. Para verificar se voc\u00ea est\u00e1 conectado ao node prim\u00e1rio, use o comando <code>db.isMaster()<\/code>.<\/p>\n<h4>Removendo membros<\/h4>\n<p>Para remover um membro, podemos usar <code>rs.remove()<\/code>.<\/p>\n<p>Para fazer isso, primeiro, encerre a inst\u00e2ncia mongod que voc\u00ea deseja remover, usando o m\u00e9todo <code>db.shutdownServer()<\/code> que discutimos acima.<\/p>\n<p>Em seguida, conecte-se ao prim\u00e1rio atual do conjunto de r\u00e9plicas. Para determinar o prim\u00e1rio atual, use <code>db.hello()<\/code> enquanto estiver conectado a qualquer membro do conjunto de r\u00e9plicas. Depois de determinar o prim\u00e1rio, execute um dos seguintes comandos:<\/p>\n<pre><code class=\"language-markdown\">rs.remove(\"mongodb-node-04:27017\")\nrs.remove(\"mongodb-node-04\")<\/code><\/pre>\n<figure id=\"attachment_148339\" aria-describedby=\"caption-attachment-148339\" style=\"width: 900px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Code-Snippet-for-Node-Removal-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148339 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Code-Snippet-for-Node-Removal-1.png\" alt=\"A imagem acima mostra que o node foi removido com sucesso do conjunto de r\u00e9plicas.\" width=\"900\" height=\"267\"><\/a><figcaption id=\"caption-attachment-148339\" class=\"wp-caption-text\">A imagem acima mostra que o node foi removido com sucesso do conjunto de r\u00e9plicas. (Fonte da imagem: <a href=\"https:\/\/www.bmc.com\/blogs\/mongodb-replication\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bmc<\/a>)<\/figcaption><\/figure>\n<p>Se o conjunto de r\u00e9plicas precisar eleger um novo node prim\u00e1rio, o MongoDB poder\u00e1 desconectar brevemente o shell. Nesse cen\u00e1rio, ele se reconectar\u00e1 automaticamente novamente. Al\u00e9m disso, pode ser exibido um erro <code>DBClientCursor::init call()<\/code>, mesmo que o comando tenha sucesso.<\/p>\n<h3>M\u00e9todo 2: Configura\u00e7\u00e3o de um conjunto de r\u00e9plicas MongoDB para implanta\u00e7\u00e3o e teste<\/h3>\n<p>Em geral, voc\u00ea pode configurar conjuntos de r\u00e9plicas para testes com o RBAC ativado ou desativado. Neste m\u00e9todo, estaremos configurando conjuntos de r\u00e9plicas com o controle de acesso desabilitado para <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-um-desenvolvedor-full-stack\/\">implement\u00e1-lo<\/a> em um ambiente de teste.<\/p>\n<p>Primeiro, crie diret\u00f3rios para todas as inst\u00e2ncias que fazem parte do conjunto de r\u00e9plicas usando o seguinte comando:<\/p>\n<pre><code class=\"language-markdown\">mkdir -p \/srv\/mongodb\/replicaset0-0  \/srv\/mongodb\/replicaset0-1 \/srv\/mongodb\/replicaset0-2<\/code><\/pre>\n<p>Este comando ir\u00e1 criar diret\u00f3rios para tr\u00eas inst\u00e2ncias MongoDB replicaset0-0, replicaset0-1, e replicaset0-2. Agora, inicie as inst\u00e2ncias do MongoDB para cada uma delas usando o seguinte conjunto de comandos:<\/p>\n<p><strong>Para o Servidor 1:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27017 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p><strong>Para o Servidor 2:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27018 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p><strong>Para o Servidor 3:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27019 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p>O par\u00e2metro <code>\u2013oplogSize<\/code> \u00e9 usado para evitar que a m\u00e1quina fique sobrecarregada durante a fase de teste. Ele ajuda a reduzir a quantidade de espa\u00e7o em disco que cada disco consome.<\/p>\n<p>Agora, conecte-se a uma das inst\u00e2ncias usando o shell do Mongo, conectando-se pelo n\u00famero da porta abaixo.<\/p>\n<pre><code class=\"language-markdown\">mongo --port 27017<\/code><\/pre>\n<p>Podemos usar o comando <code>rs.initiate()<\/code> para iniciar o processo de replica\u00e7\u00e3o. Voc\u00ea ter\u00e1 que substituir o par\u00e2metro <code>hostname<\/code> pelo nome do seu sistema.<\/p>\n<pre><code class=\"language-markdown\">rs conf = {\n\n  _id: \"replicaset0\",\n\n  members: [\n\n    {  _id: 0,  host: \"&lt;hostname&gt;:27017},\n\n    {  _id: 1,  host: \"&lt;hostname&gt;:27018\"},\n\n    {  _id: 2,  host: \"&lt;hostname&gt;:27019\"}\n\n   ] }<\/code><\/pre>\n<p>Agora voc\u00ea pode passar o arquivo objeto de configura\u00e7\u00e3o como par\u00e2metro para o comando start e us\u00e1-lo da seguinte forma:<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(rsconf)<\/code><\/pre>\n<p>E pronto! Voc\u00ea criou com sucesso uma r\u00e9plica do MongoDB para fins de <a href=\"https:\/\/kinsta.com\/pt\/blog\/desenvolvedor-backend\/\">desenvolvimento<\/a> e testes.<\/p>\n<h3>M\u00e9todo 3: Transformando uma inst\u00e2ncia aut\u00f4noma em um conjunto de r\u00e9plicas MongoDB<\/h3>\n<p>MongoDB permite que seus usu\u00e1rios transformem suas inst\u00e2ncias isoladas em conjuntos de r\u00e9plicas. Enquanto as inst\u00e2ncias aut\u00f4nomas s\u00e3o usadas principalmente para a fase de teste e desenvolvimento, os conjuntos de r\u00e9plicas s\u00e3o parte do ambiente de produ\u00e7\u00e3o.<\/p>\n<p>Para come\u00e7ar, vamos encerrar \u00e0 nossa inst\u00e2ncia mongod usando o seguinte comando:<\/p>\n<pre><code class=\"language-markdown\">db.adminCommand({\"shutdown\":\"1\"})<\/code><\/pre>\n<p>Reinicie sua inst\u00e2ncia usando o par\u00e2metro <code>\u2013repelSet<\/code> em seu comando para especificar o conjunto de r\u00e9plicas que voc\u00ea vai usar:<\/p>\n<pre><code class=\"language-markdown\">mongod --port 27017 \u2013 dbpath \/var\/lib\/mongodb  --replSet replicaSet1 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Voc\u00ea deve especificar o nome do seu servidor com o endere\u00e7o \u00fanico no comando.<\/p>\n<p>Conecte a shell com sua inst\u00e2ncia MongoDB e use o comando initiate para iniciar o processo de replica\u00e7\u00e3o e converter com sucesso a inst\u00e2ncia para um conjunto de r\u00e9plicas. Voc\u00ea pode executar todas as opera\u00e7\u00f5es b\u00e1sicas como adicionar ou remover uma inst\u00e2ncia usando os seguintes comandos:<\/p>\n<pre><code class=\"language-markdown\">rs.add(\u201c&lt;host_name:port&gt;\u201d)<\/code><\/pre>\n<pre><code class=\"language-markdown\">rs.remove(\u201chost-name\u201d)<\/code><\/pre>\n<p>Adicionalmente, voc\u00ea pode verificar o status do seu conjunto de r\u00e9plicas MongoDB usando os comandos <code>rs.status()<\/code> e <code>rs.conf()<\/code>.<\/p>\n<h3>M\u00e9todo 4: Atlas MongoDB &#8211; uma alternativa mais simples<\/h3>\n<p>A replica\u00e7\u00e3o e o <a href=\"https:\/\/kinsta.com\/pt\/blog\/mongodb-sharding\/\">sharding<\/a> podem trabalhar juntos para formar algo chamado um cluster particionado (sharded cluster). Embora a configura\u00e7\u00e3o e a instala\u00e7\u00e3o possam ser bastante demoradas, embora diretas, o MongoDB Atlas \u00e9 uma alternativa melhor do que os m\u00e9todos mencionados anteriormente.<\/p>\n<p>Ele automatiza seus conjuntos de r\u00e9plicas, tornando o processo f\u00e1cil de implementar. Ele pode implementar conjuntos de r\u00e9plicas globalmente fragmentadas com poucos cliques, permitindo a recupera\u00e7\u00e3o de desastres, <a href=\"https:\/\/kinsta.com\/pt\/blog\/adminer\/\">gerenciamento<\/a> mais f\u00e1cil, localiza\u00e7\u00e3o de dados e implementa\u00e7\u00f5es em v\u00e1rias regi\u00f5es.<\/p>\n<p>No Atlas MongoDB, precisamos criar clusters &#8211; eles podem ser um conjunto de r\u00e9plicas, ou um sharded cluster. Para um determinado projeto, o n\u00famero de nodes em um cluster em outras regi\u00f5es \u00e9 limitado a um total de 40.<\/p>\n<p>Isso exclui os clusters gratuitos ou compartilhados e as regi\u00f5es do Google Cloud que se comunicam entre si. O n\u00famero total de nodes entre quaisquer duas regi\u00f5es deve atender a essa restri\u00e7\u00e3o. Por exemplo, se houver um projeto no qual:<\/p>\n<ul>\n<li>A Regi\u00e3o A tem 15 nodes<\/li>\n<li>A Regi\u00e3o B tem 25 nodes<\/li>\n<li>A Regi\u00e3o C tem 10 nodes<\/li>\n<\/ul>\n<p>S\u00f3 podemos alocar mais 5 nodes para a regi\u00e3o C como,<\/p>\n<ol>\n<li>Regi\u00e3o A+ Regi\u00e3o B = 40; atende a restri\u00e7\u00e3o de 40 sendo o n\u00famero m\u00e1ximo de nodes permitido.<\/li>\n<li>Regi\u00e3o B+ Regi\u00e3o C = 25+10+5 (Nodes adicionais alocados para C) = 40; atende \u00e0 restri\u00e7\u00e3o de 40 sendo o n\u00famero m\u00e1ximo de nodes permitido.<\/li>\n<li>Regi\u00e3o A+ Regi\u00e3o C = 15+10+5 (Nodes adicionais atribu\u00eddos a C) = 30; atende \u00e0 restri\u00e7\u00e3o de 40 sendo o n\u00famero m\u00e1ximo de nodes permitido.<\/li>\n<\/ol>\n<p>Se alocamos mais 10 nodes para a regi\u00e3o C, fazendo com que a regi\u00e3o C tenha 20 nodes, ent\u00e3o a Regi\u00e3o B + Regi\u00e3o C = 45 nodes. Isso excederia a restri\u00e7\u00e3o dada, ent\u00e3o voc\u00ea pode n\u00e3o ser capaz de criar um cluster multi-regi\u00e3o.<\/p>\n<p>Quando voc\u00ea cria um cluster, a Atlas cria um cont\u00eainer de rede no projeto para o provedor da nuvem se ele n\u00e3o estivesse l\u00e1 anteriormente. Para criar um cluster de r\u00e9plicas no MongoDB Atlas, execute o seguinte comando no Atlas CLI:<\/p>\n<pre><code class=\"language-markdown\">atlas clusters create [name] [options]<\/code><\/pre>\n<p>Certifique-se de dar um nome descritivo de cluster, pois ele n\u00e3o pode ser alterado ap\u00f3s a cria\u00e7\u00e3o do cluster. O argumento pode conter letras ASCII, n\u00fameros e hifens.<\/p>\n<p>Existem\u00a0<a href=\"https:\/\/www.mongodb.com\/docs\/atlas\/cli\/stable\/command\/atlas-clusters-create\/\" target=\"_blank\" rel=\"noopener noreferrer\">v\u00e1rias<\/a> op\u00e7\u00f5es dispon\u00edveis para cria\u00e7\u00e3o de clusters no MongoDB com base em suas necessidades. Por exemplo, se voc\u00ea quiser um backup em nuvem cont\u00ednuo para o seu cluster, configure <code>--backup<\/code> para true.<\/p>\n<h2>Lidando com atrasos na replica\u00e7\u00e3o<\/h2>\n<p>O atraso na replica\u00e7\u00e3o pode ser bastante perturbador. \u00c9 um atraso entre uma opera\u00e7\u00e3o no prim\u00e1rio e o aplicativo dessa opera\u00e7\u00e3o a partir do oplog no secund\u00e1rio. Se o seu neg\u00f3cio lida com grandes conjuntos de dados, \u00e9 esperado um atraso dentro de um certo limite. No entanto, \u00e0s vezes fatores externos tamb\u00e9m podem contribuir e aumentar o atraso. Para se beneficiar de uma replica\u00e7\u00e3o atualizada, certifique-se de que:<\/p>\n<ol>\n<li>Voc\u00ea direcione o tr\u00e1fego da sua rede com uma largura de banda est\u00e1vel e suficiente. A lat\u00eancia da rede desempenha um papel enorme em afetar sua replica\u00e7\u00e3o, e se a rede for insuficiente para atender \u00e0s necessidades do processo de replica\u00e7\u00e3o, haver\u00e1 atrasos na replica\u00e7\u00e3o de dados em todo o conjunto de r\u00e9plicas.<\/li>\n<li>Voc\u00ea tenha um throughput de disco suficiente. Se o sistema de arquivos e o dispositivo de disco no secund\u00e1rio n\u00e3o conseguirem descarregar os dados para o disco t\u00e3o rapidamente quanto o prim\u00e1rio, ent\u00e3o o secund\u00e1rio ter\u00e1 dificuldade em acompanhar. Assim, os nodes secund\u00e1rios processam as consultas de escrita mais lentamente do que o node prim\u00e1rio. Este \u00e9 um problema comum na maioria dos sistemas multi-inquilino, incluindo inst\u00e2ncias virtualizadas e implanta\u00e7\u00f5es em larga escala.<\/li>\n<li>Voc\u00ea solicite um reconhecimento de escrita com write concern ap\u00f3s um intervalo para dar a oportunidade aos secund\u00e1rios de acompanhar o prim\u00e1rio, especialmente quando voc\u00ea quer realizar uma opera\u00e7\u00e3o de carga em massa ou ingest\u00e3o de dados que requer um grande n\u00famero de escritas no prim\u00e1rio. Os secund\u00e1rios n\u00e3o ser\u00e3o capazes de ler o oplog r\u00e1pido o suficiente para acompanhar as mudan\u00e7as; particularmente com write concern n\u00e3o reconhecidos.<\/li>\n<li>Voc\u00ea identifique as tarefas em segundo plano em execu\u00e7\u00e3o. Certas tarefas, como jobs cron, atualiza\u00e7\u00f5es de servidor e verifica\u00e7\u00f5es de seguran\u00e7a, podem ter efeitos inesperados no uso da rede ou do disco, causando atrasos no processo de replica\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>Se voc\u00ea n\u00e3o tem certeza se h\u00e1 um atraso de replica\u00e7\u00e3o em seu aplicativo, n\u00e3o se preocupe \u2013 a pr\u00f3xima se\u00e7\u00e3o discutir\u00e1 estrat\u00e9gias de resolu\u00e7\u00e3o de problemas!<\/p>\n<p>\u00a0<\/p>\n<h2>Solucionando problemas em conjuntos de r\u00e9plicas MongoDB<\/h2>\n<p>Voc\u00ea configurou com sucesso seus conjuntos de r\u00e9plicas, mas voc\u00ea nota que seus dados s\u00e3o inconsistentes entre os servidores. Isso \u00e9 muito alarmante para grandes empresas, no entanto, com m\u00e9todos r\u00e1pidos de <a href=\"https:\/\/kinsta.com\/pt\/blog\/solucionar-reparar-problemas-banco-dados\/\">solu\u00e7\u00e3o de problemas,<\/a> voc\u00ea pode encontrar a causa ou mesmo corrigir o problema! Abaixo est\u00e3o algumas estrat\u00e9gias comuns para a solu\u00e7\u00e3o de problemas de implanta\u00e7\u00e3o de r\u00e9plicas que podem ser \u00fateis:<\/p>\n<h3>Verifique o status das r\u00e9plicas<\/h3>\n<p>Podemos verificar o status atual do conjunto de r\u00e9plicas e o status de cada membro executando o seguinte comando em uma sess\u00e3o mongosh que est\u00e1 conectada ao conjunto de r\u00e9plicas prim\u00e1rias.<\/p>\n<pre><code class=\"language-markdown\"> rs.status()<\/code><\/pre>\n<h3>Confira o atraso de replica\u00e7\u00e3o<\/h3>\n<p>Como discutido anteriormente, o atraso na replica\u00e7\u00e3o pode ser um problema s\u00e9rio, pois torna os membros &#8220;atrasados&#8221; ineleg\u00edveis para se tornarem rapidamente prim\u00e1rios e aumenta a possibilidade de que as opera\u00e7\u00f5es de leitura distribu\u00eddas sejam inconsistentes. Podemos verificar o comprimento atual do atraso de replica\u00e7\u00e3o usando o seguinte comando:<\/p>\n<pre><code class=\"language-markdown\">rs.printSecondaryReplicationInfo()<\/code><\/pre>\n<p>Isso retorna o valor <code>syncedTo<\/code> que \u00e9 o tempo em que a \u00faltima entrada oplog foi escrita para o secund\u00e1rio para cada membro. Aqui est\u00e1 um exemplo para demonstrar o mesmo:<\/p>\n<pre><code class=\"language-markdown\">source: m1.example.net:27017\n    syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT)\n    0 secs (0 hrs) behind the primary\nsource: m2.example.net:27017\n    syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT)\n    0 secs (0 hrs) behind the primary<\/code><\/pre>\n<div class=\"group w-full text-token-text-primary border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"flex p-4 gap-4 text-base md:gap-6 md:max-w-2xl lg:max-w-[38rem] xl:max-w-3xl md:py-6 lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\">\n<div class=\"flex gap-1\">\n<p>Um membro atrasado pode aparecer como 0 segundos atr\u00e1s do prim\u00e1rio quando o per\u00edodo de inatividade no prim\u00e1rio \u00e9 maior que o valor <code>members[n].secondaryDelaySecs<\/code>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>Testando conex\u00f5es entre todos os membros<\/h3>\n<p>Cada membro de um conjunto de r\u00e9plicas deve ser capaz de se conectar com todos os outros membros. Certifique-se sempre de verificar as conex\u00f5es em ambas as dire\u00e7\u00f5es. Na maioria das vezes, configura\u00e7\u00f5es de firewall ou topologias de rede impedem a conectividade normal e necess\u00e1ria que pode bloquear a replica\u00e7\u00e3o.<\/p>\n<p>Por exemplo, vamos supor que a inst\u00e2ncia mongod vincula tanto ao localhost quanto ao hostname &#8216;ExampleHostname&#8217; que est\u00e1 associado ao endere\u00e7o IP 198.41.110.1:<\/p>\n<pre><code class=\"language-markdown\">mongod --bind_ip localhost, ExampleHostname<\/code><\/pre>\n<p>Para conectar-se a esta inst\u00e2ncia, os clientes remotos devem especificar o nome da m\u00e1quina ou o endere\u00e7o IP:<\/p>\n<pre><code class=\"language-markdown\">mongosh --host ExampleHostname\nmongosh --host 198.41.110.1<\/code><\/pre>\n<p>Caso um conjunto de r\u00e9plicas consista em tr\u00eas membros, m1, m2 e m3, usando a porta padr\u00e3o 27017, voc\u00ea deve testar a conex\u00e3o da seguinte forma:<\/p>\n<p><strong>No m1:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m2 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>Em m2:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>Em m3:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m2 --port 27017<\/code><\/pre>\n<p>Caso qualquer conex\u00e3o em qualquer dire\u00e7\u00e3o falhar, voc\u00ea ter\u00e1 que verificar a configura\u00e7\u00e3o do seu <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-um-firewall\/\">firewall<\/a> e reconfigur\u00e1-lo para permitir as conex\u00f5es.<\/p>\n<h2>Garantindo comunica\u00e7\u00f5es seguras com autentica\u00e7\u00e3o keyfile<\/h2>\n<p>Por padr\u00e3o, a autentica\u00e7\u00e3o por keyfile no MongoDB utiliza o mecanismo de autentica\u00e7\u00e3o SCRAM (Salted Challenge Response Authentication Mechanism). Para fazer isso, o MongoDB deve ler e validar as credenciais fornecidas pelo usu\u00e1rio, que incluem uma combina\u00e7\u00e3o de nome de usu\u00e1rio, senha e banco de dados de autentica\u00e7\u00e3o que a inst\u00e2ncia espec\u00edfica do MongoDB est\u00e1 ciente. Esse \u00e9 exatamente o mecanismo utilizado para autenticar os usu\u00e1rios que fornecem uma senha ao se conectar ao banco de dados.<\/p>\n<p>Quando voc\u00ea habilita a autentica\u00e7\u00e3o no MongoDB, o Role-Based Access Control (RBAC) \u00e9 automaticamente habilitado para o conjunto de r\u00e9plicas, e o usu\u00e1rio recebe uma ou mais fun\u00e7\u00f5es que determinam seu acesso aos recursos do banco de dados. Quando o RBAC \u00e9 habilitado, isso significa que somente o usu\u00e1rio v\u00e1lido do Mongo autenticado com os privil\u00e9gios apropriados seria capaz de acessar os recursos no sistema.<\/p>\n<p>O keyfile age como uma senha compartilhada para cada membro do cluster. Isso permite que cada inst\u00e2ncia mongod no conjunto de r\u00e9plicas utilize o conte\u00fado do arquivo de chaves como senha compartilhada para autenticar outros membros na distribui\u00e7\u00e3o.<\/p>\n<p>Somente as inst\u00e2ncias do &#8220;mongod&#8221; com o keyfile correto podem ingressar no conjunto de r\u00e9plicas. O tamanho de uma chave deve estar entre 6 e 1024 caracteres e s\u00f3 pode conter caracteres no conjunto de caracteres base64. Por favor, observe que o MongoDB remove os caracteres de espa\u00e7o em branco ao ler as chaves.<\/p>\n<p>Voc\u00ea pode <strong>gerar um keyfile<\/strong> usando v\u00e1rios m\u00e9todos. Neste tutorial, usamos <code>openssl<\/code>\u00a0para gerar uma cadeia complexa de caracteres aleat\u00f3rios 1024 para usar como uma senha compartilhada. Ele ent\u00e3o usa <code>chmod<\/code> para mudar as permiss\u00f5es dos arquivos para fornecer permiss\u00f5es de leitura somente para o propriet\u00e1rio do arquivo. Evite armazenar o arquivo chave em m\u00eddias de armazenamento que podem ser facilmente desconectadas do hardware que hospeda as inst\u00e2ncias mongod, como um drive USB ou um dispositivo de armazenamento conectado \u00e0 rede. Abaixo est\u00e1 o comando para gerar um arquivo de chave:<\/p>\n<pre><code class=\"language-markdown\">openssl rand -base64 756 &gt; &lt;path-to-keyfile&gt;\nchmod 400 &lt;path-to-keyfile&gt;<\/code><\/pre>\n<p>Em seguida,<strong> copie o arquivo de chave (keyfile) para cada membro do conjunto de r\u00e9plicas<\/strong>. Certifique-se de que o usu\u00e1rio que executa as inst\u00e2ncias do &#8220;mongod&#8221; \u00e9 o propriet\u00e1rio do arquivo e tem acesso ao keyfile. Ap\u00f3s ter feito isso, desative <strong>todos os membros do conjunto de r\u00e9plicas<\/strong>, come\u00e7ando pelos secund\u00e1rios. Depois que todos os secund\u00e1rios estiverem off-line, voc\u00ea pode prosseguir e desativar o prim\u00e1rio. \u00c9 essencial seguir essa ordem para evitar poss\u00edveis revers\u00f5es (rollbacks). Agora, desative a inst\u00e2ncia do &#8220;mongod&#8221; executando o seguinte comando:<\/p>\n<pre><code class=\"language-markdown\">use admin\ndb.shutdownServer()<\/code><\/pre>\n<p>Ap\u00f3s o comando ser executado, todos os membros do conjunto de r\u00e9plicas estar\u00e3o off-line. Agora,<strong> reinicie cada membro do conjunto de r\u00e9plicas com o controle de acesso habilitado<\/strong>.<\/p>\n<p>Para cada membro do conjunto de r\u00e9plicas, inicie a inst\u00e2ncia mongod com a configura\u00e7\u00e3o do arquivo de configura\u00e7\u00e3o <code>security.keyFile<\/code> ou com a op\u00e7\u00e3o de linha de comando <code>--keyFile<\/code>.<\/p>\n<p>Caso estiver usando um arquivo de configura\u00e7\u00e3o, defina<\/p>\n<ul>\n<li>security.keyFile para o caminho do keyfile, e<\/li>\n<li>replication.replSetName ao nome da r\u00e9plica do conjunto.<\/li>\n<\/ul>\n<pre><code class=\"language-markdown\">security:\n  keyFile: &lt;path-to-keyfile&gt;\nreplication:\n  replSetName: &lt;replicaSetName&gt;\nnet:\n   bindIp: localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Inicie a inst\u00e2ncia mongod usando o arquivo de configura\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-markdown\">mongod --config &lt;path-to-config-file&gt;<\/code><\/pre>\n<p>Caso voc\u00ea esteja usando as op\u00e7\u00f5es de linha de comando, inicie a inst\u00e2ncia mongod com as seguintes op\u00e7\u00f5es:<\/p>\n<ul>\n<li>&#8211;keyFile definido para o caminho do arquivo-chave, e<\/li>\n<li>&#8211;replSet ajustado ao nome da r\u00e9plica do conjunto.<\/li>\n<\/ul>\n<pre><code class=\"language-markdown\">mongod --keyFile &lt;path-to-keyfile&gt; --replSet &lt;replicaSetName&gt; --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Voc\u00ea pode incluir op\u00e7\u00f5es adicionais conforme necess\u00e1rio para \u00e0 sua configura\u00e7\u00e3o. Por exemplo, se desejar que clientes remotos se conectem ao seu ambiente ou se os membros do seu ambiente s\u00e3o executados em hosts diferentes, especifique o &#8211;bind_ip. Para obter mais informa\u00e7\u00f5es, consulte as <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/release-notes\/3.6-compatibility\/#std-label-3.6-bind_ip-compatibility\">Mudan\u00e7as na Compatibilidade Localhost Binding<\/a>.<\/p>\n<p>Em seguida,<strong> conecte-se a um membro do conjunto de r\u00e9plicas pela interface local<\/strong> (localhost). \u00c9 necess\u00e1rio executar o &#8220;mongosh&#8221; na mesma m\u00e1quina f\u00edsica em que a inst\u00e2ncia do &#8220;mongod&#8221; est\u00e1 sendo executada. Esta interface s\u00f3 est\u00e1 dispon\u00edvel quando nenhum usu\u00e1rio foi criado para a implanta\u00e7\u00e3o e fecha automaticamente ap\u00f3s a cria\u00e7\u00e3o do primeiro usu\u00e1rio.<\/p>\n<p>Ent\u00e3o iniciamos o conjunto de r\u00e9plicas. A partir de mongosh, execute o m\u00e9todo <code>rs.initiate()<\/code>:<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(\n  {\n    _id: \"myReplSet\",\n    members: [\n      { _id: 0, host: \"mongo1:27017\" },\n      { _id: 1, host: \"mongo2:27017\" },\n      { _id: 2, host: \"mongo3:27017\" }\n    ]\n  }\n)<\/code><\/pre>\n<p>Como discutido anteriormente, este m\u00e9todo elege um dos membros para ser o membro prim\u00e1rio do conjunto de r\u00e9plicas. Para localizar o membro principal, use <code>rs.status()<\/code>. Conecte-se ao membro prim\u00e1rio antes de continuar.<\/p>\n<p>Agora, <strong>crie o administrador do usu\u00e1rio<\/strong>. Voc\u00ea pode adicionar um usu\u00e1rio usando o m\u00e9todo <code>db.createUser()<\/code>. Certifique-se de que o usu\u00e1rio deve ter pelo menos a fun\u00e7\u00e3o <code>userAdminAnyDatabase<\/code> no banco de dados do administrador.<\/p>\n<p>O exemplo a seguir cria o usu\u00e1rio &#8216;batman&#8217; com a fun\u00e7\u00e3o <code>userAdminAnyDatabase<\/code> no banco de dados do administrador:<\/p>\n<pre><code class=\"language-markdown\">admin = db.getSiblingDB(\"admin\")\nadmin.createUser(\n  {\n    user: \"batman\",\n    pwd: passwordPrompt(), \/\/ or cleartext password\n    roles: [ { role: \"userAdminAnyDatabase\", db: \"admin\" } ]\n  }\n)<\/code><\/pre>\n<p>Digite a senha criada anteriormente quando solicitado.<\/p>\n<p>Em seguida, voc\u00ea deve <strong>autenticar-se\u00a0como administrador do usu\u00e1rio<\/strong>. Para fazer isso, use <code>db.auth()<\/code> para autenticar. Por exemplo:<\/p>\n<p>db.getSiblingDB(&#8220;admin&#8221;).auth(&#8220;batman&#8221;, passwordPrompt()) \/\/ ou cleartext password<\/p>\n<p>Alternativamente, voc\u00ea pode conectar uma nova inst\u00e2ncia mongosh ao membro do conjunto prim\u00e1rio de r\u00e9plicas usando os par\u00e2metros <code>-u &lt;username&gt;<\/code>,<code> -p &lt;password&gt;<\/code> e <code>--authenticationDatabase<\/code>.<\/p>\n<pre><code class=\"language-markdown\">mongosh -u \"batman\" -p  --authenticationDatabase \"admin\"<\/code><\/pre>\n<p>Mesmo se voc\u00ea n\u00e3o especificar a senha no campo de linha de comando <code>-p<\/code>, mongosh solicita a senha.<\/p>\n<p>Finalmente, <strong>crie o administrador do cluster<\/strong>. A fun\u00e7\u00e3o <code>clusterAdmin<\/code> d\u00e1 acesso \u00e0s opera\u00e7\u00f5es de replica\u00e7\u00e3o, tais como a configura\u00e7\u00e3o do conjunto de r\u00e9plicas.<\/p>\n<p>Vamos criar um usu\u00e1rio administrador de cluster e atribuir a fun\u00e7\u00e3o <code>clusterAdmin<\/code> no banco de dados do administrador:<\/p>\n<pre><code class=\"language-markdown\">db.getSiblingDB(\"admin\").createUser(\n  {\n    \"user\": \"robin\",\n    \"pwd\": passwordPrompt(),     \/\/ or cleartext password\n    roles: [ { \"role\" : \"clusterAdmin\", \"db\" : \"admin\" } ]\n  }\n)<\/code><\/pre>\n<p>Digite a senha quando solicitado.<\/p>\n<p>Se desejar, voc\u00ea pode criar usu\u00e1rios adicionais para permitir que clientes interajam com o conjunto de r\u00e9plicas.<\/p>\n<p>E pronto! Voc\u00ea habilitou com sucesso a autentica\u00e7\u00e3o por chave (keyfile authentication)!<\/p>\n\n<h2>Resumo<\/h2>\n<p>Replica\u00e7\u00e3o tem sido um requisito essencial quando se trata de bancos de dados, especialmente \u00e0 medida que mais empresas expandem suas opera\u00e7\u00f5es. Ela melhora significativamente o\u00a0<a href=\"https:\/\/kinsta.com\/pt\/blog\/apm-ferramentas\/\">desempenho<\/a>, a seguran\u00e7a dos dados e a disponibilidade do sistema. Falando em desempenho, \u00e9 fundamental monitorar problemas de desempenho em seu banco de dados WordPress e corrigi-los rapidamente, por exemplo, utilizando ferramentas como\u00a0<a href=\"https:\/\/kinsta.com\/pt\/ferramenta-apm\/\">Kinsta APM<\/a>, Jetpack e Freshping, apenas para citar algumas.<\/p>\n<p>A replica\u00e7\u00e3o ajuda a garantir a prote\u00e7\u00e3o dos dados em v\u00e1rios servidores e evita que seus servidores sofram com longos per\u00edodos de inatividade (ou pior &#8211; perda completa de dados). Neste artigo, abordamos a cria\u00e7\u00e3o de um conjunto de r\u00e9plicas e algumas dicas de solu\u00e7\u00e3o de problemas, juntamente com a import\u00e2ncia da replica\u00e7\u00e3o. Voc\u00ea usa a replica\u00e7\u00e3o do MongoDB para o seu neg\u00f3cio e tem sido \u00fatil para voc\u00ea? Deixe-nos saber na se\u00e7\u00e3o de coment\u00e1rios abaixo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MongoDB \u00e9 um banco de dados NoSQL que utiliza documentos do tipo JSON com esquemas din\u00e2micos. Ao trabalhar com bancos de dados, \u00e9 sempre bom ter &#8230;<\/p>\n","protected":false},"author":199,"featured_media":58064,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1018],"class_list":["post-58063","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-ferramentas-desenvolvimento-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos) - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)\" \/>\n<meta property=\"og:description\" content=\"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-16T07:42:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T05:32:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)\",\"datePublished\":\"2023-03-16T07:42:04+00:00\",\"dateModified\":\"2023-08-24T05:32:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\"},\"wordCount\":6762,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\",\"name\":\"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos) - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\",\"datePublished\":\"2023-03-16T07:42:04+00:00\",\"dateModified\":\"2023-08-24T05:32:16+00:00\",\"description\":\"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ferramentas de Desenvolvimento Web\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos) - Kinsta\u00ae","description":"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/","og_locale":"pt_PT","og_type":"article","og_title":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)","og_description":"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!","og_url":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-03-16T07:42:04+00:00","article_modified_time":"2023-08-24T05:32:16+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Jeremy Holcombe","Tempo estimado de leitura":"30 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)","datePublished":"2023-03-16T07:42:04+00:00","dateModified":"2023-08-24T05:32:16+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/"},"wordCount":6762,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/","url":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/","name":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos) - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","datePublished":"2023-03-16T07:42:04+00:00","dateModified":"2023-08-24T05:32:16+00:00","description":"Um conjunto de r\u00e9plicas do MongoDB \u00e9 um grupo de inst\u00e2ncias do MongoDB interconectadas que fornecem redund\u00e2ncia e alta disponibilidade. Implante conjuntos de r\u00e9plicas e proteja seus dados!","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/mongodb-replica-set.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/replica-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Ferramentas de Desenvolvimento Web","item":"https:\/\/kinsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/"},{"@type":"ListItem","position":3,"name":"Construa uma R\u00e9plica Robusta do MongoDB em Tempo Recorde (4 M\u00e9todos)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=58063"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58063\/revisions"}],"predecessor-version":[{"id":62493,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58063\/revisions\/62493"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/translations\/dk"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58063\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/58064"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=58063"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=58063"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=58063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}