{"id":1768,"date":"2014-12-16T18:41:44","date_gmt":"2014-12-16T18:41:44","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1768"},"modified":"2023-06-28T01:13:50","modified_gmt":"2023-06-28T08:13:50","slug":"rebalancing-couchbase-part-i","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/rebalancing-couchbase-part-i\/","title":{"rendered":"Rebalanceamento com o Couchbase - Parte I"},"content":{"rendered":"<p>Esta \u00e9 a primeira de duas postagens do blog que abordam alguns dos detalhes essenciais da tecnologia de rebalanceamento do Couchbase. Este primeiro post detalha a funcionalidade de rebalanceamento em si, e o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/rebalancing-couchbase-part-ii\/\">segundo<\/a>\u00a0discute como monitorar e trabalhar com ele.<\/p>\n<h2>Guia pr\u00e1tico de rebalanceamento com o Couchbase<\/h2>\n<p>Em meados de 2010, uma pequena empresa chamada NorthScale lan\u00e7ou um produto chamado <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/what-exactly-membase\/\">Membase<\/a>. Entre os muitos recursos revolucion\u00e1rios estava a capacidade de aumentar (ou diminuir) dinamicamente um cluster de \"n\u00f3s\" (inst\u00e2ncias do software). Por defini\u00e7\u00e3o, essa \u00e9 uma opera\u00e7\u00e3o on-line, o que significa que n\u00e3o afeta a disponibilidade dos dados armazenados nesse cluster e n\u00e3o afeta materialmente o desempenho de um aplicativo que acessa esses dados.<\/p>\n<p>Avan\u00e7amos rapidamente at\u00e9 agora (final de 2011... ok, foi um avan\u00e7o r\u00e1pido). Desde ent\u00e3o, a empresa mudou de nome (duas vezes) para Couchbase e aprendeu muito sobre como o produto funciona \"no mundo real\". Ele est\u00e1 sendo implantado em ambientes drasticamente diferentes (pense em seu pr\u00f3prio data center versus a nuvem da Amazon) sob aplicativos drasticamente diferentes (pense em registro versus jogos sociais versus segmenta\u00e7\u00e3o de an\u00fancios). A mesma tecnologia de \"rebalanceamento\" est\u00e1 sendo empregada n\u00e3o apenas no Membase, mas tamb\u00e9m no futuro Couchbase Server 2.0. Achei que agora seria um bom momento para escrever este artigo bastante extenso para responder a muitas das perguntas que cercam esse processo, al\u00e9m de abordar alguns dos problemas conhecidos. A vers\u00e3o atual \u00e9 a 1.7.1.1, e ela percorreu um longo caminho desde a primeira vers\u00e3o beta da 1.6.0, naquele memor\u00e1vel ver\u00e3o de 2010.<\/p>\n<p>Chega de introdu\u00e7\u00e3o, vamos ver at\u00e9 onde podemos ir na toca do coelho...<\/p>\n<h2>O que \u00e9 um rebalanceamento?<\/h2>\n<p>Vamos come\u00e7ar em um n\u00edvel mais alto. O rebalanceamento \u00e9 o processo de redistribui\u00e7\u00e3o de dados para n\u00f3s adicionados ou removidos em um cluster do Membase\/Couchbase Server.<\/p>\n<p>Parece bem simples, certo? Para o observador casual, \u00e9. E nossa inten\u00e7\u00e3o \u00e9 que seja. Assim como a maioria das outras tecnologias, \u00e9 preciso um pouco de complexidade para alcan\u00e7ar essa simplicidade (distra\u00e7\u00e3o total: https:\/\/plus.google.com\/112218872649456413744\/posts\/dfydM2Cnepe).<\/p>\n<h3>Um n\u00edvel abaixo agora.<\/h3>\n<p>Para come\u00e7ar a entender como o Membase\/Couchbase Server funciona, o principal conceito subjacente \u00e9 o de vbuckets (https:\/\/dustin.github.com\/2010\/06\/29\/memcached-vbuckets.html). Um vbucket \u00e9 uma \"fatia\" l\u00f3gica de um conjunto de dados geral (no nosso caso, um bucket... desculpe a nomenclatura, mas ainda n\u00e3o t\u00ednhamos uma equipe de marketing de produto quando isso surgiu). H\u00e1 um n\u00famero est\u00e1tico desses vbuckets, e as chaves s\u00e3o criptografadas (usando CRC32) nessa lista est\u00e1tica. Dessa forma, voc\u00ea tem a garantia de que uma determinada chave sempre far\u00e1 hash para o mesmo vbucket. Cada vbucket \u00e9 ent\u00e3o atribu\u00eddo a um determinado servidor dentro do cluster. Com 256 vbuckets e um servidor, todos eles estariam no mesmo servidor. Com dois servidores, eles seriam compartilhados igualmente entre os dois com 128 buckets cada, quatro servidores receberiam 64 cada e assim por diante.<\/p>\n<p>Um \"mapa de vbucket\" \u00e9 simplesmente a enumera\u00e7\u00e3o dessa lista de vbuckets e dos servidores que os possuem.<\/p>\n<p>Estou ignorando propositalmente a replica\u00e7\u00e3o no momento... Voltarei a ela, mas n\u00e3o \u00e9 importante neste momento.<\/p>\n<p>Um rebalanceamento \u00e9 simplesmente (essa palavra novamente...) o processo de mover um determinado n\u00famero de vbuckets de alguns servidores para outros servidores. O objetivo final \u00e9 que cada servidor dentro do cluster termine com o mesmo n\u00famero de vbuckets. Isso garante que os dados sejam distribu\u00eddos uniformemente em todo o cluster e, portanto, o acesso do aplicativo a esses dados tamb\u00e9m seja balanceado de forma uniforme em todos os n\u00f3s do cluster.<\/p>\n<p>Est\u00e1 me acompanhando at\u00e9 agora? (se n\u00e3o estiver, envie um e-mail para perry@couchbase.com).<\/p>\n<h3>E outro n\u00edvel.<\/h3>\n<p>Quando um rebalanceamento \u00e9 iniciado, um processo chamado \"orquestrador\" examina o mapa atual de vbuckets e o combina com qualquer adi\u00e7\u00e3o\/remo\u00e7\u00e3o de n\u00f3s para calcular como deve ser o novo mapa de vbuckets. Em seguida, o orquestrador come\u00e7a a iniciar a movimenta\u00e7\u00e3o de vbuckets de um n\u00f3 para outro. \u00c9 importante observar que o orquestrador simplesmente \"inicia o processo\" entre dois n\u00f3s, mas n\u00e3o transfere de fato os dados em si... isso \u00e9 propositalmente deixado para os n\u00f3s de origem e destino coordenarem para evitar gargalos ou pontos de falha. Do ponto de vista do orquestrador, n\u00e3o importa realmente se um n\u00f3 est\u00e1 sendo adicionado ou removido do cluster. De fato, v\u00e1rios n\u00f3s podem ser adicionados e\/ou removidos do cluster no mesmo rebalanceamento. Tudo o que est\u00e1 acontecendo \u00e9 que um novo mapa de vbucket est\u00e1 sendo calculado e os movimentos de vbucket iniciados para tornar esse mapa uma realidade.<\/p>\n<p>Cada vbucket \u00e9 movido individualmente e independentemente dos outros (v\u00e1rios podem ser e s\u00e3o movidos em paralelo, mas o ponto \u00e9 que n\u00e3o h\u00e1 rela\u00e7\u00e3o entre vbuckets exclusivos). O n\u00f3 de destino inicia um processo chamado 'ebucketmigrator' que abre uma conex\u00e3o TAP (https:\/\/www.couchbase.org\/wiki\/display\/membase\/TAP+Protocol) com um vbucket no n\u00f3 de origem. Essa conex\u00e3o tem sinalizadores espec\u00edficos que indicam que ela a) deseja todos os dados contidos nela e b) planeja \"assumir\" esse vbucket quando tudo estiver conclu\u00eddo.<\/p>\n<p>Essa \u00faltima parte informa ao n\u00f3 de origem para iniciar o processo de transi\u00e7\u00e3o assim que todos os dados forem enviados. (li\u00e7\u00e3o de hist\u00f3ria: o ebucketmigrator costumava se chamar vbucketmigrator, mas n\u00f3s o transferimos para a VM Erlang... da\u00ed o 'e')<\/p>\n<p>Enquanto cada vbucket est\u00e1 sendo movido, o acesso do cliente (leituras e grava\u00e7\u00f5es) ainda est\u00e1 indo para o local original. Depois que todos os dados s\u00e3o copiados, ocorre uma troca at\u00f4mica em que o local original diz \"n\u00e3o sou mais o mestre deste vbucket\" e envia um \"token\" para o vbucket rec\u00e9m-criado dizendo \"voc\u00ea \u00e9\". O vbucket original passa de ativo para morto, e o novo passa de pendente para ativo. Os clientes inteligentes e o Moxi s\u00e3o atualizados com um novo mapa de vbucket para saber que isso ocorreu e as solicita\u00e7\u00f5es de dados subsequentes s\u00e3o direcionadas para o novo local. (veja algumas se\u00e7\u00f5es abaixo para uma discuss\u00e3o ainda mais aprofundada sobre o comportamento do Moxi e do cliente inteligente)<\/p>\n<h3>E agora o n\u00edvel inferior<\/h3>\n<p>Pelo menos at\u00e9 onde eu vou. Isen\u00e7\u00e3o de responsabilidade: este texto vai se tornar bastante t\u00e9cnico. Pule uma se\u00e7\u00e3o se estiver com pouco tempo.<\/p>\n<p>Conforme mencionado acima, o orquestrador direcionar\u00e1 o processo ebucketmigrator no n\u00f3 de destino para \"puxar\" um vbucket do n\u00f3 de origem por meio do TAP.<\/p>\n<h3>Conex\u00f5es TAP no n\u00f3 de origem<\/h3>\n<p>Quando essa conex\u00e3o TAP \u00e9 iniciada com o n\u00f3 de origem, um \"cursor\" come\u00e7a a percorrer a tabela de hash dentro do vbucket espec\u00edfico. Paralelamente, um processo de \"backfiller\" \u00e9 iniciado e decide se os dados devem ser carregados em massa a partir do disco. Como voc\u00ea provavelmente sabe, o Membase\/Couchbase suporta perfeitamente a exist\u00eancia de mais dados no sistema do que a RAM dispon\u00edvel. Nesse caso, pode haver uma quantidade significativa de dados que precisam ser lidos do disco para serem transferidos para outro n\u00f3. O processo de backfiller analisa a \"propor\u00e7\u00e3o de itens residentes\" (quantidade de dados armazenados em cache na RAM e n\u00e3o armazenados). Se essa propor\u00e7\u00e3o for menor que 90%, ele carrega em massa todo o vbucket do disco em um buffer tempor\u00e1rio de RAM (h\u00e1 limites e retrocessos incorporados para garantir que a capacidade de RAM do n\u00f3 n\u00e3o seja excedida). Se a propor\u00e7\u00e3o de itens residentes for maior que 90%, esse processo n\u00e3o ocorrer\u00e1.<\/p>\n<p>\u00c0 medida que o cursor percorre a tabela de hash, ele come\u00e7a a transmitir as chaves e os documentos pela conex\u00e3o TAP. Qualquer coisa que j\u00e1 esteja armazenada em cache na RAM \u00e9 enviada muito rapidamente; qualquer outra coisa \u00e9 retirada do espa\u00e7o tempor\u00e1rio do buffer (se dispon\u00edvel) ou lida de uma \u00fanica vez no disco.<\/p>\n<p>Durante esse processo, as muta\u00e7\u00f5es nos dados que j\u00e1 foram enviados s\u00e3o transmitidas pelo fluxo TAP \u00e0 medida que ocorrem (tecnicamente, elas s\u00e3o enfileiradas, mas, de qualquer forma, isso acontece muito r\u00e1pido). As muta\u00e7\u00f5es nos dados que ainda n\u00e3o foram enviados s\u00e3o aplicadas somente ao vbucket de origem e ser\u00e3o coletadas quando esse documento espec\u00edfico for transmitido.<\/p>\n<p>Depois que todos os dados tiverem sido copiados e sincronizados, a transi\u00e7\u00e3o acontece. Tecnicamente, seria poss\u00edvel transmitir as altera\u00e7\u00f5es t\u00e3o rapidamente para um vbucket que ele nunca conseguiria recuperar o atraso e fazer a troca. Na pr\u00e1tica, isso nunca acontece. Qualquer pequeno atraso no lado do cliente entre as solicita\u00e7\u00f5es \u00e9 suficiente para que os \u00faltimos bits sejam transmitidos, e seria extremamente raro que a comunica\u00e7\u00e3o entre n\u00f3s fosse drasticamente mais lenta do que a comunica\u00e7\u00e3o entre cliente e servidor.<\/p>\n<h3>Conex\u00f5es TAP no n\u00f3 de destino<\/h3>\n<p>Em geral, a extremidade receptora de uma conex\u00e3o TAP n\u00e3o \u00e9 tratada de forma muito diferente de um cliente comum que coloca dados no vbucket espec\u00edfico desse n\u00f3. H\u00e1 algumas exce\u00e7\u00f5es:<\/p>\n<ul>\n<li>O vbucket no lado do destino est\u00e1 no estado \"pendente\". Isso significa que os dados contidos nele n\u00e3o s\u00e3o acess\u00edveis a nada al\u00e9m do fluxo TAP que envia tr\u00e1fego para o vbucket.<\/li>\n<li>Os dados n\u00e3o s\u00e3o replicados. Tradicionalmente, colocar dados em um vbucket faria com que eles fossem replicados para a r\u00e9plica desse vbucket. Isso n\u00e3o acontece com os vbuckets pendentes.<\/li>\n<li>Backoffs do TAP (este \u00e9 importante): Para evitar que um n\u00f3 de origem r\u00e1pido sobrecarregue um n\u00f3 de destino mais lento, h\u00e1 uma parte especial do protocolo TAP chamada \"backoffs\". Isso permite que o destino informe ao remetente \"PARE! ESPERE! Preciso de mais tempo...\". Quando o remetente recebe essa mensagem, ele recua e tenta novamente a solicita\u00e7\u00e3o ap\u00f3s um breve per\u00edodo de tempo. Atualmente, esses retrocessos s\u00e3o acionados quando a fila de grava\u00e7\u00e3o em disco no destino atinge 1 milh\u00e3o de itens. Isso \u00e9 medido em todos os vbuckets desse n\u00f3 e pode ser uma combina\u00e7\u00e3o do tr\u00e1fego de aplicativos e do tr\u00e1fego de rebalanceamento. H\u00e1 mais discuss\u00f5es abaixo sobre como monitorar isso.<\/li>\n<\/ul>\n<p>Parab\u00e9ns, agora voc\u00ea \u00e9 um rebalanceador de n\u00edvel 4! Sei que foi uma viagem vertiginosa, mas obrigado por ter me acompanhado.<\/p>\n<h2>Replica\u00e7\u00e3o e rebalanceamento<\/h2>\n<p>N\u00e3o h\u00e1 muito o que dizer aqui, mas n\u00e3o quis deix\u00e1-lo completamente de fora. Cada vbucket \u00e9 replicado 1, 2 ou 3 vezes em seus vbuckets de \"r\u00e9plica\". Durante um rebalanceamento, esses vbuckets de r\u00e9plica tamb\u00e9m s\u00e3o movidos para garantir um cluster equilibrado e s\u00e3o criados se ainda n\u00e3o existirem. Por exemplo, um \u00fanico n\u00f3 n\u00e3o tem nenhuma r\u00e9plica. Quando voc\u00ea adiciona o segundo n\u00f3, essas r\u00e9plicas s\u00e3o criadas. Se sua contagem de r\u00e9plicas for maior que 1, a adi\u00e7\u00e3o de mais n\u00f3s far\u00e1 com que sejam criadas ainda mais r\u00e9plicas. \u00c9 importante estar ciente disso, pois h\u00e1 uma multiplica\u00e7\u00e3o de dados sendo movidos quando v\u00e1rias r\u00e9plicas est\u00e3o envolvidas.<\/p>\n<p>H\u00e1 alguns truques especiais empregados durante um rebalanceamento para que n\u00e3o seja necess\u00e1rio mover um vbucket ativo e sua r\u00e9plica. Se o algoritmo determinar, o software \u00e9 capaz de alternar um vbucket ativo e uma r\u00e9plica \"no lugar\" e, em seguida, mover apenas a r\u00e9plica.<\/p>\n<p>Por fim (pelo menos para este t\u00f3pico), todo o processo de rebalanceamento n\u00e3o \u00e9 conclu\u00eddo at\u00e9 que as r\u00e9plicas tenham sido suficientemente \"alcan\u00e7adas\" por seus vbuckets ativos, o que tamb\u00e9m pode aumentar o tempo necess\u00e1rio para um rebalanceamento. Essa \u00e9 uma evolu\u00e7\u00e3o da implementa\u00e7\u00e3o original, que se preocupava apenas com os vbuckets ativos. Isso causava dois problemas. Um deles \u00e9 que o rebalanceamento era \"feito\" antes que o cluster estivesse realmente seguro. Em segundo lugar, havia uma carga imensa colocada em todo o cluster quando o rebalanceamento terminava para reinstanciar as r\u00e9plicas. A vers\u00e3o atual (1.7.1) alterou esse comportamento para corresponder ao que descrevi anteriormente neste par\u00e1grafo.<\/p>\n<h2>Clientes Moxi e Smart durante um rebalanceamento<\/h2>\n<p>Embora este n\u00e3o seja o lugar para uma descri\u00e7\u00e3o completa do funcionamento interno, voc\u00ea deve entender as ideias b\u00e1sicas de todos os clientes inteligentes e do Moxi.<\/p>\n<p>Quando um cliente ou Moxi \u00e9 iniciado, ele se conecta ao URL de qualquer n\u00f3 do Membase (via porta 8091 usando HTTP). Ele se autentica, se necess\u00e1rio (apenas n\u00e3o \u00e9 necess\u00e1rio para o bucket padr\u00e3o) e recebe um mapa de vbucket. Isso \u00e9 o que se chama de \"conex\u00e3o de fluxo cont\u00ednuo\" ou \"fluxo de cometa\" e a conex\u00e3o HTTP permanece aberta (assim como a conex\u00e3o TCP, acredito). Esse \u00e9 o fim da comunica\u00e7\u00e3o quando tudo est\u00e1 est\u00e1vel.<\/p>\n<p>Se o cliente sair ou reiniciar, ele passar\u00e1 por esse processo novamente. Se a conex\u00e3o for fechada, ele tamb\u00e9m tentar\u00e1 se reconectar. Se o n\u00f3 com o qual estava falando pela primeira vez n\u00e3o responder, ele ir\u00e1 para o pr\u00f3ximo da lista (supondo que voc\u00ea tenha fornecido uma lista... a pr\u00e1tica recomendada aqui). Ele faz um rod\u00edzio at\u00e9 obter uma resposta e, em seguida, permanece conectado. Observe que ele n\u00e3o faz conex\u00f5es com todos os n\u00f3s de sua lista, apenas com um de cada vez.<\/p>\n<p>Agora, durante um rebalanceamento, h\u00e1 algumas nuances. Por defini\u00e7\u00e3o, cada movimento do vbucket \u00e9 comunicado de volta ao cliente por meio dessa conex\u00e3o. Na realidade, n\u00e3o \u00e9 bem assim. As vers\u00f5es anteriores esperavam at\u00e9 o final do rebalanceamento para enviar uma nova lista. Agora, a lista atualizada \u00e9 enviada antes de fazermos o rebalanceamento (chamado de \"mapa de avan\u00e7o r\u00e1pido\") e cabe ao cliente \"descobrir\" \u00e0 medida que o processo avan\u00e7a (mais sobre isso adiante).<\/p>\n<p>Quando um cliente (ou o Moxi) est\u00e1 enviando solicita\u00e7\u00f5es ao cluster, ele pega a chave e a compara com a lista de vbuckets. Em seguida, ele examina o mapa que possui para determinar qual servidor est\u00e1 ativo para aquele vbucket. Se o mapa estiver correto, o servidor aceitar\u00e1 a solicita\u00e7\u00e3o (seja ela qual for, todas as opera\u00e7\u00f5es t\u00eam uma chave e um ID de vbucket). Se o ID do vbucket que o cliente\/Moxi est\u00e1 enviando para um servidor n\u00e3o estiver ativo nesse servidor, ele responder\u00e1 com um erro dizendo \"n\u00e3o \u00e9 meu vbucket\". Durante um rebalanceamento, se um cliente\/Moxi n\u00e3o for atualizado a tempo, tiver algumas solicita\u00e7\u00f5es \"em voo\" ou, de alguma forma, simplesmente perder o memorando, o n\u00f3 antigo responder\u00e1 com um erro \"not my vbucket\" a todas as solicita\u00e7\u00f5es ap\u00f3s esse ponto no tempo.<\/p>\n<p>Embora tecnicamente seja um erro, essa mensagem \u00e9, na verdade, apenas um sinal para o cliente\/Moxi de que ele precisa encontrar o local correto para essa solicita\u00e7\u00e3o e retransmiti-la. Isso serve para garantir que nunca haja clientes acessando os mesmos documentos em mais de um local. No n\u00edvel mais baixo, isso \u00e9 apenas um erro dizendo que a solicita\u00e7\u00e3o n\u00e3o era adequada para esse servidor. Em um n\u00edvel mais alto da pilha, cabe ao cliente\/Moxi entender que isso significa que ele precisa encontrar o local correto.<\/p>\n<p>\u00c9 nesse ponto que as coisas come\u00e7am a divergir um pouco em cada implementa\u00e7\u00e3o. Por exemplo, o Moxi originalmente tentava por for\u00e7a bruta todos os servidores do cluster. Se nenhum respondesse, ele enviava esse erro para o cliente (memcached legado), que n\u00e3o tinha ideia do que fazer com ele. Agora, lidamos com isso muito melhor e a implementa\u00e7\u00e3o atual \u00e9 fazer com que o Moxi consulte o novo mapa de \"avan\u00e7o r\u00e1pido\" que recebeu no in\u00edcio do rebalanceamento. A ideia b\u00e1sica \u00e9 fazer com que os clientes inteligentes sigam a mesma l\u00f3gica, sendo que cada implementa\u00e7\u00e3o \u00e9 ligeiramente diferente.<\/p>\n<p>Em geral, h\u00e1 muito pouco tr\u00e1fego nesse \"canal de gerenciamento\" para clientes\/Moxi. Na verdade, somente quando um cliente se conecta ou durante um rebalanceamento e, mesmo assim, o volume de tr\u00e1fego \u00e9 muito baixo.<\/p>\n<p>A(s) seguinte(s) pergunta(s) surgiu(ram) recentemente, ent\u00e3o pensei em abord\u00e1-la(s) aqui:<\/p>\n<p>\"Ol\u00e1 Perry, tenho um usu\u00e1rio que tem o que ele descreve como uma rede inst\u00e1vel, seja por causa de conjuntos de regras de firewall ou conectividade, e ele queria saber o que acontece durante um rebalanceamento quando o mapa do vbucket \u00e9 atualizado, mas o computador do cliente n\u00e3o est\u00e1 dispon\u00edvel? Vejo que o cluster envia coisas como essa para o cliente por meio do 8091 e do HTTP, mas ele mant\u00e9m uma conex\u00e3o persistente ou o cluster s\u00f3 se conecta ao cliente quando h\u00e1 uma atualiza\u00e7\u00e3o que ele precisa conhecer?<\/p>\n<p>Eles est\u00e3o preocupados com o fato de que, ap\u00f3s um rebalanceamento, o cliente pode ter um mapa obsoleto e querem saber mais detalhes sobre como isso \u00e9 tratado.\"<\/p>\n<p>E minha resposta detalhou esses dois pontos:<\/p>\n<ul>\n<li>A conex\u00e3o \u00e9 mantida sempre aberta. O(s) cliente(s) sempre se conecta(m) ao cluster, e n\u00e3o o contr\u00e1rio... o cluster enviar\u00e1 um novo mapa sobre as conex\u00f5es existentes.<\/li>\n<li>Um cliente que perder sua conex\u00e3o com o cluster tentar\u00e1 restabelec\u00ea-la (configur\u00e1vel). Sempre que ele se reconectar (pela primeira vez ou n\u00e3o), receber\u00e1 o mapa mais recente que o cluster tiver. Ironicamente, uma rede inst\u00e1vel, em teoria, pode ajudar a manter o mapa constantemente atualizado durante um rebalanceamento, mas isso \u00e9 assunto para outra discuss\u00e3o.<\/li>\n<\/ul>\n<h2>Resumindo<\/h2>\n<p>Se voc\u00ea chegou at\u00e9 aqui, n\u00e3o s\u00f3 sabe o que \u00e9 rebalanceamento, mas tamb\u00e9m sabe como ele funciona. Isso deve ajudar imensamente quando voc\u00ea aumentar seu cluster para que entenda melhor o que est\u00e1 acontecendo nos bastidores, tanto em seus servidores quanto em seus clientes.<\/p>\n<p>O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/rebalancing-couchbase-part-ii\/\">segunda parte<\/a> analisa como monitorar seu cluster e o progresso do rebalanceamento, como lidar com falhas e como o desempenho do cluster pode ser afetado (e atenuado) durante o processo de rebalanceamento.<\/p>","protected":false},"excerpt":{"rendered":"<p>This is the first of two blog posts getting into some of the nitty gritty details of Couchbase&#8217;s rebalancing technology. This first one details the rebalance functionality itself, and the second\u00a0discusses how to monitor and work with it. A Practitioner&#8217;s [&hellip;]<\/p>","protected":false},"author":24,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8969],"class_list":["post-1768","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rebalancing With Couchbase Part I - The Couchbase Blog<\/title>\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\/rebalancing-couchbase-part-i\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rebalancing With Couchbase Part I\" \/>\n<meta property=\"og:description\" content=\"This is the first of two blog posts getting into some of the nitty gritty details of Couchbase&#8217;s rebalancing technology. This first one details the rebalance functionality itself, and the second\u00a0discusses how to monitor and work with it. A Practitioner&#8217;s [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/rebalancing-couchbase-part-i\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T18:41:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-28T08:13:50+00:00\" \/>\n<meta name=\"author\" content=\"Perry Krug\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Perry Krug\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/\"},\"author\":{\"name\":\"Perry Krug\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/d75b855801e89467ae2cfe0caef39a15\"},\"headline\":\"Rebalancing With Couchbase Part I\",\"datePublished\":\"2014-12-16T18:41:44+00:00\",\"dateModified\":\"2023-06-28T08:13:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/\"},\"wordCount\":2819,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/\",\"name\":\"Rebalancing With Couchbase Part I - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T18:41:44+00:00\",\"dateModified\":\"2023-06-28T08:13:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rebalancing With Couchbase Part I\"}]},{\"@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\/d75b855801e89467ae2cfe0caef39a15\",\"name\":\"Perry Krug\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/07fdef12afbaed73ed2879a6d989ae12\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d526d9acbd39623c0a9c0443617ab51bc75b0d8118706229ff946cea1a223257?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d526d9acbd39623c0a9c0443617ab51bc75b0d8118706229ff946cea1a223257?s=96&d=mm&r=g\",\"caption\":\"Perry Krug\"},\"description\":\"Perry Krug is the Head of Developer Experience at Couchbase. He has been with Couchbase for over 13 years and has been working with high-performance caching and database systems for over 17.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/perry-krug\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rebalancing With Couchbase Part I - The Couchbase Blog","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\/rebalancing-couchbase-part-i\/","og_locale":"pt_BR","og_type":"article","og_title":"Rebalancing With Couchbase Part I","og_description":"This is the first of two blog posts getting into some of the nitty gritty details of Couchbase&#8217;s rebalancing technology. This first one details the rebalance functionality itself, and the second\u00a0discusses how to monitor and work with it. A Practitioner&#8217;s [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/rebalancing-couchbase-part-i\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T18:41:44+00:00","article_modified_time":"2023-06-28T08:13:50+00:00","author":"Perry Krug","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Perry Krug","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/"},"author":{"name":"Perry Krug","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/d75b855801e89467ae2cfe0caef39a15"},"headline":"Rebalancing With Couchbase Part I","datePublished":"2014-12-16T18:41:44+00:00","dateModified":"2023-06-28T08:13:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/"},"wordCount":2819,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/","url":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/","name":"Rebalancing With Couchbase Part I - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T18:41:44+00:00","dateModified":"2023-06-28T08:13:50+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/rebalancing-couchbase-part-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rebalancing With Couchbase Part I"}]},{"@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\/d75b855801e89467ae2cfe0caef39a15","name":"Perry Krug","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/07fdef12afbaed73ed2879a6d989ae12","url":"https:\/\/secure.gravatar.com\/avatar\/d526d9acbd39623c0a9c0443617ab51bc75b0d8118706229ff946cea1a223257?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d526d9acbd39623c0a9c0443617ab51bc75b0d8118706229ff946cea1a223257?s=96&d=mm&r=g","caption":"Perry Krug"},"description":"Perry Krug \u00e9 o chefe de experi\u00eancia do desenvolvedor na Couchbase. Ele est\u00e1 na Couchbase h\u00e1 mais de 13 anos e trabalha com sistemas de cache e banco de dados de alto desempenho h\u00e1 mais de 17 anos.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/perry-krug\/"}]}},"authors":[{"term_id":8969,"user_id":24,"is_guest":0,"slug":"perry-krug","display_name":"Perry Krug","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/d526d9acbd39623c0a9c0443617ab51bc75b0d8118706229ff946cea1a223257?s=96&d=mm&r=g","author_category":"","last_name":"Krug","first_name":"Perry","job_title":"","user_url":"","description":"Perry Krug \u00e9 arquiteto no escrit\u00f3rio do CTO e se concentra em solu\u00e7\u00f5es para clientes. Ele est\u00e1 no Couchbase h\u00e1 mais de 8 anos e trabalha com sistemas de cache e banco de dados de alto desempenho h\u00e1 mais de 12 anos."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1768","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\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1768"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1768\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1768"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}