{"id":7272,"date":"2019-08-09T10:00:48","date_gmt":"2019-08-09T17:00:48","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7272"},"modified":"2024-09-12T02:30:29","modified_gmt":"2024-09-12T09:30:29","slug":"introduction-to-jepsen-testing-at-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/introduction-to-jepsen-testing-at-couchbase\/","title":{"rendered":"Introdu\u00e7\u00e3o ao teste de Jepsen no Couchbase"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Introdu\u00e7\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Como a maioria de voc\u00eas sabe, o Couchbase \u00e9 um banco de dados que oferece aos usu\u00e1rios uma variedade de op\u00e7\u00f5es de consist\u00eancia e toler\u00e2ncia a falhas para garantir que o estado dos dados atenda a determinados crit\u00e9rios ou garantias. Os usu\u00e1rios podem especificar n\u00edveis variados de replica\u00e7\u00e3o, persist\u00eancia, r\u00e9plicas, grupos de servidores etc. para garantir que seus dados sejam dur\u00e1veis, consistentes e corretos em determinados cen\u00e1rios de falha e opera\u00e7\u00f5es de cluster. Para a pr\u00f3xima vers\u00e3o 6.5.0, novos recursos aprimorados <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Durability_(database_systems)\"><span style=\"font-weight: 400;\">durabilidade<\/span><\/a><span style=\"font-weight: 400;\"> fornecer\u00e3o aos usu\u00e1rios ainda mais seguran\u00e7a e garantias em caso de falhas. Como reconhecemos que as garantias s\u00e3o t\u00e3o boas quanto suas provas, vamos dar uma olhada detalhada em como usamos o Jespen, um padr\u00e3o do setor, para testar a durabilidade do banco de dados no Couchbase.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7273\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/07\/client-register-diagram.png\" alt=\"\" width=\"960\" height=\"515\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram.png 960w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-300x161.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-768x412.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-20x11.png 20w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">A estrutura do Jepsen funciona disparando opera\u00e7\u00f5es de cliente em um cluster e, ao mesmo tempo, injetando algum tipo de caos, como parti\u00e7\u00f5es de rede, elimina\u00e7\u00e3o de processos, redu\u00e7\u00e3o da velocidade dos discos etc. Em seguida, o Jepsen analisar\u00e1 o hist\u00f3rico de opera\u00e7\u00f5es com verificadores de hist\u00f3rico de opera\u00e7\u00f5es incorporados ou personalizados. Mais notavelmente, o Jepsen vem com um <\/span><i><span style=\"font-weight: 400;\">consist\u00eancia lineariz\u00e1vel<\/span><\/i><span style=\"font-weight: 400;\"> verificador. O Couchbase, com os novos n\u00edveis de durabilidade aprimorados na vers\u00e3o 6.5.0, afirma ser apenas <\/span><i><span style=\"font-weight: 400;\">sequencialmente consistente<\/span><\/i><span style=\"font-weight: 400;\">. No entanto, a consist\u00eancia lineariz\u00e1vel implica consist\u00eancia sequencial [1]. Portanto, a aprova\u00e7\u00e3o no verificador de consist\u00eancia lineariz\u00e1vel tamb\u00e9m implica que o hist\u00f3rico de opera\u00e7\u00f5es \u00e9 de fato consistente em termos de sequ\u00eancia. No entanto, a reprova\u00e7\u00e3o na verifica\u00e7\u00e3o de consist\u00eancia lineariz\u00e1vel n\u00e3o implica que o hist\u00f3rico da opera\u00e7\u00e3o n\u00e3o seja consistente em termos de sequ\u00eancia. Para resumir, quando uma opera\u00e7\u00e3o passa no verificador de consist\u00eancia lineariz\u00e1vel, podemos presumir que o Couchbase \u00e9 consistente em termos de sequ\u00eancia. Se uma opera\u00e7\u00e3o falhar no verificador de consist\u00eancia lineariz\u00e1vel, o Couchbase ainda poder\u00e1 ser consistente em termos de sequ\u00eancia, mas ser\u00e1 necess\u00e1rio investigar mais para confirmar.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nosso objetivo com o Jepsen \u00e9 testar, de v\u00e1rios \u00e2ngulos diferentes, que nosso cliente Java SDK e o mecanismo KV do lado do servidor trabalhem em un\u00edssono para: 1.) Nunca perder grava\u00e7\u00f5es reconhecidas; e 2.) Fornecer, no m\u00ednimo, um modelo de consist\u00eancia sequencial enquanto opera\u00e7\u00f5es de cluster e falhas s\u00e3o aplicadas ao sistema.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Arquitetura<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">O Jepsen fornece interfaces para as seguintes abstra\u00e7\u00f5es: Banco de dados, Cliente, Verificador, Nemesis, Geradores e Carga de trabalho. Para criar um teste do Jepsen, tivemos que implementar todas essas abstra\u00e7\u00f5es especificamente para o Couchbase. Cada teste \u00e9 uma combina\u00e7\u00e3o dessas abstra\u00e7\u00f5es e de par\u00e2metros adicionais.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Banco de dados<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Implementamos a l\u00f3gica de configura\u00e7\u00e3o, desmontagem e coleta de registros para um cluster do Couchbase. Essa l\u00f3gica inclui suporte para configura\u00e7\u00f5es de bucket personalizadas, grupos de servidores e failover autom\u00e1tico. O suporte total para todas as configura\u00e7\u00f5es poss\u00edveis de bucket e cluster n\u00e3o faz muito sentido porque o n\u00famero de clusters poss\u00edveis tornar\u00e1 invi\u00e1vel o teste de todas as permuta\u00e7\u00f5es. No entanto, criamos suporte para todas as configura\u00e7\u00f5es e op\u00e7\u00f5es de cluster mais importantes.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Cliente<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Implementamos dois clientes diferentes: um cliente de \"registro\" e um cliente de \"conjunto\". O cliente de registro gravar\u00e1, ler\u00e1 e comparar\u00e1 e trocar\u00e1 valores de chaves independentes em um bucket do Couchbase. O cliente de conjunto apenas adiciona e exclui documentos de um bucket. Voc\u00ea pode pensar no bucket como o conjunto e o documento como um membro desse conjunto. Usamos esse cliente com um verificador de conjunto personalizado em vez do verificador de lineariza\u00e7\u00e3o, pois n\u00e3o estamos atualizando nenhum documento. Todos os testes que usam o cliente de conjunto e o verificador de conjunto funcionam tecendo fases de adi\u00e7\u00e3o de documentos a um compartimento ou de exclus\u00e3o de documentos de um compartimento.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ambos os clientes recebem opera\u00e7\u00f5es de um processo gerador. (Mais sobre isso adiante).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Deve-se tomar cuidado especial para tratar os erros do cliente. Por exemplo, uma DurabilityImpossibleException e uma RequestTimeoutException precisam ser tratadas de forma diferente pelo Jepsen. No primeiro caso, sabemos que a opera\u00e7\u00e3o falhou, mas no segundo, a opera\u00e7\u00e3o pode ter sido bem-sucedida. No caso de n\u00e3o conseguirmos distinguir se uma opera\u00e7\u00e3o falhou ou foi bem-sucedida, o verificador de lineariza\u00e7\u00e3o do Jepsen executar\u00e1 uma verifica\u00e7\u00e3o presumindo que a opera\u00e7\u00e3o falhou e novamente presumindo que a opera\u00e7\u00e3o foi bem-sucedida. O efeito disso \u00e9 praticamente dobrar o tempo de verifica\u00e7\u00e3o para cada opera\u00e7\u00e3o amb\u00edgua. Portanto, queremos cen\u00e1rios de teste que limitem o n\u00famero potencial de resultados de opera\u00e7\u00f5es desse tipo. O verificador de lineariza\u00e7\u00e3o ser\u00e1 aprovado se pelo menos um dos dois hist\u00f3ricos poss\u00edveis for lineariz\u00e1vel.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Verificador<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para nossos testes, temos tr\u00eas verificadores para escolher: verificador de lineariza\u00e7\u00e3o, verificador de conjunto e verificador de sanidade. O verificador de lineariza\u00e7\u00e3o vem com o Jepsen e \u00e9 usado para verificar a consist\u00eancia de chaves independentes em um bucket. Implementamos um verificador de conjunto para garantir que os testes com o cliente de conjunto tenham o conjunto correto de documentos em um intervalo. Por fim, implementamos um verificador de sanidade que garantir\u00e1 que o teste em si passou pela sequ\u00eancia de altera\u00e7\u00f5es de estado do cluster sem erros. Por exemplo, um teste pode envolver um rebalanceamento que falha quando n\u00e3o deveria. Nesse caso, o verificador de sanidade marcar\u00e1 o teste como \"desconhecido\" em vez de \"falho\", j\u00e1 que estamos denotando testes falhos como aqueles que falham no verificador de conjunto ou no verificador de lineariza\u00e7\u00e3o. O verificador de sanidade tamb\u00e9m garante que pelo menos algumas opera\u00e7\u00f5es foram bem-sucedidas.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">N\u00eamesis<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Tradicionalmente, no Jepsen, um n\u00eamesis \u00e9 um processo que receber\u00e1 opera\u00e7\u00f5es de um processo gerador e, em seguida, tomar\u00e1 medidas contra o sistema de acordo. Por exemplo, o n\u00eamesis de parti\u00e7\u00e3o incorporado pode receber uma opera\u00e7\u00e3o de bloqueio e restaura\u00e7\u00e3o que particionar\u00e1 a rede e restaurar\u00e1 a rede entre dois n\u00f3s. A maioria dos nemeses incorporados \u00e9 suficiente para cen\u00e1rios muito b\u00e1sicos, mas quer\u00edamos testar cen\u00e1rios adicionais que pudessem, por exemplo, reduzir a velocidade de um disco aleat\u00f3rio em um grupo de servidores aleat\u00f3rios, eliminar o processo memcached do mesmo servidor e, por fim, restaurar o disco.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para testar qualquer cen\u00e1rio que quisermos, criamos um \u00fanico Couchbase nemesis que modela o cluster do Couchbase por meio de altera\u00e7\u00f5es de estado a partir de um estado inicial. Mantemos um mapa de n\u00f3s e seus estados de rede, servidor, disco e cluster. Sempre que ocorre uma opera\u00e7\u00e3o, o estado \u00e9 atualizado para refletir a altera\u00e7\u00e3o no sistema. As opera\u00e7\u00f5es passadas ao nosso nemesis especificam op\u00e7\u00f5es de direcionamento de n\u00f3s, uma opera\u00e7\u00e3o e par\u00e2metros de opera\u00e7\u00e3o. As op\u00e7\u00f5es de direcionamento de n\u00f3s dizem ao nemesis, por exemplo, para direcionar um subconjunto de n\u00f3s aleat\u00f3rios de tamanho dois de todos os n\u00f3s \u00edntegros em um grupo de servidores aleat\u00f3rios. Esse \u00e9 o principal motivo pelo qual rastreamos o estado do n\u00f3: ele nos d\u00e1 mais flexibilidade na forma como o nemesis pode agir.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nosso nemesis tem suporte para as seguintes a\u00e7\u00f5es: failover (gracioso e r\u00edgido), recupera\u00e7\u00e3o (completa e delta), particionamento de rede personalizado, recupera\u00e7\u00e3o de rede, espera por failover autom\u00e1tico, rebalanceamento em um conjunto de n\u00f3s, rebalanceamento em um conjunto de n\u00f3s, rebalanceamento de swap em dois conjuntos de n\u00f3s, falha em um rebalanceamento, elimina\u00e7\u00e3o de um processo (memcached, babysitter, ns_server) em um conjunto de n\u00f3s, reiniciar os mesmos processos em um conjunto de n\u00f3s, diminuir a velocidade do cliente dcp, redefinir o cliente dcp, acionar a compacta\u00e7\u00e3o, falhar em um disco em um conjunto de n\u00f3s, diminuir a velocidade de um disco em um conjunto de n\u00f3s e recuperar um disco em um conjunto de n\u00f3s. Planejamos oferecer suporte a mais opera\u00e7\u00f5es nemesis no futuro.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Geradores<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Outra pe\u00e7a fundamental de um teste Jepsen s\u00e3o os geradores de opera\u00e7\u00f5es de cliente e n\u00eamesis.  Esses geradores criar\u00e3o uma sequ\u00eancia finita ou infinita de opera\u00e7\u00f5es. Cada teste ter\u00e1 seu pr\u00f3prio gerador de n\u00eamesis, mas provavelmente compartilha um gerador de cliente comum. Um gerador de n\u00eamesis, por exemplo, pode ser uma sequ\u00eancia de parti\u00e7\u00e3o, suspens\u00e3o e restaura\u00e7\u00e3o, repetida infinitamente. Um gerador de cliente especificar\u00e1 uma sequ\u00eancia aleat\u00f3ria e infinita de opera\u00e7\u00e3o do cliente, bem como os par\u00e2metros associados, como o n\u00edvel de durabilidade, a chave do documento, o novo valor a ser gravado ou descartado etc. Quando um teste \u00e9 iniciado, o gerador de cliente alimenta as opera\u00e7\u00f5es do cliente para o cliente e o gerador de n\u00eamesis alimenta as opera\u00e7\u00f5es para o n\u00eamesis. O teste continuar\u00e1 at\u00e9 que o gerador de n\u00eamesis tenha conclu\u00eddo um n\u00famero especificado de opera\u00e7\u00f5es, um limite de tempo seja atingido ou um erro seja lan\u00e7ado.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Carga de trabalho<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Uma carga de trabalho Jepsen \u00e9 simplesmente um mapa que une todos os componentes anteriores, juntamente com quaisquer par\u00e2metros adicionais, em um \u00fanico teste. Nossas cargas de trabalho modificar\u00e3o a l\u00f3gica do gerador de nemesis e do cliente com base nos par\u00e2metros de entrada, como a ativa\u00e7\u00e3o de grupos de servidores e failover autom\u00e1tico.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7274\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/07\/Jepsen-Diagram-1.jpg\" alt=\"\" width=\"929\" height=\"543\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1.jpg 929w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-300x175.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-768x449.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-20x12.jpg 20w\" sizes=\"auto, (max-width: 929px) 100vw, 929px\" \/><\/p>\n<h2><span style=\"font-weight: 400;\">Desafios<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">H\u00e1 dois desafios principais que encontramos ao criar esses testes, ambos decorrentes da limita\u00e7\u00e3o de recursos: 1.) O alto n\u00famero de permuta\u00e7\u00f5es de configura\u00e7\u00e3o de cluster; e 2.) O tempo necess\u00e1rio para executar o verificador de lineariza\u00e7\u00e3o.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Como o Couchbase \u00e9 uma plataforma de dados complexa e altamente personaliz\u00e1vel, h\u00e1 centenas de configura\u00e7\u00f5es a serem ajustadas. Algumas configura\u00e7\u00f5es s\u00e3o bin\u00e1rias (ex.: failover autom\u00e1tico ativado), enquanto outras s\u00e3o cont\u00ednuas (cota de RAM para KV). Isso cria um n\u00famero extremamente alto de poss\u00edveis estados iniciais de cluster a serem testados. Ent\u00e3o, com as maneiras quase infinitas de compor nossas opera\u00e7\u00f5es n\u00eamesis, temos um espa\u00e7o de teste muito grande para cobrir completamente.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O verificador de lineariza\u00e7\u00e3o, embora muito \u00fatil e produto de uma pesquisa muito boa, tem algumas limita\u00e7\u00f5es. O tempo que o verificador leva para analisar um hist\u00f3rico cresce exponencialmente com o n\u00famero de opera\u00e7\u00f5es. Al\u00e9m disso, opera\u00e7\u00f5es amb\u00edguas tamb\u00e9m causam crescimento exponencial. Portanto, temos um problema: queremos pressionar os clientes o m\u00e1ximo poss\u00edvel durante um teste, mas se pressionarmos demais os clientes, o verificador poder\u00e1 ficar sem mem\u00f3ria e n\u00e3o conseguir\u00e1 analisar o hist\u00f3rico. Isso tamb\u00e9m significa que queremos que os testes sejam executados o mais r\u00e1pido poss\u00edvel, mas isso reduzir\u00e1 a \u00e1rea de superf\u00edcie para encontrar um bug.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Solu\u00e7\u00f5es<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para contornar esses desafios, decidimos fazer o seguinte: concentrar-nos em um subconjunto de par\u00e2metros de teste que s\u00e3o mais importantes para nossos clientes, manter os testes o mais curtos poss\u00edvel e execut\u00e1-los com a maior frequ\u00eancia poss\u00edvel. Ao testar apenas par\u00e2metros comuns, como r\u00e9plicas de bucket, todos os novos n\u00edveis de durabilidade aprimorados, failover autom\u00e1tico etc., podemos nos concentrar em um conjunto gerenci\u00e1vel de testes que ser\u00e1 uma base s\u00f3lida para comprovar nossas garantias de durabilidade.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Primeiro, nos concentramos nas configura\u00e7\u00f5es cr\u00edticas do KV, com planos de adicionar novos servi\u00e7os e configura\u00e7\u00f5es (consulta, \u00edndice, xdcr etc.) \u00e0 medida que novos recursos s\u00e3o adicionados e a pedido do cliente. Em seguida, ajustamos nosso n\u00eamesis para operar o mais r\u00e1pido poss\u00edvel, reduzindo os tempos de espera, pesquisando o status da opera\u00e7\u00e3o, limitando o n\u00famero de opera\u00e7\u00f5es e tendo zero documentos pr\u00e9-carregados. Ter baldes vazios no in\u00edcio dos testes acelera os reequil\u00edbrios subsequentes durante o teste. No entanto, precisamos testar cen\u00e1rios em que os compartimentos t\u00eam grandes quantidades de dados e uma quantidade relativamente pequena de RAM por compartimento. Esses cen\u00e1rios de alta densidade de dados, que est\u00e3o sendo desenvolvidos, levar\u00e3o muito mais tempo para serem executados. Precisamos ajustar o tamanho da carga de dados inicial de modo que as opera\u00e7\u00f5es de rebalanceamento sejam r\u00e1pidas o suficiente para que o verificador de lineariza\u00e7\u00e3o n\u00e3o fique sem mem\u00f3ria. Al\u00e9m disso, devido ao limite de taxa das opera\u00e7\u00f5es do cliente, precisamos executar os testes v\u00e1rias vezes. Com uma taxa de opera\u00e7\u00e3o de cliente mais lenta, h\u00e1 uma probabilidade menor de duas opera\u00e7\u00f5es se sobreporem ou de uma opera\u00e7\u00e3o ocorrer em um momento de erro, mas se executarmos o teste v\u00e1rias vezes, poderemos aumentar o n\u00famero total de opera\u00e7\u00f5es sobrepostas e, com sorte, expor um erro.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para executar os testes com a maior frequ\u00eancia poss\u00edvel, criamos uma hierarquia de conjuntos de testes. Nossos conjuntos se dividem em quatro categorias: sanidade, di\u00e1rio, semanal e completo. O conjunto de testes de sanidade tem um pequeno subconjunto de testes que deve ser executado ap\u00f3s a entrada de novos commits e leva menos de uma hora para ser conclu\u00eddo. O conjunto di\u00e1rio maior n\u00e3o deve levar mais de 12 horas para ser executado e o semanal deve ser conclu\u00eddo em dois dias. O conjunto completo de testes \u00e9 uma lista de todos os testes e leva cerca de uma semana para ser conclu\u00eddo. Para criar os conjuntos, reduzimos o conjunto completo de testes removendo testes semelhantes e mantendo a cobertura em um n\u00edvel m\u00e1ximo. Atualmente, nosso conjunto completo tem 612 testes, o semanal tem 396, o di\u00e1rio tem 227 e o de sanidade tem 6 testes. Tamb\u00e9m temos um conjunto para bugs em vers\u00f5es anteriores (4.6.x, 5.0.x, 5.5.x, 6.0.x) que usamos para verificar se eles n\u00e3o est\u00e3o mais presentes no produto. Exemplos desses tipos de bugs s\u00e3o <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-29369\"><span style=\"font-weight: 400;\">MB-29369<\/span><\/a><span style=\"font-weight: 400;\"> e <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-29480\"><span style=\"font-weight: 400;\">MB-29480<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Resultados<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Nossos testes Jepsen conseguiram encontrar v\u00e1rios bugs no Couchbase. Esses bugs se enquadram em duas categorias: bugs gerais do produto e bugs de durabilidade e consist\u00eancia dos dados. Os bugs de durabilidade e consist\u00eancia s\u00e3o o motivo pelo qual iniciamos nossos testes Jepsen, portanto, consideramos que eles s\u00e3o mais importantes, pois temos um conjunto completo de regress\u00e3o funcional que detecta bugs gerais do produto. Alguns exemplos de bugs de durabilidade e consist\u00eancia que encontramos s\u00e3o <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35135\"><span style=\"font-weight: 400;\">MB-35135<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35060\"><span style=\"font-weight: 400;\">MB-35060<\/span><\/a><span style=\"font-weight: 400;\">e <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35053\"><span style=\"font-weight: 400;\">MB-35053<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nosso trabalho inicial com o Jepsen e os bugs que ele nos ajudou a encontrar nos deram mais confian\u00e7a na capacidade do Couchbase de manter seus dados seguros em uma ampla gama de cen\u00e1rios de falha e opera\u00e7\u00f5es de cluster. No entanto, s\u00e3o necess\u00e1rios testes cont\u00ednuos, pois o Jepsen pode detectar um bug ap\u00f3s centenas de execu\u00e7\u00f5es. Continuaremos a executar nossos testes do Jepsen diariamente e semanalmente, enquanto desenvolvemos suporte para mais cen\u00e1rios. O Jepsen \u00e9 uma ferramenta indispens\u00e1vel na cria\u00e7\u00e3o de sistemas com garantias de consist\u00eancia e durabilidade de dados, e continuaremos a utiliz\u00e1-lo e a expandir seus recursos.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Links:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">[1] <\/span><a href=\"https:\/\/courses.csail.mit.edu\/6.852\/01\/papers\/p91-attiya.pdf\"><span style=\"font-weight: 400;\">https:\/\/courses.csail.mit.edu\/6.852\/01\/papers\/p91-attiya.pdf<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[2] <\/span><a href=\"https:\/\/jepsen.io\/\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[3] <\/span><a href=\"https:\/\/jepsen.io\/consistency\/models\/linearizable\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/consistency\/models\/linearizable<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[4] <\/span><a href=\"https:\/\/jepsen.io\/consistency\/models\/sequential\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/consistency\/models\/sequential<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[5] <\/span><a href=\"https:\/\/github.com\/jepsen-io\/jepsen\"><span style=\"font-weight: 400;\">https:\/\/github.com\/jepsen-io\/jepsen<\/span><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Mais recursos<\/h3>\n<p class=\"p1\"><i>Baixar<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\">Fa\u00e7a o download do Couchbase Server 6.5<\/a><\/span><\/p>\n<p class=\"p1\"><i>\u00a0<\/i><i>Documenta\u00e7\u00e3o<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/release-notes\/relnotes.html\">Notas de vers\u00e3o do Couchbase Server 6.5<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\">Couchbase Server 6.5 O que h\u00e1 de novo<\/a><\/span><\/p>\n<p class=\"p1\"><i>Blogs<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-server-6-5-0-whats-new-and-improved\/\">Blog: Anunciando o Couchbase Server 6.5 GA - O que h\u00e1 de novo e aprimorado<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-brings-distributed-multi-document-acid-transactions-to-nosql\/\">Blog: O Couchbase traz as transa\u00e7\u00f5es ACID multi-documento distribu\u00eddas para o NoSQL<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/6-5\/\"><b>Todos os blogs 6.5<\/b><\/a><\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]<\/p>","protected":false},"author":13828,"featured_media":6719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2396],"tags":[2378,1313,2194],"ppma_author":[9069],"class_list":["post-7272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-transactions","tag-6-5","tag-consistency","tag-durability"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introduction To Jepsen Testing At Couchbase - 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\/introduction-to-jepsen-testing-at-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introduction To Jepsen Testing At Couchbase\" \/>\n<meta property=\"og:description\" content=\"Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/introduction-to-jepsen-testing-at-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-09T17:00:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T09:30:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1278\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Korrigan Clark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Korrigan Clark\" \/>\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\/introduction-to-jepsen-testing-at-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"},\"author\":{\"name\":\"Korrigan Clark\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8\"},\"headline\":\"Introduction To Jepsen Testing At Couchbase\",\"datePublished\":\"2019-08-09T17:00:48+00:00\",\"dateModified\":\"2024-09-12T09:30:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"},\"wordCount\":2218,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"keywords\":[\"6.5\",\"Consistency\",\"durability\"],\"articleSection\":[\"Couchbase Server\",\"Transactions\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\",\"name\":\"Introduction To Jepsen Testing At Couchbase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"datePublished\":\"2019-08-09T17:00:48+00:00\",\"dateModified\":\"2024-09-12T09:30:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"width\":2048,\"height\":1278},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introduction To Jepsen Testing At Couchbase\"}]},{\"@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\/7c204a2d8fcb7858db7ab30e0a02fee8\",\"name\":\"Korrigan Clark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/0ebfb10631fa5355ed00af2eb7ca5911\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"caption\":\"Korrigan Clark\"},\"description\":\"Korrigan Clark is a Software Engineer in Test at Couchbase.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/korrigan-clark\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introduction To Jepsen Testing At Couchbase - 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\/introduction-to-jepsen-testing-at-couchbase\/","og_locale":"pt_BR","og_type":"article","og_title":"Introduction To Jepsen Testing At Couchbase","og_description":"Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/introduction-to-jepsen-testing-at-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-08-09T17:00:48+00:00","article_modified_time":"2024-09-12T09:30:29+00:00","og_image":[{"width":2048,"height":1278,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","type":"image\/jpeg"}],"author":"Korrigan Clark","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Korrigan Clark","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"},"author":{"name":"Korrigan Clark","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8"},"headline":"Introduction To Jepsen Testing At Couchbase","datePublished":"2019-08-09T17:00:48+00:00","dateModified":"2024-09-12T09:30:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"},"wordCount":2218,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","keywords":["6.5","Consistency","durability"],"articleSection":["Couchbase Server","Transactions"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/","name":"Introduction To Jepsen Testing At Couchbase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","datePublished":"2019-08-09T17:00:48+00:00","dateModified":"2024-09-12T09:30:29+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","width":2048,"height":1278},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introduction To Jepsen Testing At Couchbase"}]},{"@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\/7c204a2d8fcb7858db7ab30e0a02fee8","name":"Korrigan Clark","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/0ebfb10631fa5355ed00af2eb7ca5911","url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","caption":"Korrigan Clark"},"description":"Korrigan Clark \u00e9 engenheiro de software de teste na Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/korrigan-clark\/"}]}},"authors":[{"term_id":9069,"user_id":13828,"is_guest":0,"slug":"korrigan-clark","display_name":"Korrigan Clark","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","author_category":"","last_name":"Clark","first_name":"Korrigan","job_title":"","user_url":"","description":"Korrigan Clark \u00e9 engenheiro de software de teste na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7272","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\/13828"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=7272"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/6719"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=7272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=7272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=7272"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=7272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}