{"id":1775,"date":"2014-12-16T18:33:01","date_gmt":"2014-12-16T18:33:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1775"},"modified":"2023-04-28T10:33:14","modified_gmt":"2023-04-28T17:33:14","slug":"scaling-memcached-vbuckets","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/scaling-memcached-vbuckets\/","title":{"rendered":"Dimensionamento do memcached com vbuckets"},"content":{"rendered":"<div id=\"post\">\n<p>Durante anos, as pessoas usaram o memcached para dimensionar sites grandes. Originalmente, era usado um algoritmo de hash de sele\u00e7\u00e3o de m\u00f3dulo simples. Na verdade, ele ainda \u00e9 bastante usado e \u00e9 muito f\u00e1cil de entender (embora seja demonstrado regularmente que algumas pessoas n\u00e3o o entendem de fato quando aplicado ao seu sistema completo). O algoritmo \u00e9 basicamente o seguinte:<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace\"><\/div>\n<div class=\"python geshifilter-python\" style=\"font-family: monospace\">servidores <span style=\"color: #66cc66\">=<\/span> <span style=\"color: black\">[<\/span><span style=\"color: #483d8b\">'server1:11211'<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #483d8b\">'server2:11211'<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #483d8b\">'server3:11211'<\/span><span style=\"color: black\">]<\/span><br \/>\nserver_for_key<span style=\"color: black\">(<\/span>chave<span style=\"color: black\">)<\/span> <span style=\"color: #66cc66\">=<\/span> servidores<span style=\"color: black\">[<\/span><span style=\"color: #008000\">hash<\/span><span style=\"color: black\">(<\/span>chave<span style=\"color: black\">)<\/span> Servidores %.<span style=\"color: black\">comprimento<\/span><span style=\"color: black\">]<\/span><\/div>\n<\/div>\n<p>Ou seja, com um algoritmo de hash, voc\u00ea faz o hash da chave, mapeia-a para uma posi\u00e7\u00e3o na lista de servidores e entra em contato com o servidor para obter essa chave. Isso \u00e9 <em>realmente<\/em> f\u00e1cil de entender, mas <a style=\"color: #0066cc\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/memcached-replacement\/\">leva a alguns problemas<\/a>.<\/p>\n<ol>\n<li>Alguns servidores t\u00eam maior capacidade do que outros.<\/li>\n<li>Os erros de cache disparam quando um servidor morre.<\/li>\n<li>Configura\u00e7\u00e3o fr\u00e1gil\/confusa (coisas quebradas podem parecer funcionar)<\/li>\n<\/ol>\n<p>Ignorando a pondera\u00e7\u00e3o (que basicamente pode ser \"resolvida\" adicionando o mesmo servidor v\u00e1rias vezes \u00e0 lista), o maior problema que voc\u00ea tem \u00e9 o que fazer quando um servidor morre ou voc\u00ea <a style=\"color: #0066cc\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/Concepts\/concept-dataStorage.html\">deseja adicionar um novo<\/a>ou at\u00e9 mesmo deseja <em>substituir<\/em> um.<\/p>\n<p>Em 2007, <a href=\"https:\/\/www.metabrew.com\/\"><u><span style=\"color: #0066cc\">Richard Jones<\/span><\/u><\/a> e a equipe do <a href=\"https:\/\/www.last.fm\/\"><u><span style=\"color: #0066cc\">last.fm<\/span><\/u><\/a> criou uma nova maneira de resolver alguns desses problemas, chamada <a href=\"https:\/\/www.audioscrobbler.net\/development\/ketama\/\"><u><span style=\"color: #0066cc\">ketama<\/span><\/u><\/a>. Essa era uma biblioteca e um m\u00e9todo para \"hashing consistente\", ou seja, uma maneira de reduzir bastante a probabilidade de fazer hashing em um servidor que n\u00e3o tem os dados que voc\u00ea procura quando a lista de servidores muda.<\/p>\n<p>\u00c9 um sistema incr\u00edvel, mas n\u00e3o estou aqui para escrever sobre ele, portanto n\u00e3o entrarei em detalhes. Ele ainda tem uma falha que o torna inadequado para projetos como <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/what-exactly-membase\/\">base de membrana<\/a>Se voc\u00ea n\u00e3o tiver uma resposta, o m\u00e9todo do m\u00f3dulo \u00e9 mais prov\u00e1vel: \u00e9 apenas probabilisticamente mais prov\u00e1vel que voc\u00ea chegue ao servidor com seus dados. Analisando de outra forma, \u00e9 quase garantido que voc\u00ea chegue ao servidor errado algumas vezes, mas com menos frequ\u00eancia do que o m\u00e9todo de m\u00f3dulo descrito acima.<\/p>\n<h3>Uma nova esperan\u00e7a<\/h3>\n<p>No in\u00edcio de 2006, Anatoly Vorobey apresentou <a href=\"https:\/\/github.com\/memcached\/memcached\/commit\/7a308025661a49a5e19f98d2c5b8df04d96b4642\"><u><span style=\"color: #0066cc\">algum c\u00f3digo<\/span><\/u><\/a> para criar algo a que ele se referia como \"buckets gerenciados\". Esse c\u00f3digo permaneceu l\u00e1 at\u00e9 o final de 2008. <a href=\"https:\/\/github.com\/memcached\/memcached\/commit\/04319dddabaa06d15407ab6f793b160d3b1c5edb\"><u><span style=\"color: #0066cc\">Ele foi removido<\/span><\/u><\/a> porque ele nunca foi totalmente completo, nem compreendido, e n\u00f3s criamos um protocolo mais novo que facilitou a cria\u00e7\u00e3o dessas coisas.<\/p>\n<p>Estamos trazendo isso de volta, e eu vou lhe dizer por que ele existe e por que voc\u00ea o quer.<\/p>\n<p>Primeiro, um breve resumo do que quer\u00edamos realizar:<\/p>\n<ol>\n<li>Nunca atenda a uma solicita\u00e7\u00e3o no servidor errado.<\/li>\n<li>Permitir o aumento de escala <em>e<\/em> para baixo \u00e0 vontade.<\/li>\n<li>Os servidores recusam comandos que n\u00e3o devem atender, <em>mas<\/em><\/li>\n<li>Os servidores ainda n\u00e3o sabem uns sobre os outros.<\/li>\n<li>Podemos transferir conjuntos de dados de um servidor para outro atomicamente, <em>mas<\/em><\/li>\n<li>N\u00e3o h\u00e1 restri\u00e7\u00f5es temporais.<\/li>\n<li>A consist\u00eancia \u00e9 garantida.<\/li>\n<li>Absolutamente nenhuma sobrecarga de rede \u00e9 introduzida no caso normal.<\/li>\n<\/ol>\n<p>Para expandir um pouco o \u00faltimo ponto em rela\u00e7\u00e3o a outras solu\u00e7\u00f5es que examinamos, n\u00e3o h\u00e1 proxies, servi\u00e7os de localiza\u00e7\u00e3o, conhecimento de servidor para servidor ou qualquer outra coisa m\u00e1gica que exija sobrecarga. Uma solicita\u00e7\u00e3o com reconhecimento do vbucket n\u00e3o requer mais opera\u00e7\u00f5es de rede para encontrar os dados do que para executar a opera\u00e7\u00e3o nos dados (n\u00e3o \u00e9 nem mesmo um byte maior).<\/p>\n<p>H\u00e1 outros objetivos menores, como \"voc\u00ea deve ser capaz de adicionar servidores quando estiver sob carga de pico\", mas eles s\u00e3o descartados gratuitamente.<\/p>\n<h3>Apresentando: O VBucket<\/h3>\n<p>Um vbucket \u00e9 conceitualmente um subconjunto computado de todas as chaves poss\u00edveis.<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8866 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/vbucket.png\" alt=\"vbucket visualized\" width=\"234\" height=\"286\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/vbucket.png 234w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/vbucket-16x20.png 16w\" sizes=\"auto, (max-width: 234px) 100vw, 234px\" \/><\/div>\n<p>Se voc\u00ea j\u00e1 implementou uma tabela de hash, pode pensar nela como um balde de tabela de hash virtual que \u00e9 o primeiro n\u00edvel de hash para todas as pesquisas de n\u00f3s. Em vez de mapear as chaves diretamente para os servidores, mapeamos os vbuckets para os servidores de forma est\u00e1tica e temos um c\u00e1lculo consistente de chave \u2192 vbucket.<\/p>\n<p>O n\u00famero de vbuckets em um cluster permanece constante, independentemente da topologia do servidor. Isso significa que a chave <code>x<\/code> sempre mapeia para o mesmo vbucket com o mesmo hash.<\/p>\n<p>As configura\u00e7\u00f5es de cliente precisam crescer um pouco para esse conceito. Em vez de ser uma sequ\u00eancia simples de servidores, a configura\u00e7\u00e3o agora tamb\u00e9m tem o mapeamento expl\u00edcito do vbucket para o servidor.<\/p>\n<p>Na pr\u00e1tica, modelamos a configura\u00e7\u00e3o como uma sequ\u00eancia de servidores, fun\u00e7\u00e3o hash e mapa de vbuckets. Considerando tr\u00eas servidores e seis vbuckets (um n\u00famero muito pequeno para ilustra\u00e7\u00e3o), um exemplo de como isso funciona em rela\u00e7\u00e3o ao c\u00f3digo de m\u00f3dulo acima seria o seguinte:<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace\">servidores <span style=\"color: #66cc66\">=<\/span> <span style=\"color: black\">[<\/span><span style=\"color: #483d8b\">'server1:11211'<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #483d8b\">'server2:11211'<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #483d8b\">'server3:11211'<\/span><span style=\"color: black\">]<\/span><br \/>\nvbuckets <span style=\"color: #66cc66\">=<\/span> <span style=\"color: black\">[<\/span><span style=\"color: #ff4500\">0<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #ff4500\">0<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #ff4500\">1<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #ff4500\">1<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #ff4500\">2<\/span><span style=\"color: #66cc66\">,<\/span> <span style=\"color: #ff4500\">2<\/span><span style=\"color: black\">]<\/span><br \/>\nserver_for_key<span style=\"color: black\">(<\/span>chave<span style=\"color: black\">)<\/span> <span style=\"color: #66cc66\">=<\/span> servidores<span style=\"color: black\">[<\/span>vbuckets<span style=\"color: black\">[<\/span><span style=\"color: #008000\">hash<\/span><span style=\"color: black\">(<\/span>chave<span style=\"color: black\">)<\/span> % vbuckets.<span style=\"color: black\">comprimento<\/span><span style=\"color: black\">]<\/span><span style=\"color: black\">]<\/span><\/div>\n<\/div>\n<p>Ao ler esse c\u00f3digo, deve ser \u00f3bvio como a introdu\u00e7\u00e3o dos vbuckets proporciona um enorme poder e flexibilidade, mas vou continuar, caso n\u00e3o seja.<\/p>\n<h3>Terminologia<\/h3>\n<p>Antes de entrarmos em muitos detalhes, vamos dar uma olhada na terminologia que ser\u00e1 usada aqui.<\/p>\n<dl>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">Cluster:<\/dt>\n<dd>\u00a0Uma cole\u00e7\u00e3o de servidores colaboradores.<\/dd>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">Servidor:<\/dt>\n<dd>\u00a0Uma m\u00e1quina individual em um cluster.<\/dd>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">vbucket:<\/dt>\n<dd>\u00a0Um subconjunto de todas as chaves poss\u00edveis.<\/dd>\n<\/dl>\n<p>Al\u00e9m disso, um determinado vbucket estar\u00e1 em um dos seguintes estados em um determinado servidor:<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8867 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/states.png\" alt=\"VBucket States\" width=\"294\" height=\"184\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/states.png 294w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/states-20x13.png 20w\" sizes=\"auto, (max-width: 294px) 100vw, 294px\" \/><\/div>\n<dl>\n<dt><\/dt>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">Ativo:<\/dt>\n<dd>\u00a0Esse servidor est\u00e1 atendendo a todas as solicita\u00e7\u00f5es para esse vbucket.<\/dd>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">Morto:<\/dt>\n<dd>\u00a0Este servidor n\u00e3o \u00e9 de forma alguma respons\u00e1vel por este vbucket<\/dd>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">R\u00e9plica:<\/dt>\n<dd>Nenhuma solicita\u00e7\u00e3o de cliente \u00e9 tratada para esse vbucket, mas ele pode receber comandos de replica\u00e7\u00e3o.<\/dd>\n<dt style=\"float: left;clear: left;width: 100px;text-align: right;font-weight: bold\">Pendente:<\/dt>\n<dd>\u00a0Esse servidor bloquear\u00e1 todas as solicita\u00e7\u00f5es para esse vbucket.<\/dd>\n<\/dl>\n<h3>Opera\u00e7\u00f5es do cliente<\/h3>\n<p>Cada solicita\u00e7\u00e3o deve incluir o ID do vbucket conforme calculado pelo algoritmo de hash. Usamos os campos reservados no protocolo bin\u00e1rio, permitindo a cria\u00e7\u00e3o de at\u00e9 65.536 vbuckets (o que \u00e9 realmente muito).<\/p>\n<p>Como tudo o que \u00e9 necess\u00e1rio para escolher consistentemente o vbucket correto \u00e9 que os clientes concordem com o algoritmo de hash e o n\u00famero de vbuckets, \u00e9 muito mais dif\u00edcil configurar incorretamente um servidor de modo que voc\u00ea esteja se comunicando com o servidor errado para um determinado vbucket.<\/p>\n<p>Al\u00e9m disso, com a libvbucket, tornamos a distribui\u00e7\u00e3o de configura\u00e7\u00f5es e a distribui\u00e7\u00e3o de configura\u00e7\u00f5es, a concord\u00e2ncia com algoritmos de mapeamento e a rea\u00e7\u00e3o a configura\u00e7\u00f5es incorretas um problema que n\u00e3o precisa ser resolvido repetidamente. O trabalho est\u00e1 em andamento para obter portas do libvbucket para java e .net e, enquanto isso, o moxi realizar\u00e1 todas as tradu\u00e7\u00f5es para voc\u00ea se tiver clientes n\u00e3o persistentes ou n\u00e3o puder esperar que seu cliente favorito se atualize.<\/p>\n<h3>Um servidor ativo<\/h3>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8868 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/oneserver.png\" alt=\"One server, six vbuckets\" width=\"172\" height=\"144\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/oneserver.png 172w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/oneserver-20x17.png 20w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/h3>\n<p>Embora as implanta\u00e7\u00f5es normalmente tenham 1.024 ou 4.096 vbuckets, continuaremos com este modelo com seis, porque \u00e9 muito mais f\u00e1cil de pensar e desenhar.<\/p>\n<p>Na imagem \u00e0 direita, h\u00e1 um servidor em execu\u00e7\u00e3o com seis buckets ativos. Todas as solicita\u00e7\u00f5es com todos os vbuckets poss\u00edveis v\u00e3o para esse servidor, e ele responde a todas elas.<\/p>\n<h3>Um servidor ativo, um novo servidor<\/h3>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8869 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/one-quiesc.png\" alt=\"One active server, one quiescent server\" width=\"172\" height=\"284\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/one-quiesc.png 172w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/one-quiesc-12x20.png 12w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/div>\n<p>Agora vamos adicionar um novo servidor. Aqui est\u00e1 a primeira parte da m\u00e1gica: a adi\u00e7\u00e3o de um servidor n\u00e3o desestabiliza a \u00e1rvore (como visto \u00e0 direita).<\/p>\n<p>Adicionar um servidor ao cluster, e at\u00e9 mesmo envi\u00e1-lo na configura\u00e7\u00e3o para todos os clientes, n\u00e3o significa que ele ser\u00e1 usado imediatamente. O mapeamento \u00e9 um conceito separado, e todos os vbuckets ainda s\u00e3o mapeados exclusivamente para o servidor antigo.<\/p>\n<p>Para tornar esse servidor \u00fatil, transferiremos vbuckets de um servidor para outro. Para efetuar uma transfer\u00eancia, voc\u00ea seleciona um conjunto de vbuckets que deseja que o novo servidor possua e define todos eles para o estado pendente no servidor receptor. Em seguida, come\u00e7amos a extrair os dados e coloc\u00e1-los no novo servidor.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"floatleft alignleft wp-image-8870 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/transfer.gif\" alt=\"Transfering vbuckets from one server to two\" width=\"340\" height=\"178\" \/>Ao executar as etapas nessa ordem exata, \u00e9 poss\u00edvel garantir que n\u00e3o haja mais de um servidor ativo para um determinado vbucket em um determinado momento <em>sem<\/em> sem levar em conta a cronologia real. Ou seja, voc\u00ea pode ter horas de inclina\u00e7\u00e3o do rel\u00f3gio e transfer\u00eancias de vbucket que levam v\u00e1rios minutos e nunca deixar de ser consistente. Tamb\u00e9m \u00e9 garantido que os clientes nunca receber\u00e3o <em>incorreto<\/em> respostas.<\/p>\n<p>&nbsp;<\/p>\n<div><a href=\"https:\/\/dustin.sallings.org\/images\/vbucket\/flow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8871 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/flow.png\" alt=\"flow and what-not\" width=\"401\" height=\"486\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/flow.png 401w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/flow-248x300.png 248w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/flow-300x364.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/flow-17x20.png 17w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><\/a><\/div>\n<ol>\n<li>O vbucket no novo servidor \u00e9 colocado em um estado pendente.<\/li>\n<li>Uma extra\u00e7\u00e3o do vbucket <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/want-know-what-your-memcached-servers-are-doing-tap-them\/\"><u><span style=\"color: #0066cc\">toque<\/span><\/u><\/a> \u00e9 iniciado.<\/li>\n<li>O fluxo de taps do vbucket define atomicamente o estado como morto quando a fila est\u00e1 em um estado de drenagem suficiente.<\/li>\n<li>O novo servidor s\u00f3 passa de pendente para ativo depois de receber a confirma\u00e7\u00e3o de que o servidor antigo n\u00e3o est\u00e1 mais atendendo \u00e0s solicita\u00e7\u00f5es. Como as subse\u00e7\u00f5es est\u00e3o sendo transferidas de forma independente, voc\u00ea n\u00e3o precisa mais se limitar a pensar em um servidor sendo transferido de cada vez, mas em uma pequena fra\u00e7\u00e3o de um servidor sendo transferido de cada vez. Isso permite que voc\u00ea comece a migrar lentamente o tr\u00e1fego de servidores ocupados <em>no pico<\/em> para servidores menos ocupados com um impacto m\u00ednimo (com 4.096 vbuckets em 10 servidores, cada um com 10 milh\u00f5es de chaves, voc\u00ea estaria movendo cerca de 20 mil chaves por vez com uma transfer\u00eancia de vbucket ao ativar o d\u00e9cimo primeiro servidor).<\/li>\n<\/ol>\n<p>Voc\u00ea pode notar que h\u00e1 um per\u00edodo de tempo em que um vbucket tem <em>n\u00e3o<\/em> servidor ativo. Isso ocorre no final do mecanismo de transfer\u00eancia e causa o bloqueio. Em geral, deve ser raro observar um cliente realmente bloqueado na natureza. Isso s\u00f3 acontece quando um cliente recebe um erro do servidor antigo indicando que ele terminou de preparar a transfer\u00eancia e pode chegar ao novo servidor antes que o novo servidor receba o \u00faltimo item. Ent\u00e3o, o novo servidor s\u00f3 bloqueia o cliente at\u00e9 que esse item seja entregue e o vbucket possa fazer a transi\u00e7\u00e3o de <code>pendente<\/code> para <code>ativo<\/code> Estado.<\/p>\n<p>Embora o vbucket no servidor antigo v\u00e1 automaticamente para o <code>morto<\/code> Quando o estado est\u00e1 suficientemente avan\u00e7ado, ele <em>n\u00e3o<\/em> excluir dados automaticamente. Isso \u00e9 feito explicitamente <em>ap\u00f3s<\/em> confirma\u00e7\u00e3o de que o novo n\u00f3 foi ativado <code>ativo<\/code>. Se o n\u00f3 de destino falhar em qualquer ponto antes de definirmos <code>ativo<\/code>Se o servidor antigo n\u00e3o for usado, podemos simplesmente abortar a transfer\u00eancia e deixar o servidor antigo <code>ativo<\/code> (ou definir de volta para <code>ativo<\/code> se estiv\u00e9ssemos suficientemente adiantados).<\/p>\n<h3>O que est\u00e1 acontecendo com a r\u00e9plica do Estado?<\/h3>\n<p>A HA \u00e9 muito mencionada, por isso fizemos quest\u00e3o de abord\u00e1-la. A <code>r\u00e9plica<\/code> O vbucket \u00e9 semelhante a um <code>morto<\/code> O vbucket \u00e9 assim do ponto de vista de um cliente normal. Ou seja, todas as solicita\u00e7\u00f5es s\u00e3o recusadas, mas os comandos de replica\u00e7\u00e3o s\u00e3o permitidos. Isso tamb\u00e9m \u00e9 semelhante ao <code>pendente<\/code> no sentido de que os registros s\u00e3o armazenados, mas contrastam no sentido de que os clientes n\u00e3o bloqueiam.<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"floatright alignright wp-image-8872 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/replica1.png\" alt=\"One replica with three servers\" width=\"272\" height=\"318\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica1.png 272w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica1-257x300.png 257w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica1-17x20.png 17w\" sizes=\"auto, (max-width: 272px) 100vw, 272px\" \/><\/div>\n<p>Considere a imagem \u00e0 direita, onde temos tr\u00eas servidores, seis vbuckets e uma \u00fanica r\u00e9plica por vbucket.<\/p>\n<p>Assim como os mestres, cada r\u00e9plica tamb\u00e9m \u00e9 mapeada estaticamente, de modo que pode ser movida a qualquer momento.<\/p>\n<p>Neste exemplo, replicamos o vbucket para o \"pr\u00f3ximo\" servidor da lista, ou seja, um <code>ativo<\/code> vbucket em <code>S1<\/code> replica para um <code>r\u00e9plica<\/code> balde em <code>S2<\/code> - o mesmo para <code>S2<\/code>\u00a0\u2192\u00a0<code>S3<\/code> e <code>S3<\/code>\u00a0\u2192\u00a0<code>S1<\/code>.<\/p>\n<p><span style=\"color: #343e47;font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 40px\">V\u00e1rias r\u00e9plicas<\/span><\/p>\n<p>Tamb\u00e9m permitimos que as estrat\u00e9gias tenham mais de uma c\u00f3pia de seus dados dispon\u00edveis nos n\u00f3s.<\/p>\n<p>O diagrama abaixo mostra duas estrat\u00e9gias para que tr\u00eas servidores tenham uma r\u00e9plica ativa e duas r\u00e9plicas de cada bucket.<\/p>\n<h3>1:n Replica\u00e7\u00e3o<\/h3>\n<p>A primeira estrat\u00e9gia (<code>1:n<\/code>) refere-se a um mestre que atende a v\u00e1rios escravos ao mesmo tempo. O conceito aqui \u00e9 familiar para qualquer pessoa que tenha lidado com software de armazenamento de dados que permita v\u00e1rias r\u00e9plicas.<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8873 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/replica-many.png\" alt=\"Strategies for many-child replication\" width=\"558\" height=\"338\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica-many.png 558w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica-many-300x182.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/replica-many-20x12.png 20w\" sizes=\"auto, (max-width: 558px) 100vw, 558px\" \/><\/div>\n<h3>Replica\u00e7\u00e3o encadeada<\/h3>\n<p>A segunda estrat\u00e9gia (<code>acorrentado<\/code>) refere-se a um \u00fanico mestre que atende a apenas um \u00fanico escravo, mas esse escravo tem um outro escravo downstream pr\u00f3prio. Isso oferece a vantagem de ter um \u00fanico fluxo de eventos de muta\u00e7\u00e3o saindo de um servidor e, ao mesmo tempo, manter duas c\u00f3pias de todos os registros. Isso tem a desvantagem de compor a lat\u00eancia de replica\u00e7\u00e3o \u00e0 medida que voc\u00ea percorre a cadeia.<\/p>\n<p>\u00c9 claro que, com mais de duas c\u00f3pias adicionais, voc\u00ea pode mistur\u00e1-las de modo a fazer um \u00fanico fluxo a partir do mestre e, em seguida, fazer com que o segundo elo da cadeia fa\u00e7a um <code>1:n<\/code> para outros dois servidores.<\/p>\n<p>Tudo depende de como voc\u00ea mapeia as coisas.<\/p>\n<h3>Agradecimentos<\/h3>\n<p>Agradecimentos a <a href=\"https:\/\/www.dormando.me\/\"><u><span style=\"color: #0066cc\">Dormir<\/span><\/u><\/a> por ajudar a decifrar o c\u00f3digo, a inten\u00e7\u00e3o e os fluxos de trabalho originais do \"balde gerenciado\", e <a href=\"https:\/\/github.com\/jayesh\"><u><span style=\"color: #0066cc\">Jayesh Jose<\/span><\/u><\/a> e aos outros funcion\u00e1rios da Zynga por terem descoberto isso de forma independente e trabalhado em v\u00e1rios casos de uso.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>For years, people have used memcached to scale large sites. Originally, there was a simple modulo selection hash algorithm that was used. It still is used quite a bit actually and it\u2019s quite easy to understand (although, it\u2019s shown regularly [&hellip;]<\/p>","protected":false},"author":34,"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":[8992],"class_list":["post-1775","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.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Scaling memcached with vbuckets - 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\/scaling-memcached-vbuckets\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scaling memcached with vbuckets\" \/>\n<meta property=\"og:description\" content=\"For years, people have used memcached to scale large sites. Originally, there was a simple modulo selection hash algorithm that was used. It still is used quite a bit actually and it\u2019s quite easy to understand (although, it\u2019s shown regularly [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/scaling-memcached-vbuckets\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T18:33:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-28T17:33:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/vbucket.png\" \/>\n<meta name=\"author\" content=\"Dustin Sallings, Chief Architect, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dustin Sallings, Chief Architect, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/\"},\"author\":{\"name\":\"Dustin Sallings, Chief Architect, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0\"},\"headline\":\"Scaling memcached with vbuckets\",\"datePublished\":\"2014-12-16T18:33:00+00:00\",\"dateModified\":\"2023-04-28T17:33:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/\"},\"wordCount\":1954,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#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\/scaling-memcached-vbuckets\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/\",\"name\":\"Scaling memcached with vbuckets - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T18:33:00+00:00\",\"dateModified\":\"2023-04-28T17:33:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#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\/scaling-memcached-vbuckets\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scaling memcached with vbuckets\"}]},{\"@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\/e68b6f4489072ef4a84f60bc437c07d0\",\"name\":\"Dustin Sallings, Chief Architect, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/c5bddc8d7dab8b5c9121282556b0dbff\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g\",\"caption\":\"Dustin Sallings, Chief Architect, Couchbase\"},\"description\":\"Dustin Sallings is a Chief Architect at Couchbase. Dustin is an Author of spymemcached and core contributor to Couchbase and Memcached projects.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/dustin-sallings\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dimensionamento do memcached com vbuckets - 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\/scaling-memcached-vbuckets\/","og_locale":"pt_BR","og_type":"article","og_title":"Scaling memcached with vbuckets","og_description":"For years, people have used memcached to scale large sites. Originally, there was a simple modulo selection hash algorithm that was used. It still is used quite a bit actually and it\u2019s quite easy to understand (although, it\u2019s shown regularly [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/scaling-memcached-vbuckets\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T18:33:00+00:00","article_modified_time":"2023-04-28T17:33:14+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/vbucket.png","type":"","width":"","height":""}],"author":"Dustin Sallings, Chief Architect, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dustin Sallings, Chief Architect, Couchbase","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/"},"author":{"name":"Dustin Sallings, Chief Architect, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0"},"headline":"Scaling memcached with vbuckets","datePublished":"2014-12-16T18:33:00+00:00","dateModified":"2023-04-28T17:33:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/"},"wordCount":1954,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#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\/scaling-memcached-vbuckets\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/","url":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/","name":"Dimensionamento do memcached com vbuckets - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T18:33:00+00:00","dateModified":"2023-04-28T17:33:14+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/scaling-memcached-vbuckets\/#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\/scaling-memcached-vbuckets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Scaling memcached with vbuckets"}]},{"@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\/e68b6f4489072ef4a84f60bc437c07d0","name":"Dustin Sallings, arquiteto-chefe da Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/c5bddc8d7dab8b5c9121282556b0dbff","url":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","caption":"Dustin Sallings, Chief Architect, Couchbase"},"description":"Dustin Sallings is a Chief Architect at Couchbase. Dustin is an Author of spymemcached and core contributor to Couchbase and Memcached projects.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/dustin-sallings\/"}]}},"authors":[{"term_id":8992,"user_id":34,"is_guest":0,"slug":"dustin-sallings","display_name":"Dustin Sallings, Chief Architect, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","author_category":"","last_name":"Sallings","first_name":"Dustin","job_title":"","user_url":"","description":"Dustin Sallings \u00e9 arquiteto-chefe da Couchbase. Dustin \u00e9 autor do spymemcached e um dos principais colaboradores do Couchbase e do <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/developer\/dev-guide-3.0\/memcached.html#projects\">Projetos do Memcached.<\/a>"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1775","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\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1775"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1775\/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=1775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1775"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}