{"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\/es\/libcouchbase-23-dp2-enhanced-configuration-updates\/","title":{"rendered":"libcouchbase 2.3-DP2: Actualizaciones de configuraci\u00f3n mejoradas"},"content":{"rendered":"<p><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">El 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;\">\u00a0incluir\u00e1 actualizaciones mejoradas de los cl\u00fasteres y muchas otras mejoras de estabilidad y rendimiento. La mayor parte del nuevo trabajo gira en torno al\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">Configuraci\u00f3n del cl\u00faster Publicaci\u00f3n portadora<\/em><span style=\"font-family: inherit; font-size: 1em; font-weight: normal; line-height: 1.4375em; color: #666666;\">\u00a0o\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>Couchbase es un\u00a0<em>escalable, el\u00e1stica<\/em>\u00a0cl\u00faster. Parte de este conjunto de caracter\u00edsticas significa que los nodos del cl\u00faster pueden a\u00f1adirse o eliminarse libremente sin causar tiempo de inactividad a nivel de aplicaci\u00f3n. Intercambiar todos los nodos de un cl\u00faster y reemplazarlos es totalmente compatible y algo normalmente transparente para un servidor de aplicaciones que utiliza el SDK.<\/p>\n<p>El propio SDK debe asegurarse de que est\u00e1 hablando con un cl\u00faster saludable y es consciente de los distintos nodos que son miembros del cl\u00faster. En concreto, esto implica saber dos cosas:<\/p>\n<ol>\n<li>Qu\u00e9 nodos forman parte del cl\u00faster<\/li>\n<li>Qu\u00e9 nodo es responsable de una clave determinada<\/li>\n<\/ol>\n<p>Esta informaci\u00f3n se transfiere a trav\u00e9s de un objeto JSON denominado \"<em>Mapa de configuraci\u00f3n<\/em>\" o \"<em>Mapa de conglomerados<\/em>\". Puede verlo usted mismo navegando a una 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>Este objeto JSON contiene las listas de los nodos, as\u00ed como un gran \"<em>Mapa de vBucket<\/em>\"que b\u00e1sicamente indica al cliente qu\u00e9 nodo es responsable de cada vBucket, y el cliente compara las claves con este mapa.<\/p>\n<h2>Bootstrapping<\/h2>\n<p>Para ver c\u00f3mo funciona el SDK (en concreto,\u00a0<em>libcouchbase<\/em>) coloca todo esto junto, podemos examinar el\u00a0<em>strace<\/em>\u00a0salida 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>Arriba puedes ver que la librer\u00eda primero hace una petici\u00f3n HTTP al puerto\u00a0<em>8091<\/em>\u00a0para recuperar el mapa del cluster. Una vez recuperado el mapa del cluster, se conecta al nodo que es el\u00a0<em>vBucket Master<\/em>\u00a0para la clave \"foo\" en el puerto\u00a0<em>11210, <\/em>realiza la autenticaci\u00f3n SASL y, por \u00faltimo, emite un\u00a0<em>memcached<\/em>\u00a0solicitud de la llave.<\/p>\n<p>Con CCCP, el puerto memcached en\u00a0<em>11210<\/em>\u00a0tambi\u00e9n puede albergar la informaci\u00f3n de configuraci\u00f3n. As\u00ed, si observamos una traza similar de la pr\u00f3xima\u00a0<em>DP<\/em>\u00a0versi\u00f3n del\u00a0<em>cbc<\/em>\u00a0herramienta, veremos esto:<\/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>Aqu\u00ed reducimos una conexi\u00f3n TCP adicional al obtener la configuraci\u00f3n\u00a0<em>directamente<\/em>\u00a0del puerto de datos.<\/p>\n<p>Incluso contra un cl\u00faster localhost, el segundo ejemplo se ejecuta aproximadamente el doble de r\u00e1pido que el primero, debido a la reducci\u00f3n de la conexi\u00f3n HTTP inicial.<\/p>\n<h2>Actualizaciones de la configuraci\u00f3n<\/h2>\n<p>Las actualizaciones de configuraci\u00f3n son mapas de cl\u00faster nuevos y actualizados que se reciben cuando cambia la topolog\u00eda del cl\u00faster. Esto permite al cliente saber que se han a\u00f1adido o eliminado nodos y, por consiguiente, que el mapa de vBucket ha cambiado.<\/p>\n<p>El comportamiento anterior de libcouchbase era conectarse a la base de datos <i>streaming<\/i>\u00a0REST API para el bucket en cuesti\u00f3n con el fin de recibir actualizaciones de configuraci\u00f3n. Esto requer\u00eda que la biblioteca mantuviera una conexi\u00f3n TCP casi siempre inactiva a la que se enviar\u00eda informaci\u00f3n de configuraci\u00f3n desde el cl\u00faster. Este enfoque ten\u00eda dos desventajas principales:<\/p>\n<ol>\n<li>Colocar\u00eda la biblioteca en un estado de espera\/sondeo largo, en el que el socket que estaba sirviendo la configuraci\u00f3n asumir\u00eda que estaba conectado a un nodo en funcionamiento que\u00a0<em>pulse<\/em>\u00a0la informaci\u00f3n de configuraci\u00f3n. Esta suposici\u00f3n, por supuesto, fallar\u00eda si el nodo al que el cliente estaba conectado a trav\u00e9s del punto final de streaming fuera el que fallara por s\u00ed mismo (y peor a\u00fan, nunca entregara un TCP RST). Dado que la sem\u00e1ntica estaba basada en push, el cliente no podr\u00eda establecer un\u00a0<em>tiempo de espera<\/em>\u00a0para asegurarse de que la conexi\u00f3n segu\u00eda funcionando correctamente.<\/li>\n<li>Era necesaria una conexi\u00f3n TCP adicional en todo momento para mantener actualizada la informaci\u00f3n de configuraci\u00f3n. Como los puntos finales de la API REST se dise\u00f1aron para la administraci\u00f3n, no para el uso rutinario, no est\u00e1n optimizados para el uso de memoria. En concreto, cada conexi\u00f3n TCP a estos incurre en una importante penalizaci\u00f3n de recursos en el lado del servidor.<\/li>\n<\/ol>\n<h2><span style=\"font-family: courier new,courier,monospace;\">Confmon<\/span> - Administrador de configuraci\u00f3n<\/h2>\n<p>La nueva 2.3 cambia el modelo y el enfoque de c\u00f3mo se recupera la configuraci\u00f3n. Un conjunto interno de APIs conocidas colectivamente como\u00a0<em>confmon\/clconfig<\/em>\u00a0en la base de c\u00f3digo. En lugar de tener un modelo intrusivo basado en push donde la configuraci\u00f3n se impondr\u00eda sobre un socket abierto,\u00a0<em>confmon<\/em>\u00a0est\u00e1 basado en pull y se activa s\u00f3lo cuando es necesario. As\u00ed, por defecto, el cliente no mantendr\u00e1 sockets abiertos s\u00f3lo para la configuraci\u00f3n, sino que asumir\u00e1 una configuraci\u00f3n v\u00e1lida hasta que alcance un determinado umbral de error o reciba una orden expl\u00edcita de\u00a0<em>NOT_MY_VBUCKET<\/em>\u00a0error de uno de los nodos del cluster (indicando que el mapa del cliente se ha quedado sin datos).<\/p>\n<p>En concreto, con el nuevo\u00a0<em>CCCP<\/em>\u00a0mejoras, cada\u00a0<em>NOT_MY_VBUCKET<\/em>\u00a0respuesta en s\u00ed\u00a0<em>ya<\/em>\u00a0contiene el mapa de cl\u00faster actualizado, eliminando as\u00ed la necesidad de volver a obtener la configuraci\u00f3n en primer lugar.<\/p>\n<p>Las ventajas tambi\u00e9n se obtienen con los cl\u00fasteres m\u00e1s antiguos, ya que el nuevo modelo s\u00f3lo abre conexiones REST API <i>a la carta<\/i>\u00a0- en lugar de mantenerlos abiertos indefinidamente (de hecho, hemos hecho una peque\u00f1a optimizaci\u00f3n en la que hacemos un sondeo largo durante un corto periodo de tiempo, ya que las actualizaciones de configuraci\u00f3n tienden a suceder sucesivamente durante los cambios de topolog\u00eda, como los reequilibrios).<\/p>\n<h2>Registro<\/h2>\n<p>Se han a\u00f1adido ganchos de registro a la biblioteca. Este modelo le permite activar la opci\u00f3n predeterminada\u00a0<em>registrador de consola<\/em>\u00a0estableciendo el\u00a0<em>LCB_LOGLEVEL<\/em>\u00a0o instale sus propios ganchos de registro implementando la variable de entorno\u00a0<em>lcb_logprocs<\/em>\u00a0e informando a la instancia sobre sus ganchos de registro.<\/p>\n<p>Se ha a\u00f1adido el registro de eventos notables pero no intensivos en CPU, como tiempos de espera, conexiones de sockets, destrucci\u00f3n de sockets, actualizaciones de configuraci\u00f3n, etc.<\/p>\n<p>Ten en cuenta que hay m\u00e1s cosas que nos gustar\u00eda registrar y que este no es el final de toda la instrumentaci\u00f3n y ayudas al diagn\u00f3stico que tenemos previsto a\u00f1adir.<\/p>\n<h2>Gesti\u00f3n de conexiones<\/h2>\n<p>Tambi\u00e9n hemos mejorado la forma en que gestionamos las nuevas conexiones a los nodos de \"datos\" de memcached. Anteriormente, las conexiones se asignaban a los objetos que las creaban. Esto significaba que el\u00a0<em>lcb_server_t<\/em>\u00a0abrir\u00eda y cerrar\u00eda una conexi\u00f3n.<\/p>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">En 2.3, hemos a\u00f1adido una funci\u00f3n\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 de forma muy parecida a una agrupaci\u00f3n de sockets (y se utilizar\u00e1 en el futuro para soportar la agrupaci\u00f3n de sockets para cosas como las consultas de vistas). En lugar de tener subsistemas <\/span><i style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">abra\u00a0<\/i><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">y\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">cerrar<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0conexiones del sistema de E\/S directamente, ahora\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">solicitar<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0y\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">liberar<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">\u00a0(o\u00a0<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">descarte<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">) desde y hacia el\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;\">\u00a0instancia<\/span><\/p>\n<p>Ahora las estructuras de servidor no cerrar\u00e1n incondicionalmente sus conexiones TCP, sino que comprobar\u00e1n si hay datos pendientes en ellas; si hay datos entonces el socket es\u00a0<em>desechado<\/em>\u00a0al pool (es decir, se libera el socket y cualquier recurso del pool asociado a \u00e9l) porque consideramos que el socket se encuentra en un estado no v\u00e1lido (ya que las respuestas del servidor ser\u00e1n probablemente m\u00e1s\u00a0<em>NOT_MY_VBUCKET\u00a0<\/em>respuestas). Si no hay datos pendientes el socket se\u00a0<em>publicado<\/em>\u00a0de nuevo en el pool, quedando disponible para una solicitud posterior de una nueva conexi\u00f3n. En nuestras pruebas, esto ha supuesto una reducci\u00f3n de hasta 6 veces en la creaci\u00f3n de nuevas conexiones TCP durante los cambios de topolog\u00eda del cl\u00faster.<\/p>\n<h2>Obtener el c\u00f3digo<\/h2>\n<p>Puede descargarse un archivo tar con el c\u00f3digo fuente de esta versi\u00f3n en<\/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.1 (Yoast SEO v26.1.1) - 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\/es\/libcouchbase-23-dp2-enhanced-configuration-updates\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/mark-nunberg\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Enhanced Configuration Updates on libcouchbase 2.3-DP2","description":"Obtenga m\u00e1s informaci\u00f3n sobre la pr\u00f3xima versi\u00f3n de libcouchbase, que incluye actualizaciones de cl\u00faster mejoradas y muchas otras mejoras de estabilidad y rendimiento.","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\/es\/libcouchbase-23-dp2-enhanced-configuration-updates\/","og_locale":"es_MX","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\/es\/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":"es","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":"Obtenga m\u00e1s informaci\u00f3n sobre la pr\u00f3xima versi\u00f3n de libcouchbase, que incluye actualizaciones de cl\u00faster mejoradas y muchas otras mejoras de estabilidad y rendimiento.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/libcouchbase-23-dp2-enhanced-configuration-updates\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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, Ingeniero de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@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 es un ingeniero de software que trabaja en Couchbase. Mantiene la biblioteca del cliente C (libcouchbase), as\u00ed como el cliente Python. Tambi\u00e9n desarroll\u00f3 el cliente Perl (para su uso en su anterior empresa) - que inicialmente le llev\u00f3 a trabajar en Couchbase. Antes de unirse a Couchbase, trabaj\u00f3 en sistemas de enrutamiento distribuidos y de alto rendimiento en una empresa de an\u00e1lisis de comercio electr\u00f3nico. Mark estudi\u00f3 Ling\u00fc\u00edstica en la Universidad Hebrea de Jerusal\u00e9n.","url":"https:\/\/www.couchbase.com\/blog\/es\/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 es un ingeniero de software que trabaja en Couchbase. Mantiene la biblioteca del cliente C (libcouchbase), as\u00ed como el cliente Python. Tambi\u00e9n desarroll\u00f3 el cliente Perl (para su uso en su anterior empresa) - que inicialmente le llev\u00f3 a trabajar en Couchbase. Antes de unirse a Couchbase, trabaj\u00f3 en sistemas de enrutamiento distribuidos y de alto rendimiento en una empresa de an\u00e1lisis de comercio electr\u00f3nico. Mark estudi\u00f3 Ling\u00fc\u00edstica en la Universidad Hebrea de Jerusal\u00e9n."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1669"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1669\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1669"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}