{"id":1669,"date":"2014-12-16T19:36:51","date_gmt":"2014-12-16T19:36:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1669"},"modified":"2018-12-23T23:21:59","modified_gmt":"2018-12-24T07:21:59","slug":"libcouchbase-23-dp2-enhanced-configuration-updates","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-23-dp2-enhanced-configuration-updates\/","title":{"rendered":"libcouchbase 2.3-DP2: atualiza\u00e7\u00f5es aprimoradas de configura\u00e7\u00e3o"},"content":{"rendered":"<p><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">O pr\u00f3ximo\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">libcouchbase<\/em><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">\u00a0A vers\u00e3o do Windows\u00ae contar\u00e1 com atualiza\u00e7\u00f5es de cluster aprimoradas e uma s\u00e9rie de outras melhorias de estabilidade e desempenho. A maior parte do novo trabalho gira em torno do\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">Publica\u00e7\u00e3o da operadora de configura\u00e7\u00e3o de cluster<\/em><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">\u00a0ou\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">CCCP<\/em><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">\u00a0para abreviar.<\/span><\/p>\n<p>O Couchbase \u00e9 um\u00a0<em>escal\u00e1vel, el\u00e1stico<\/em>\u00a0cluster. Parte desse conjunto de recursos significa que os n\u00f3s do cluster podem ser adicionados ou removidos livremente sem causar tempo de inatividade no n\u00edvel do aplicativo. A troca de todos os n\u00f3s de um cluster e sua substitui\u00e7\u00e3o \u00e9 totalmente suportada e algo normalmente transparente para um servidor de aplicativos usando o SDK.<\/p>\n<p>O pr\u00f3prio SDK deve garantir que est\u00e1 se comunicando com um cluster \u00edntegro e que est\u00e1 ciente dos v\u00e1rios n\u00f3s que s\u00e3o membros do cluster. Especificamente, isso inclui saber duas coisas:<\/p>\n<ol>\n<li>Quais n\u00f3s fazem parte do cluster<\/li>\n<li>Qual n\u00f3 \u00e9 respons\u00e1vel por uma determinada chave<\/li>\n<\/ol>\n<p>Essas informa\u00e7\u00f5es s\u00e3o transferidas por meio de um objeto JSON chamado \"<em>Mapa de configura\u00e7\u00e3o<\/em>\" ou \"<em>Mapa de clusters<\/em>\". Voc\u00ea mesmo pode ver isso navegando para um URL como<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">curl localhost:8091\/pools\/default\/buckets\/default<\/div>\n<\/div>\n<p>Esse objeto JSON cont\u00e9m as listas dos n\u00f3s, bem como um grande \"<em>Mapa do vBucket<\/em>\", que basicamente instrui o cliente sobre qual n\u00f3 \u00e9 respons\u00e1vel por qual vBucket, e o cliente ent\u00e3o faz o hash das chaves nesse mapa.<\/p>\n<h2>Bootstrapping<\/h2>\n<p>Para ver como o SDK (especificamente,\u00a0<em>libcouchbase<\/em>) juntando tudo isso, podemos examinar o\u00a0<em>estirpe<\/em>\u00a0sa\u00edda de\u00a0<em>cbc<\/em><\/p>\n<div style=\"overlow-x: scroll;\">\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">\n<pre class=\"lang:default highlight:0 decode:true\">socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 6\r\nconnect(6, {sa_family=AF_INET, sin_port=htons(8091), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = -1 EINPROGRESS (Operation now in progress)\r\nconnect(6, {sa_family=AF_INET, sin_port=htons(8091), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = 0\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"GET \/pools\/default\/bucketsStream\"..., 145}], msg_controllen=0, msg_flags=0}, 0) = 145\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"HTTP\/1.1 200 OKrnTransfer-Encodi\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 200\r\nrecvmsg(6, 0x7fff7b7e9bb0, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"2223rn{\"name\":\"protected\",\"bucke\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 8756\r\nrecvmsg(6, 0x7fff7b7e9bb0, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsocket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 7\r\nconnect(7, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = -1 EINPROGRESS (Operation now in progress)\r\nconnect(7, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = 0\r\ngetsockname(7, {sa_family=AF_INET, sin_port=htons(34432), sin_addr=inet_addr(\"127.0.0.1\")}, [16]) = 0\r\ngetpeername(7, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, [16]) = 0\r\nsendmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"200 \", 24}], msg_controllen=0, msg_flags=0}, 0) = 24\r\nrecvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"201 16CRAM-MD5\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 38\r\nrecvmsg(7, 0x7fff7b7e9b70, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"200!1010CRAM-MD5\", 32}], msg_controllen=0, msg_flags=0}, 0) = 32\r\nrecvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"201!!36&lt;9003993\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 54\r\nrecvmsg(7, 0x7fff7b7e9b70, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"200\"10002CRAM-MD5\"..., 74}], msg_controllen=0, msg_flags=0}, 0) = 74\r\nrecvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"201\"rAuthenti\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 37\r\nrecvmsg(7, 0x7fff7b7e9b70, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"2003s31foo\", 27}], msg_controllen=0, msg_flags=0}, 0) = 27\r\nrecvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{\"20142111~$@327-17Hell\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 41\r\nrecvmsg(7, 0x7fff7b7e9b70, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\n\"foo\" Size:13 Flags:0 CAS:f2dd740247e0100\r\nHello World!<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Acima, voc\u00ea pode ver que a biblioteca primeiro faz uma solicita\u00e7\u00e3o HTTP para a porta\u00a0<em>8091<\/em>\u00a0para recuperar o mapa do cluster. Depois que o mapa do cluster \u00e9 recuperado, ele se conecta ao n\u00f3 que \u00e9 o\u00a0<em>Mestre do vBucket<\/em>\u00a0para a chave \"foo\" na porta\u00a0<em>11210, <\/em>realiza a autentica\u00e7\u00e3o SASL e, por fim, emite um\u00a0<em>memcached<\/em>\u00a0solicita\u00e7\u00e3o da chave.<\/p>\n<p>Com o CCCP, a porta do memcached em\u00a0<em>11210<\/em>\u00a0tamb\u00e9m pode hospedar as informa\u00e7\u00f5es de configura\u00e7\u00e3o. Portanto, se olharmos para um rastreamento semelhante do pr\u00f3ximo\u00a0<em>DP<\/em>\u00a0vers\u00e3o do\u00a0<em>cbc<\/em>\u00a0ferramenta, veremos isso:<\/p>\n<div style=\"width: 735.3499755859375px;\">\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">\n<pre class=\"lang:default highlight:0 decode:true\">connect(6, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = -1 EINPROGRESS (Operation now in progress)\r\nconnect(6, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = 0\r\ngetsockname(6, {sa_family=AF_INET, sin_port=htons(34412), sin_addr=inet_addr(\"127.0.0.1\")}, [16]) = 0\r\ngetpeername(6, {sa_family=AF_INET, sin_port=htons(11210), sin_addr=inet_addr(\"127.0.0.1\")}, [16]) = 0\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"200 \", 24}], msg_controllen=0, msg_flags=0}, 0) = 24\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"201 16CRAM-MD5\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 38\r\nrecvmsg(6, 0x7fff8206e770, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"200!1010CRAM-MD5\", 32}], msg_controllen=0, msg_flags=0}, 0) = 32\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"201!!36&lt;9014490\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 54\r\nrecvmsg(6, 0x7fff8206e770, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"200\"10002CRAM-MD5\"..., 74}], msg_controllen=0, msg_flags=0}, 0) = 74\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"201\"rAuthenti\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 37\r\nrecvmsg(6, 0x7fff8206e770, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"200265r360\", 24}], msg_controllen=0, msg_flags=0}, 0) = 24\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"20126536{r360{\"rev\":1\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 7827\r\nrecvmsg(6, 0x7fff8206e770, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\nsendmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"2003s31foo\", 27}], msg_controllen=0, msg_flags=0}, 0) = 27\r\nrecvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{\"20142111~$@327-17Hell\"..., 65536}], msg_controllen=0, msg_flags=0}, 0) = 41\r\nrecvmsg(6, 0x7fff8206e730, 0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = -1 EAGAIN (Resource temporarily unavailable)\r\n\"foo\" Size:13 Flags:0 CAS:f2dd740247e0100\r\nHello World!<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Aqui, reduzimos uma conex\u00e3o TCP extra ao buscar a configura\u00e7\u00e3o\u00a0<em>diretamente<\/em>\u00a0da porta de dados.<\/p>\n<p>Mesmo em um cluster de host local, o segundo exemplo \u00e9 executado duas vezes mais r\u00e1pido que o primeiro, devido \u00e0 redu\u00e7\u00e3o da conex\u00e3o HTTP inicial.<\/p>\n<h2>Atualiza\u00e7\u00f5es de configura\u00e7\u00e3o<\/h2>\n<p>As atualiza\u00e7\u00f5es de configura\u00e7\u00e3o s\u00e3o mapas de cluster novos e atualizados recebidos quando a topologia do cluster \u00e9 alterada. Isso permite que um cliente saiba que os n\u00f3s foram adicionados ou removidos e, posteriormente, que o mapa do vBucket foi alterado.<\/p>\n<p>O comportamento anterior da libcouchbase era conectar-se ao <i>transmiss\u00e3o<\/i>\u00a0para o bucket fornecido a fim de receber atualiza\u00e7\u00f5es de configura\u00e7\u00e3o dele. Isso exigia que a biblioteca mantivesse uma conex\u00e3o TCP quase sempre ociosa, que receberia informa\u00e7\u00f5es de configura\u00e7\u00e3o do cluster. Essa abordagem apresentava duas desvantagens principais:<\/p>\n<ol>\n<li>Isso colocaria a biblioteca em um estado de espera\/longa sondagem, em que o soquete que estava servindo a configura\u00e7\u00e3o assumiria que estava conectado a um n\u00f3 em funcionamento que\u00a0<em>empurrar<\/em>\u00a0ele informa\u00e7\u00f5es de configura\u00e7\u00e3o. Essa suposi\u00e7\u00e3o falharia, \u00e9 claro, se o n\u00f3 ao qual o cliente estivesse conectado por meio do endpoint de streaming fosse aquele que falhasse (e pior, nunca entregasse um TCP RST). Como a sem\u00e2ntica era baseada em push, o cliente n\u00e3o poderia definir um\u00a0<em>tempo limite<\/em>\u00a0para garantir que a conex\u00e3o ainda estivesse funcionando corretamente.<\/li>\n<li>Uma conex\u00e3o TCP adicional era necess\u00e1ria o tempo todo para manter as informa\u00e7\u00f5es de configura\u00e7\u00e3o atualizadas. Como os pontos de extremidade da API REST foram projetados para administra\u00e7\u00e3o, e n\u00e3o para uso rotineiro, eles n\u00e3o s\u00e3o otimizados para uso de mem\u00f3ria. Especificamente, cada conex\u00e3o TCP com eles incorre em uma penalidade significativa de recursos no lado do servidor.<\/li>\n<\/ol>\n<h2><span style=\"font-family: courier new,courier,monospace;\">Confmon<\/span> - Gerenciador de configura\u00e7\u00e3o<\/h2>\n<p>A nova vers\u00e3o 2.3 altera o modelo e a abordagem de como a configura\u00e7\u00e3o \u00e9 recuperada. Um conjunto interno de APIs conhecido coletivamente como\u00a0<em>confmon\/clconfig<\/em>\u00a0foram introduzidos na base de c\u00f3digo. Em vez de ter um modelo intrusivo baseado em push, em que a configura\u00e7\u00e3o seria imposta em um soquete aberto,\u00a0<em>confmon<\/em>\u00a0\u00e9 baseado em pull e \u00e9 acionado somente conforme a necessidade. Assim, o cliente, por padr\u00e3o, n\u00e3o manter\u00e1 soquetes abertos apenas para configura\u00e7\u00e3o; em vez disso, ele assumir\u00e1 uma configura\u00e7\u00e3o v\u00e1lida at\u00e9 atingir um determinado limite de erro ou receber uma mensagem expl\u00edcita de\u00a0<em>N\u00c3O MEU_VBUCKET<\/em>\u00a0de um dos n\u00f3s do cluster (indicando que o mapa do cliente est\u00e1 sem dados).<\/p>\n<p>Especificamente com o novo\u00a0<em>CCCP<\/em>\u00a0aprimoramentos, cada\u00a0<em>N\u00c3O MEU_VBUCKET<\/em>\u00a0resposta em si mesma\u00a0<em>j\u00e1<\/em>\u00a0cont\u00e9m o mapa de cluster atualizado, eliminando assim a necessidade de buscar novamente a configura\u00e7\u00e3o.<\/p>\n<p>Os benef\u00edcios tamb\u00e9m s\u00e3o obtidos com clusters mais antigos, pois o novo modelo abre apenas conex\u00f5es de API REST <i>sob demanda<\/i>\u00a0- em vez de mant\u00ea-las abertas indefinidamente. (Na verdade, fizemos uma pequena otimiza\u00e7\u00e3o em que fazemos uma sondagem longa por um curto per\u00edodo de tempo, pois as atualiza\u00e7\u00f5es de configura\u00e7\u00e3o tendem a ocorrer em sucess\u00e3o durante as altera\u00e7\u00f5es de topologia, como rebalanceamentos).<\/p>\n<h2>Registro em log<\/h2>\n<p>Ganchos de registro foram adicionados \u00e0 biblioteca. Esse modelo permite que voc\u00ea ative o registro padr\u00e3o\u00a0<em>registrador de console<\/em>\u00a0definindo o\u00a0<em>LCB_LOGLEVEL<\/em>\u00a0ou instale seus pr\u00f3prios ganchos de registro implementando a vari\u00e1vel de ambiente\u00a0<em>lcb_logprocs<\/em>\u00a0e informando a inst\u00e2ncia sobre seus ganchos de registro.<\/p>\n<p>O registro em log foi adicionado para eventos not\u00e1veis, mas n\u00e3o intensivos em CPU, como tempos limite, conex\u00f5es de soquete, destrui\u00e7\u00e3o de soquete, atualiza\u00e7\u00f5es de configura\u00e7\u00e3o e muito mais.<\/p>\n<p>Observe que h\u00e1 mais coisas que gostar\u00edamos de registrar e este n\u00e3o \u00e9 o fim de toda a instrumenta\u00e7\u00e3o e dos aux\u00edlios de diagn\u00f3stico que planejamos adicionar!<\/p>\n<h2>Gerenciamento de conex\u00f5es<\/h2>\n<p>Tamb\u00e9m aprimoramos a maneira como lidamos com novas conex\u00f5es aos n\u00f3s de \"dados\" do memcached. Anteriormente, as conex\u00f5es tinham como escopo os objetos que as criaram. Isso significava que o\u00a0<em>lcb_server_t<\/em>\u00a0abriria e fecharia uma conex\u00e3o.<\/p>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">Na vers\u00e3o 2.3, adicionamos um\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">connmgr<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0que funciona como um pool de soquetes (e ser\u00e1 usado no futuro para dar suporte ao pool de soquetes para coisas como consultas de visualiza\u00e7\u00e3o). Em vez de ter subsistemas <\/span><i style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">aberto\u00a0<\/i><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">e\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">pr\u00f3ximo<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0conex\u00f5es do sistema de E\/S diretamente, eles agora\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">solicita\u00e7\u00e3o<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0e\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">libera\u00e7\u00e3o<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0(ou\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">descartar<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">) conex\u00f5es de e para o\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">connmgr<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0inst\u00e2ncia<\/span><\/p>\n<p>Agora, as estruturas do servidor n\u00e3o fechar\u00e3o incondicionalmente suas conex\u00f5es TCP, mas verificar\u00e3o se h\u00e1 dados pendentes nelas; se houver dados, o soquete ser\u00e1\u00a0<em>descartado<\/em>\u00a0de volta ao pool (ou seja, o soquete \u00e9 liberado e todos os recursos do pool associados a ele tamb\u00e9m s\u00e3o liberados) porque consideramos que o soquete est\u00e1 em um estado inv\u00e1lido (j\u00e1 que as respostas adicionais do servidor provavelmente ser\u00e3o\u00a0<em>N\u00c3O MEU_VBUCKET\u00a0<\/em>respostas). Se n\u00e3o houver dados pendentes, o soquete ser\u00e1\u00a0<em>liberado<\/em>\u00a0de volta ao pool, tornando-se dispon\u00edvel para uma solicita\u00e7\u00e3o subsequente de uma nova conex\u00e3o. Em nossos testes, isso mostrou uma redu\u00e7\u00e3o de at\u00e9 6 vezes na cria\u00e7\u00e3o de novas conex\u00f5es TCP durante as altera\u00e7\u00f5es na topologia do cluster.<\/p>\n<h2>Obter o c\u00f3digo<\/h2>\n<p>Voc\u00ea pode fazer download de um tarball de origem dessa vers\u00e3o em<\/p>\n<p><a href=\"https:\/\/packages.couchbase.com\/clients\/c\/snapshots\/libcouchbase-2.3.0_dp2.tar.gz\">https:\/\/packages.couchbase.com\/clients\/c\/snapshots\/libcouchbase-2.3.0_dp2.tar.gz<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>The upcoming\u00a0libcouchbase\u00a0version will feature enhanced cluster updates and a whole lot of other stability and performance improvements. Most of the new work revolves around the\u00a0Cluster Configuration Carrier Publication\u00a0or\u00a0CCCP\u00a0for short. Couchbase is a\u00a0scalable, elastic\u00a0cluster. Part of this featureset means that cluster [&hellip;]<\/p>","protected":false},"author":38,"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":[8997],"class_list":["post-1669","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.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Enhanced Configuration Updates on libcouchbase 2.3-DP2<\/title>\n<meta name=\"description\" content=\"Learn more about the upcoming libcouchbase version that features enhanced cluster updates and a whole lot of other stability and performance improvements.\" \/>\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\/libcouchbase-23-dp2-enhanced-configuration-updates\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"libcouchbase 2.3-DP2: Enhanced Configuration Updates\" \/>\n<meta property=\"og:description\" content=\"Learn more about the upcoming libcouchbase version that features enhanced cluster updates and a whole lot of other stability and performance improvements.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-23-dp2-enhanced-configuration-updates\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:36:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-12-24T07:21:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mark Nunberg, Software Engineer, 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=\"Mark Nunberg, Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\"},\"author\":{\"name\":\"Mark Nunberg, Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016\"},\"headline\":\"libcouchbase 2.3-DP2: Enhanced Configuration Updates\",\"datePublished\":\"2014-12-16T19:36:51+00:00\",\"dateModified\":\"2018-12-24T07:21:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\"},\"wordCount\":1133,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#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\/libcouchbase-23-dp2-enhanced-configuration-updates\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\",\"name\":\"Enhanced Configuration Updates on libcouchbase 2.3-DP2\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:36:51+00:00\",\"dateModified\":\"2018-12-24T07:21:59+00:00\",\"description\":\"Learn more about the upcoming libcouchbase version that features enhanced cluster updates and a whole lot of other stability and performance improvements.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#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\/libcouchbase-23-dp2-enhanced-configuration-updates\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"libcouchbase 2.3-DP2: Enhanced Configuration Updates\"}]},{\"@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\/76a75284da32b6f257c8e5e156e6e016\",\"name\":\"Mark Nunberg, Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/895cad0986a0ab674fda857b6ba71ce0\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g\",\"caption\":\"Mark Nunberg, Software Engineer, Couchbase\"},\"description\":\"Mark Nunberg is a software engineer working at Couchbase. He maintains the C client library (libcouchbase) as well as the Python client. He also developed the Perl client (for use at his previous company) - which initially led him to working at Couchbase. Prior to joining Couchbase, he worked on distributed and high performance routing systems at an eCommerce analytics firm. Mark studied Linguistics at the Hebrew University of Jerusalem.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/mark-nunberg\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Atualiza\u00e7\u00f5es de configura\u00e7\u00e3o aprimoradas na libcouchbase 2.3-DP2","description":"Saiba mais sobre a pr\u00f3xima vers\u00e3o da libcouchbase que apresenta atualiza\u00e7\u00f5es aprimoradas de cluster e uma s\u00e9rie de outras melhorias de estabilidade e desempenho.","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\/libcouchbase-23-dp2-enhanced-configuration-updates\/","og_locale":"pt_BR","og_type":"article","og_title":"libcouchbase 2.3-DP2: Enhanced Configuration Updates","og_description":"Learn more about the upcoming libcouchbase version that features enhanced cluster updates and a whole lot of other stability and performance improvements.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/libcouchbase-23-dp2-enhanced-configuration-updates\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:36:51+00:00","article_modified_time":"2018-12-24T07:21:59+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Mark Nunberg, Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mark Nunberg, Software Engineer, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/"},"author":{"name":"Mark Nunberg, Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016"},"headline":"libcouchbase 2.3-DP2: Enhanced Configuration Updates","datePublished":"2014-12-16T19:36:51+00:00","dateModified":"2018-12-24T07:21:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/"},"wordCount":1133,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#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\/libcouchbase-23-dp2-enhanced-configuration-updates\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/","url":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/","name":"Atualiza\u00e7\u00f5es de configura\u00e7\u00e3o aprimoradas na libcouchbase 2.3-DP2","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:36:51+00:00","dateModified":"2018-12-24T07:21:59+00:00","description":"Saiba mais sobre a pr\u00f3xima vers\u00e3o da libcouchbase que apresenta atualiza\u00e7\u00f5es aprimoradas de cluster e uma s\u00e9rie de outras melhorias de estabilidade e desempenho.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#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\/libcouchbase-23-dp2-enhanced-configuration-updates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"libcouchbase 2.3-DP2: Enhanced Configuration Updates"}]},{"@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\/76a75284da32b6f257c8e5e156e6e016","name":"Mark Nunberg, engenheiro de software, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/895cad0986a0ab674fda857b6ba71ce0","url":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","caption":"Mark Nunberg, Software Engineer, Couchbase"},"description":"Mark Nunberg \u00e9 um engenheiro de software que trabalha na Couchbase. Ele mant\u00e9m a biblioteca do cliente em C (libcouchbase), bem como o cliente em Python. Ele tamb\u00e9m desenvolveu o cliente Perl (para uso em sua empresa anterior), o que o levou inicialmente a trabalhar no Couchbase. Antes de ingressar no Couchbase, ele trabalhou em sistemas de roteamento distribu\u00eddos e de alto desempenho em uma empresa de an\u00e1lise de com\u00e9rcio eletr\u00f4nico. Mark estudou Lingu\u00edstica na Universidade Hebraica de Jerusal\u00e9m.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/mark-nunberg\/"}]}},"authors":[{"term_id":8997,"user_id":38,"is_guest":0,"slug":"mark-nunberg","display_name":"Mark Nunberg, Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","author_category":"","last_name":"Nunberg","first_name":"Mark","job_title":"","user_url":"","description":"Mark Nunberg \u00e9 um engenheiro de software que trabalha na Couchbase. Ele mant\u00e9m a biblioteca do cliente em C (libcouchbase), bem como o cliente em Python. Ele tamb\u00e9m desenvolveu o cliente Perl (para uso em sua empresa anterior), o que o levou inicialmente a trabalhar no Couchbase. Antes de ingressar no Couchbase, ele trabalhou em sistemas de roteamento distribu\u00eddos e de alto desempenho em uma empresa de an\u00e1lise de com\u00e9rcio eletr\u00f4nico. Mark estudou Lingu\u00edstica na Universidade Hebraica de Jerusal\u00e9m."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1669","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\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1669"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1669\/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=1669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1669"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}