{"id":4655,"date":"2018-02-20T16:54:35","date_gmt":"2018-02-21T00:54:35","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4655"},"modified":"2021-02-15T11:44:45","modified_gmt":"2021-02-15T19:44:45","slug":"high-throughput-low-latency-master-slave-replication","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/high-throughput-low-latency-master-slave-replication\/","title":{"rendered":"Otimize a lat\u00eancia e a taxa de transfer\u00eancia com a replica\u00e7\u00e3o mestre-escravo"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">No Couchbase, a lat\u00eancia e a taxa de transfer\u00eancia s\u00e3o significativamente afetadas pela replica\u00e7\u00e3o de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">H\u00e1 diferentes tipos de modelos de replica\u00e7\u00e3o de dados, principalmente mestre-escravo (Couchbase, MongoDB, Espresso), mestre-mestre (BDR para PostgreSQL, GoldenGate para Oracle) e sem mestre (Dynamo, Cassandra). Este artigo discute apenas a replica\u00e7\u00e3o mestre-escravo em armazenamentos de valores-chave (KV).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4665 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM-300x173.png\" alt=\"Master Slave Replication Couchbase\" width=\"300\" height=\"173\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM-300x173.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM.png 724w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">No modelo de replica\u00e7\u00e3o mestre-escravo, h\u00e1 um mestre para uma \u00fanica parti\u00e7\u00e3o de dados e uma ou mais r\u00e9plicas, que s\u00e3o essencialmente escravas e seguem os dados na parti\u00e7\u00e3o mestre. Os aplicativos clientes enviam os valores-chave para o mestre e, posteriormente, os valores-chave s\u00e3o enviados do mestre para as r\u00e9plicas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Este artigo come\u00e7a com alguns conceitos, como ordena\u00e7\u00e3o, n\u00fameros de sequ\u00eancia monotonicamente crescentes, snapshots, MVCC usando grava\u00e7\u00f5es e compacta\u00e7\u00e3o somente de acr\u00e9scimo. Em seguida, o artigo explica como a replica\u00e7\u00e3o mestre-escravo pode ser feita com (1) <\/span><i><span style=\"font-weight: 400;\">Instant\u00e2neos do Delta<\/span><\/i><span style=\"font-weight: 400;\"> ou com (2) <\/span><i><span style=\"font-weight: 400;\">Ponto no tempo <\/span><\/i><span style=\"font-weight: 400;\">snapshots, as vantagens e desvantagens entre eles e quando \u00e9 melhor usar um em vez do outro. Por fim, o artigo discute brevemente como o Couchbase, uma plataforma popular de Big Data, usa esses snapshots para replica\u00e7\u00e3o de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O particionamento dos dados, a atribui\u00e7\u00e3o das parti\u00e7\u00f5es aos n\u00f3s f\u00edsicos, a detec\u00e7\u00e3o e o tratamento de falhas nos n\u00f3s, a reconcilia\u00e7\u00e3o de ramifica\u00e7\u00f5es divergentes de dados e muito mais s\u00e3o importantes para alimentar um armazenamento KV distribu\u00eddo. Este artigo n\u00e3o aborda nenhum desses aspectos, mas discute apenas a replica\u00e7\u00e3o mestre-escravo de uma \u00fanica parti\u00e7\u00e3o de dados - incluindo, especificamente, o Couchbase e a replica\u00e7\u00e3o.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Hist\u00f3rico<\/span><\/h3>\n<h4><span style=\"font-weight: 400;\">Replica\u00e7\u00e3o ing\u00eanua<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Uma maneira de replicar dados \u00e9 obter uma c\u00f3pia completa da fonte sempre que quisermos uma c\u00f3pia. Embora isso seja muito simples de implementar, n\u00e3o \u00e9 de grande utilidade em bancos de dados OLTP ou em armazenamentos KV com carga de trabalho em tempo real, em que os dados de origem continuam recebendo novas atualiza\u00e7\u00f5es, pois as c\u00f3pias de r\u00e9plica n\u00e3o podem obter essas atualiza\u00e7\u00f5es em tempo real.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A capacidade de resumir, enviando apenas as altera\u00e7\u00f5es (delta), \u00e9 um recurso importante para qualquer protocolo de replica\u00e7\u00e3o que frequentemente precisa lidar com grandes quantidades de dados. Mas isso tem um custo de complexidade adicional da necessidade de ordena\u00e7\u00e3o e instant\u00e2neos que discutiremos nas se\u00e7\u00f5es a seguir.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Ordena\u00e7\u00e3o com n\u00fameros de sequ\u00eancia<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">A ordem \u00e9 importante porque permite que os aplicativos raciocinem sobre a causalidade dos dados ou, em outras palavras, permite que os aplicativos saibam se uma opera\u00e7\u00e3o ocorreu antes ou depois de outra opera\u00e7\u00e3o. Nos armazenamentos KV, a ordem \u00e9 usada para identificar o valor mais recente de uma determinada chave no armazenamento e tamb\u00e9m significa a ordem em que as chaves s\u00e3o recebidas pelo armazenamento. N\u00fameros de sequ\u00eancia monotonicamente crescentes s\u00e3o uma maneira de obter \"ordem\" nos valores-chave no armazenamento. Cada par de valor-chave no armazenamento tem um n\u00famero de sequ\u00eancia exclusivo associado a ele e essa sequ\u00eancia aumenta monotonicamente \u00e0 medida que o armazenamento recebe novos valores-chave.<\/span><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><b>OPERA\u00c7\u00c3O<\/b><\/td>\n<td><b>CHAVE<\/b><\/td>\n<td><b>VALOR<\/b><\/td>\n<td><b>N\u00daMERO DE SEQU\u00caNCIA<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">INSERIR<\/span><\/td>\n<td><span style=\"font-weight: 400;\">K1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">V1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SEQ1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">INSERIR<\/span><\/td>\n<td><span style=\"font-weight: 400;\">K2<\/span><\/td>\n<td><span style=\"font-weight: 400;\">V2<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SEQ2<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">ATUALIZA\u00c7\u00c3O<\/span><\/td>\n<td><span style=\"font-weight: 400;\">K1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">V1'<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SEQ3<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">INSERIR<\/span><\/td>\n<td><span style=\"font-weight: 400;\">K3<\/span><\/td>\n<td><span style=\"font-weight: 400;\">V3<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SEQ4<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">No exemplo acima, K2-V2 \u00e9 recebido pela loja depois de K1-V1; K1-V1' \u00e9 recebido pela loja depois de K2-V2 e assim por diante. Portanto, SEQ4 &gt; SEQ3 &gt; SEQ2 &gt; SEQ1. Se o armazenamento for somente de acr\u00e9scimo, com a ajuda de SEQ3 &gt; SEQ1, podemos identificar que o valor (mais recente) de K1 \u00e9 V1' e n\u00e3o V1.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O uso de n\u00fameros de sequ\u00eancia que aumentam monotonicamente ocorre principalmente em instant\u00e2neos pontuais, sobre os quais falaremos mais adiante.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Instant\u00e2neos<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">No sentido mais b\u00e1sico, um snapshot (um snapshot completo) \u00e9 uma exibi\u00e7\u00e3o imut\u00e1vel do armazenamento KV em uma inst\u00e2ncia. Essa tamb\u00e9m \u00e9 uma exibi\u00e7\u00e3o consistente do armazenamento KV nessa inst\u00e2ncia.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Definimos um \"<\/span><i><span style=\"font-weight: 400;\">Instant\u00e2neo da Delta<\/span><\/i><span style=\"font-weight: 400;\">\" como uma c\u00f3pia imut\u00e1vel dos pares de valores-chave recebidos pelo armazenamento de KV em um per\u00edodo de tempo. Chamamos de snapshot delta porque o snapshot n\u00e3o cont\u00e9m todos os valores-chave no armazenamento e cont\u00e9m apenas os valores-chave recebidos ap\u00f3s a forma\u00e7\u00e3o de um snapshot delta imediatamente anterior, at\u00e9 o momento em que o snapshot atual \u00e9 criado. Os instant\u00e2neos delta sucessivos fornecem uma vis\u00e3o consistente do armazenamento KV at\u00e9 um determinado ponto, ou seja, at\u00e9 o ponto em que o \u00faltimo instant\u00e2neo \u00e9 criado.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">MVCC usando Append Only Writes<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">O controle de simultaneidade de v\u00e1rias vers\u00f5es (MVCC) \u00e9 um m\u00e9todo de controle de simultaneidade usado em armazenamentos KV para permitir leitores e gravadores simult\u00e2neos. A maneira mais simples de lidar com a simultaneidade seria usar bloqueios de leitura e grava\u00e7\u00e3o. No entanto, em armazenamentos KV distribu\u00eddos que lidam com grandes quantidades de dados, o MVCC provou ser extremamente \u00fatil em rela\u00e7\u00e3o ao bloqueio. O MVCC ajuda a obter taxas de transfer\u00eancia mais altas e lat\u00eancias mais baixas para leituras e grava\u00e7\u00f5es.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O MVCC \u00e9 obtido com o uso de instant\u00e2neos e grava\u00e7\u00f5es somente de acr\u00e9scimo no armazenamento KV. No exemplo abaixo, digamos que a \"chave B\" seja atualizada por um escritor enquanto h\u00e1 leitores no instant\u00e2neo delta 1. O controle de simultaneidade com bloqueio exigiria que a entidade mutante esperasse at\u00e9 que a replica\u00e7\u00e3o de todo o snapshot fosse conclu\u00edda. No entanto, com uma abordagem MVCC somente de acr\u00e9scimo, a grava\u00e7\u00e3o na chave B pode continuar a ocorrer mesmo quando o instant\u00e2neo atual estiver sendo lido.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4656 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img1_mvcc_delta_snapshot-280x300.png\" alt=\"\" width=\"394\" height=\"422\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img1_mvcc_delta_snapshot-280x300.png 280w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img1_mvcc_delta_snapshot-300x322.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img1_mvcc_delta_snapshot-20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img1_mvcc_delta_snapshot.png 332w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Para leitores mais avan\u00e7ados, o MVCC tamb\u00e9m pode ser feito quando o armazenamento KV usa estruturas de dados mais complicadas para armazenar dados. O exemplo abaixo mostra como o MVCC pode ser obtido em uma B+Tree somente de acr\u00e9scimo. Digamos que a \"chave B\" seja atualizada por um escritor enquanto houver leitores no instant\u00e2neo delta atual.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4657 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img2_btree-296x300.png\" alt=\"\" width=\"333\" height=\"338\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree-296x300.png 296w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree-300x304.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree-20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img2_btree.png 504w\" sizes=\"auto, (max-width: 333px) 100vw, 333px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Com uma abordagem MVCC somente de anexo, a grava\u00e7\u00e3o na \"chave B\" e o ramo associado na \u00e1rvore B+ podem continuar a ocorrer mesmo quando o instant\u00e2neo atual estiver sendo lido, conforme mostrado abaixo.<\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4658 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img3_btree2-300x240.png\" alt=\"\" width=\"466\" height=\"373\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img3_btree2-300x240.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img3_btree2-20x16.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img3_btree2.png 668w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Os dois instant\u00e2neos sobrepostos representados pelas ra\u00edzes B+Tree de G e G' representam visualiza\u00e7\u00f5es consistentes do reposit\u00f3rio KV em duas inst\u00e2ncias de tempo.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Compacta\u00e7\u00e3o<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Como os instant\u00e2neos s\u00e3o imut\u00e1veis, as atualiza\u00e7\u00f5es das chaves s\u00e3o anexadas apenas ao final do armazenamento da KV e, portanto, o uso da mem\u00f3ria do armazenamento acabar\u00e1 se tornando muito maior do que a mem\u00f3ria necess\u00e1ria para os valores-chave ativos. Portanto, o armazenamento KV precisa mesclar periodicamente os instant\u00e2neos mais antigos e se livrar dos valores-chave duplicados\/velhos em uma tarefa em segundo plano chamada compacta\u00e7\u00e3o. A compacta\u00e7\u00e3o reduz a mem\u00f3ria usada pelo reposit\u00f3rio KV.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Os acionadores para compacta\u00e7\u00e3o podem estar em um limite de mem\u00f3ria ou em um intervalo de tempo fixo ou em uma combina\u00e7\u00e3o de ambos.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4664 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM-300x181.png\" alt=\"\" width=\"446\" height=\"269\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM-300x181.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM-1024x618.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM-768x464.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-20-at-4.40.13-PM.png 1156w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/p>\n<h3><span style=\"font-weight: 400;\">Instant\u00e2neos do Delta<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Os armazenamentos KV podem ser replicados enviando uma sequ\u00eancia de instant\u00e2neos delta sucessivos. Conforme explicado acima, em uma abordagem de grava\u00e7\u00f5es append-only, novos valores-chave e atualiza\u00e7\u00f5es s\u00e3o apenas anexados ao armazenamento. Depois de receber um lote de itens, um instant\u00e2neo imut\u00e1vel \u00e9 criado e est\u00e1 pronto para ser enviado aos n\u00f3s de r\u00e9plica. Os valores de chave recebidos pelo armazenamento ap\u00f3s a cria\u00e7\u00e3o desse instant\u00e2neo s\u00e3o anexados ao armazenamento e far\u00e3o parte do pr\u00f3ximo instant\u00e2neo. Os clientes de replica\u00e7\u00e3o coletam esses instant\u00e2neos delta imut\u00e1veis um ap\u00f3s o outro e obt\u00eam uma visualiza\u00e7\u00e3o do armazenamento que \u00e9 consistente com a origem. Observe que isso n\u00e3o precisa de n\u00fameros de sequ\u00eancia para cada par de KV, mas precisar\u00e1 identificar a ordem dos delta snapshots.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4660 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img5_delta_snapshot-300x81.png\" alt=\"\" width=\"559\" height=\"151\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img5_delta_snapshot-300x81.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img5_delta_snapshot-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img5_delta_snapshot.png 624w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Uma desvantagem dessa abordagem \u00e9 que o lado de origem do armazenamento KV pode compactar os v\u00e1rios instant\u00e2neos delta imut\u00e1veis em um \u00fanico instant\u00e2neo. Agora, se a compacta\u00e7\u00e3o ocorrer antes que um cliente de replica\u00e7\u00e3o tenha recebido o \u00faltimo snapshot compactado, o cliente ter\u00e1 que receber o snapshot totalmente compactado desde o in\u00edcio do snapshot. Digamos que haja 5 instant\u00e2neos delta imut\u00e1veis snp1, snp2, snp3, snp4 e o cliente tenha recebido at\u00e9 o snp3; ent\u00e3o, a compacta\u00e7\u00e3o \u00e9 executada e os 4 instant\u00e2neos no lado da origem s\u00e3o compactados em um \u00fanico instant\u00e2neo snp1'. Agora o cliente n\u00e3o pode retomar a partir do snp3, ele ter\u00e1 que reverter os instant\u00e2neos que recebeu antes (at\u00e9 o snp3) e ter\u00e1 que receber o snp1' completamente.<\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4661 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img6_delta_snapshot2-300x158.png\" alt=\"\" width=\"566\" height=\"298\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img6_delta_snapshot2-300x158.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img6_delta_snapshot2-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img6_delta_snapshot2.png 624w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Podemos fazer uma otimiza\u00e7\u00e3o com um n\u00famero de sequ\u00eancia (monotonicamente crescente) em cada par de valores-chave e, em seguida, enviar pela rede apenas os n\u00fameros de sequ\u00eancia que s\u00e3o maiores que o snap_end de snp3. Entretanto, o armazenamento KV ainda ter\u00e1 de ler desde o in\u00edcio de snp1' para chegar ao snap_end de snp3.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Outra desvantagem da abordagem \u00e9 que os pares de valores-chave mais recentes n\u00e3o podem ser replicados at\u00e9 que sejam formados em um instant\u00e2neo delta imut\u00e1vel. Isso aumenta a lat\u00eancia das chaves que est\u00e3o sendo enviadas para as r\u00e9plicas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Os snapshots delta s\u00e3o bons para replicar um lote razoavelmente grande de itens, ou seja, para replicar um lote de itens, <\/span><b>alta taxa de transfer\u00eancia, mas tamb\u00e9m alta lat\u00eancia<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Snapshots pontuais<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Os snapshots point-in-time s\u00e3o os snapshots criados em tempo real. Ou seja, enquanto novos dados e atualiza\u00e7\u00f5es est\u00e3o sendo gravados no reposit\u00f3rio de KV, o reposit\u00f3rio cria o snapshot se um cliente de replica\u00e7\u00e3o solicitar dados. Isso significa que, para receber os valores-chave mais recentes, as r\u00e9plicas n\u00e3o precisam esperar que um snapshot seja criado na origem.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4662 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img7_point_itime_snapshot1-300x90.png\" alt=\"\" width=\"607\" height=\"182\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img7_point_itime_snapshot1-300x90.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img7_point_itime_snapshot1-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img7_point_itime_snapshot1.png 624w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Os snapshots point-in-time podem ser criados muito rapidamente (baixa lat\u00eancia) em um armazenamento KV somente de acr\u00e9scimo e s\u00e3o mais adequados para replica\u00e7\u00e3o de itens na mem\u00f3ria e em estado est\u00e1vel. Por estado est\u00e1vel, queremos dizer que todos os clientes de replica\u00e7\u00e3o quase alcan\u00e7aram a origem.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Esse modelo exige que cada par chave-valor tenha um n\u00famero de sequ\u00eancia monotonicamente crescente. Um snapshot point-in-time \u00e9 definido pela tupla {start_seqno, end_seqno}.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Digamos que a origem tenha pares de valores-chave do n\u00famero de sequ\u00eancia 0 a 100 e um cliente de replica\u00e7\u00e3o R1 fa\u00e7a uma solicita\u00e7\u00e3o de c\u00f3pia de dados. Os pares de valores chave do n\u00famero de sequ\u00eancia 0 a 100 s\u00e3o enviados como um instant\u00e2neo (instant\u00e2neo point-in-time) para R1 e um cursor C1 que corresponde ao cliente R1 \u00e9 marcado no armazenamento. Em um momento posterior, digamos que o armazenamento tenha anexado mais 20 pares KV e tenha o n\u00famero de sequ\u00eancia mais alto, 120. Se outro cliente R2 solicitar dados, os pares de valores-chave do n\u00famero de sequ\u00eancia 0 a 120 ser\u00e3o enviados como um instant\u00e2neo para R2 e um cursor C2 que corresponde ao cliente R2 ser\u00e1 marcado no armazenamento. Quando mais dados s\u00e3o anexados ao armazenamento, digamos at\u00e9 o n\u00famero de sequ\u00eancia 150, o cliente R1 pode obter at\u00e9 150 em um instant\u00e2neo pontual sucessivo de 101 a 150 e o cliente R2 em um instant\u00e2neo pontual sucessivo de 121 a 150. Observe que os cursores C1 e C2 s\u00e3o importantes para recome\u00e7ar rapidamente de onde os clientes R1 e R2 pararam antes. \u00c0 medida que os cursores se movem, os pares de valores-chave com n\u00famero de sequ\u00eancia menor que o n\u00famero de sequ\u00eancia em que qualquer cursor est\u00e1 marcado podem ser compactados sem nenhuma conten\u00e7\u00e3o de leitura e grava\u00e7\u00e3o ou removidos da mem\u00f3ria (no caso de replica\u00e7\u00e3o de dados na mem\u00f3ria em um armazenamento KV persistente).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4663 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/img8_point_in_time_snap2-300x226.png\" alt=\"\" width=\"550\" height=\"415\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img8_point_in_time_snap2-300x226.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img8_point_in_time_snap2-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/img8_point_in_time_snap2.png 624w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Os snapshots point-in-time s\u00e3o bons para a replica\u00e7\u00e3o em estado est\u00e1vel, pois os clientes de replica\u00e7\u00e3o obt\u00eam seus pr\u00f3prios snapshots que s\u00e3o criados sob demanda e, portanto, evitam qualquer espera pela cria\u00e7\u00e3o de um snapshot. Assim, os clientes podem se atualizar com a origem muito rapidamente com os pares de valores-chave mais recentes enviados o mais r\u00e1pido poss\u00edvel. Al\u00e9m disso, os clientes n\u00e3o precisam recome\u00e7ar se uma compacta\u00e7\u00e3o for executada entre seus instant\u00e2neos sucessivos e a origem tamb\u00e9m n\u00e3o precisa manter instant\u00e2neos delta para que todos os clientes os leiam.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Clientes lentos e clientes atrasados (diferidos) n\u00e3o funcionam bem com instant\u00e2neos pontuais. Como n\u00e3o podemos compactar sem conten\u00e7\u00e3o de leitura e grava\u00e7\u00e3o ou ejetar da mem\u00f3ria os pares de valores-chave com n\u00famero de sequ\u00eancia menor que o n\u00famero de sequ\u00eancia do cursor com o menor n\u00famero de sequ\u00eancia, um cliente lento pode diminuir a velocidade de cria\u00e7\u00e3o de instant\u00e2neos point-in-time para todos os outros clientes e tamb\u00e9m aumentar o uso da mem\u00f3ria.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Os snapshots point-in-time s\u00e3o bons para replicar rapidamente os itens mais recentes, ou seja, para que os itens mais recentes sejam replicados, <\/span><b>baixa lat\u00eancia, mas tamb\u00e9m baixa taxa de transfer\u00eancia<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Uso de snapshots delta e point-in-time<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Ambos<\/span><b> alta taxa de transfer\u00eancia e baixa lat\u00eancia<\/b><span style=\"font-weight: 400;\"> pode ser obtida alternando dinamicamente entre o modo de instant\u00e2neo delta ou o modo de instant\u00e2neo point-in-time, conforme necess\u00e1rio, durante a replica\u00e7\u00e3o de uma parti\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Quando um cliente de replica\u00e7\u00e3o se conecta a uma origem, ele inicialmente obt\u00e9m instant\u00e2neos delta em uma alta taxa de transfer\u00eancia, de modo que logo alcan\u00e7a a origem e, portanto, atinge o estado est\u00e1vel. Em seguida, a replica\u00e7\u00e3o muda para o modo de snapshot point-in-time e, assim, o cliente continua recebendo os itens mais recentes em uma lat\u00eancia muito baixa. Se, por algum motivo, um cliente ficar lento, a replica\u00e7\u00e3o volta para o modo de instant\u00e2neo delta incremental para reduzir qualquer aumento n\u00e3o saud\u00e1vel no uso da mem\u00f3ria. E quando o cliente lento alcan\u00e7a a fonte e atinge o estado est\u00e1vel novamente, a replica\u00e7\u00e3o muda para o modo de instant\u00e2neo point-in-time.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Outras considera\u00e7\u00f5es sobre o projeto<\/span><\/h3>\n<h4><span style=\"font-weight: 400;\">Elimina\u00e7\u00e3o de exclus\u00f5es<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">No modo somente anexar, as exclus\u00f5es s\u00e3o sempre anexadas no final do armazenamento. Na replica\u00e7\u00e3o que usa snapshots, a anexa\u00e7\u00e3o de exclus\u00f5es \u00e9 essencial para refletir a exclus\u00e3o de uma chave em todas as r\u00e9plicas. No entanto, n\u00e3o podemos manter as exclus\u00f5es para sempre, pois elas representam uma sobrecarga para a mem\u00f3ria do armazenamento. Portanto, eventualmente, as exclus\u00f5es precisam ser eliminadas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Mas a elimina\u00e7\u00e3o de exclus\u00f5es pode ter efeitos em clientes de replica\u00e7\u00e3o lenta e, \u00e0s vezes, pode interromper a replica\u00e7\u00e3o incremental, especialmente em clientes que n\u00e3o alcan\u00e7aram o instant\u00e2neo em que uma exclus\u00e3o foi eliminada. Esses clientes podem ter que reconstruir todos os instant\u00e2neos desde o in\u00edcio para obter uma c\u00f3pia que seja consistente com a origem.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Ramifica\u00e7\u00e3o<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Falhas graves podem levar a diferentes ramifica\u00e7\u00f5es de dados entre r\u00e9plicas. Essas ramifica\u00e7\u00f5es podem ser reconciliadas e, eventualmente, todas as r\u00e9plicas podem ter as mesmas c\u00f3pias consistentes. Existem protocolos e algoritmos para fazer isso e eles se cruzam muito bem com o mundo dos instant\u00e2neos. No entanto, esses aspectos est\u00e3o fora do escopo deste artigo. Este artigo discute apenas os esquemas de replica\u00e7\u00e3o e de snapshotting quando n\u00e3o h\u00e1 falhas graves.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Deduplica\u00e7\u00e3o<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">A deduplica\u00e7\u00e3o \u00e9 a remo\u00e7\u00e3o de vers\u00f5es duplicadas da mesma chave em um instant\u00e2neo e a reten\u00e7\u00e3o apenas da vers\u00e3o final da chave nesse instant\u00e2neo. O principal objetivo da deduplica\u00e7\u00e3o \u00e9 reduzir o uso da mem\u00f3ria.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A deduplica\u00e7\u00e3o \u00e9 feita em snapshots delta durante a compacta\u00e7\u00e3o. Nos snapshots point-in-time, a deduplica\u00e7\u00e3o pode ser feita durante a compacta\u00e7\u00e3o e tamb\u00e9m enquanto os itens est\u00e3o sendo anexados. Fazer a deduplica\u00e7\u00e3o junto com snapshots point-in-time cria uma complexidade adicional, como a impossibilidade de gravar quando um snapshot point-in-time est\u00e1 sendo lido e a n\u00e3o-reprodutibilidade quando a origem de um cliente muda em casos de falha. Conforme mencionado anteriormente, a discuss\u00e3o sobre esses cen\u00e1rios de falha est\u00e1 al\u00e9m do escopo deste artigo.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Uso no Couchbase<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">No Couchbase, a lat\u00eancia e a taxa de transfer\u00eancia se beneficiam da replica\u00e7\u00e3o que escolhe dinamicamente instant\u00e2neos delta do disco ou instant\u00e2neos point-in-time da mem\u00f3ria. Os snapshots delta do disco tamb\u00e9m usam n\u00fameros de sequ\u00eancia monotonicamente crescentes para retomar de onde os clientes pararam para reduzir o tr\u00e1fego da rede.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase tamb\u00e9m faz desduplica\u00e7\u00e3o, detec\u00e7\u00e3o e tratamento de falhas de n\u00f3s, reconcilia\u00e7\u00e3o de ramifica\u00e7\u00f5es divergentes de dados, fornecendo clientes de dados mais sofisticados do que apenas clientes de replica\u00e7\u00e3o (indexa\u00e7\u00e3o, pesquisa de texto completo), armazenamento em cache, particionamento e muito mais, o que \u00e9 importante para fornecer uma plataforma de dados altamente dispon\u00edvel, de alto desempenho e que prioriza a mem\u00f3ria.<\/span><\/p>\n<p><span style=\"color: #343e47; font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 40px;\">Conclus\u00e3o<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Na replica\u00e7\u00e3o mestre-escravo, os \"Delta Snapshots\" s\u00e3o bons para replicar um lote de itens e, portanto, oferecem alta taxa de transfer\u00eancia. Os \"Point-in-time Snapshots\" s\u00e3o bons para replica\u00e7\u00e3o em estado est\u00e1vel, proporcionando, assim, baixa lat\u00eancia. Usando um ou outro, conforme a situa\u00e7\u00e3o, podemos obter uma replica\u00e7\u00e3o mestre-escravo com alta taxa de transfer\u00eancia e baixa lat\u00eancia.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Autor<\/span><\/h3>\n<div style=\"width: 220px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/github.com\/hisundar\"><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/avatars2.githubusercontent.com\/u\/4744280?s=400&amp;v=4\" alt=\"Sundar Sridharan\" width=\"210\" height=\"210\" \/><\/a><p class=\"wp-caption-text\">Sundar Sridharan, engenheiro de software s\u00eanior<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>In Couchbase, latency and throughput are significantly impacted by data replication. There are different kinds of data replication models, mainly master-slave (Couchbase, MongoDB, Espresso), master-master (BDR for PostgreSQL, GoldenGate for Oracle) and masterless (Dynamo, Cassandra). This article only discusses the [&hellip;]<\/p>","protected":false},"author":11806,"featured_media":10794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1821,1816],"tags":[1236,1562],"ppma_author":[9062],"class_list":["post-4655","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-architecture","category-couchbase-server","tag-big-data","tag-replication"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Optimize Latency, Throughput With Master Slave Replication<\/title>\n<meta name=\"description\" content=\"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/high-throughput-low-latency-master-slave-replication\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimize Latency, Throughput With Master Slave Replication\" \/>\n<meta property=\"og:description\" content=\"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/high-throughput-low-latency-master-slave-replication\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/sundar.sridharan\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-21T00:54:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-02-15T19:44:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"693\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sundar Sridharan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hisundar\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sundar Sridharan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/\"},\"author\":{\"name\":\"Sundar Sridharan\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/63b079824b3eaa18b64547339b03437a\"},\"headline\":\"Optimize Latency, Throughput With Master Slave Replication\",\"datePublished\":\"2018-02-21T00:54:35+00:00\",\"dateModified\":\"2021-02-15T19:44:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/\"},\"wordCount\":2475,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png\",\"keywords\":[\"Big Data\",\"replication\"],\"articleSection\":[\"Couchbase Architecture\",\"Couchbase Server\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/\",\"name\":\"Optimize Latency, Throughput With Master Slave Replication\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png\",\"datePublished\":\"2018-02-21T00:54:35+00:00\",\"dateModified\":\"2021-02-15T19:44:45+00:00\",\"description\":\"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png\",\"width\":1200,\"height\":693,\"caption\":\"Two keys from a keyboard with an arrow over them, pointing left to right. The key on the left is marked \\\"Master Snapshot\\\" while the one on the right is marked \\\"Slave\\\"\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Optimize Latency, Throughput With Master Slave Replication\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/63b079824b3eaa18b64547339b03437a\",\"name\":\"Sundar Sridharan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/464f87427f83c3377f360f404be2be34\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/67c68714a10cbb6d5045e543c5ed5c0f9880aa9d299aafbf8b38baa58058fe5a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/67c68714a10cbb6d5045e543c5ed5c0f9880aa9d299aafbf8b38baa58058fe5a?s=96&d=mm&r=g\",\"caption\":\"Sundar Sridharan\"},\"description\":\"Sundar Sridharan is a Senior Software Engineer in Couchbase from almost 5 years. Sundar Sridharan is responsible for development on Eventual Persistence Engine. Prior to joining Couchbase, he spent 5 years in Oracle working for Oracle's EXADATA server product.\",\"sameAs\":[\"https:\/\/github.com\/hisundar\",\"https:\/\/www.facebook.com\/sundar.sridharan\",\"https:\/\/x.com\/hisundar\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/sundarcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Otimize a lat\u00eancia e a taxa de transfer\u00eancia com a replica\u00e7\u00e3o mestre-escravo","description":"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.","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:\/\/www.couchbase.com\/blog\/pt\/high-throughput-low-latency-master-slave-replication\/","og_locale":"pt_BR","og_type":"article","og_title":"Optimize Latency, Throughput With Master Slave Replication","og_description":"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/high-throughput-low-latency-master-slave-replication\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/sundar.sridharan","article_published_time":"2018-02-21T00:54:35+00:00","article_modified_time":"2021-02-15T19:44:45+00:00","og_image":[{"width":1200,"height":693,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png","type":"image\/png"}],"author":"Sundar Sridharan","twitter_card":"summary_large_image","twitter_creator":"@hisundar","twitter_misc":{"Written by":"Sundar Sridharan","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/"},"author":{"name":"Sundar Sridharan","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/63b079824b3eaa18b64547339b03437a"},"headline":"Optimize Latency, Throughput With Master Slave Replication","datePublished":"2018-02-21T00:54:35+00:00","dateModified":"2021-02-15T19:44:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/"},"wordCount":2475,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png","keywords":["Big Data","replication"],"articleSection":["Couchbase Architecture","Couchbase Server"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/","url":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/","name":"Otimize a lat\u00eancia e a taxa de transfer\u00eancia com a replica\u00e7\u00e3o mestre-escravo","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png","datePublished":"2018-02-21T00:54:35+00:00","dateModified":"2021-02-15T19:44:45+00:00","description":"Learn more about the different kinds of data replication models. This article focuses on master-slave replication in Key-Value (KV) stores.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/Screen-Shot-2018-02-19-at-11.51.12-AM_RESIZED.png","width":1200,"height":693,"caption":"Two keys from a keyboard with an arrow over them, pointing left to right. The key on the left is marked \"Master Snapshot\" while the one on the right is marked \"Slave\""},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/high-throughput-low-latency-master-slave-replication\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Optimize Latency, Throughput With Master Slave Replication"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/63b079824b3eaa18b64547339b03437a","name":"Sundar Sridharan","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/464f87427f83c3377f360f404be2be34","url":"https:\/\/secure.gravatar.com\/avatar\/67c68714a10cbb6d5045e543c5ed5c0f9880aa9d299aafbf8b38baa58058fe5a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/67c68714a10cbb6d5045e543c5ed5c0f9880aa9d299aafbf8b38baa58058fe5a?s=96&d=mm&r=g","caption":"Sundar Sridharan"},"description":"Sundar Sridharan \u00e9 engenheiro de software s\u00eanior da Couchbase h\u00e1 quase 5 anos. Sundar Sridharan \u00e9 respons\u00e1vel pelo desenvolvimento do Eventual Persistence Engine. Antes de ingressar no Couchbase, ele passou cinco anos na Oracle trabalhando no produto de servidor EXADATA da Oracle.","sameAs":["https:\/\/github.com\/hisundar","https:\/\/www.facebook.com\/sundar.sridharan","https:\/\/x.com\/hisundar"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/sundarcouchbase-com\/"}]}},"authors":[{"term_id":9062,"user_id":11806,"is_guest":0,"slug":"sundarcouchbase-com","display_name":"Sundar Sridharan","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/67c68714a10cbb6d5045e543c5ed5c0f9880aa9d299aafbf8b38baa58058fe5a?s=96&d=mm&r=g","author_category":"","last_name":"Sridharan","first_name":"Sundar","job_title":"","user_url":"https:\/\/github.com\/hisundar","description":"Sundar Sridharan \u00e9 engenheiro de software s\u00eanior da Couchbase h\u00e1 quase 5 anos. Sundar Sridharan \u00e9 respons\u00e1vel pelo desenvolvimento do Eventual Persistence Engine. Antes de ingressar no Couchbase, ele passou cinco anos na Oracle trabalhando no produto de servidor EXADATA da Oracle."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/11806"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4655"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4655\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10794"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4655"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}