{"id":4641,"date":"2018-02-19T15:01:36","date_gmt":"2018-02-19T23:01:36","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4641"},"modified":"2025-06-13T20:46:29","modified_gmt":"2025-06-14T03:46:29","slug":"couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/","title":{"rendered":"Introducci\u00f3n a Couchbase HA\/DR: Cliente Java Multi-Cluster Aware"},"content":{"rendered":"<div class=\"paragraph\">\n<p>En este post, voy a echar un vistazo a una aplicaci\u00f3n de ejemplo que utiliza la funci\u00f3n <a title=\"Servidor Couchbase\" href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/server\/\">Servidor Couchbase<\/a> Cliente Java Multi-Cluster Aware (MCA). Este cliente va de la mano con Couchbase's Cross-Data Center Replication (<a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/xdcr\/xdcr-intro.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/xdcr\/xdcr-intro.html\">XDCR<\/a>).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>XDCR soporta la replicaci\u00f3n flexible de datos entre diferentes clusters. XDCR es una caracter\u00edstica importante para despliegues de centros de datos m\u00faltiples a gran escala. Las referencias a continuaci\u00f3n incluyen varias sobre XDCR. El cliente MCA puede redirigir autom\u00e1ticamente el tr\u00e1fico a estos cl\u00fasteres separados bas\u00e1ndose en la configuraci\u00f3n de la biblioteca, liberando al desarrollador de la aplicaci\u00f3n de la gesti\u00f3n de gran parte de la complejidad implicada.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u00c9stas y otras caracter\u00edsticas permiten que las implantaciones de Couchbase admitan una serie de fuertes <a href=\"https:\/\/www.couchbase.com\/blog\/es\/combine-clusters-to-achieve-high-availability\/\">alta disponibilidad<\/a> y estrategias de recuperaci\u00f3n en caso de cat\u00e1strofe. Para saber m\u00e1s antes de profundizar en los detalles de los clientes, eche un vistazo a estos recursos:<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Introducci\u00f3n a Couchbase HA\/DR - <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/ha-dr\/ha-dr-intro.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/ha-dr\/ha-dr-intro.html\">Documentaci\u00f3n sobre alta disponibilidad y recuperaci\u00f3n tras cat\u00e1strofes<\/a><br \/>\nCouchbase XDCR - <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/xdcr\/xdcr-intro.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/xdcr\/xdcr-intro.html\">Documentaci\u00f3n XDCR<\/a><br \/>\nSeminario web XDCR\/MCA (incluye demostraci\u00f3n t\u00e9cnica) - <a title=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" href=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" rel=\"noopener noreferrer\">Seminario web HA\/DR<\/a><br \/>\nTutorial del seminario web - <a title=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\/blob\/master\/Tutorial.adoc\" href=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\/blob\/master\/Tutorial.adoc\">Configuraci\u00f3n de clusters paso a paso, con XDCR<\/a><br \/>\nUna mirada m\u00e1s profunda a XDCR - <a title=\"https:\/\/www.couchbase.com\/blog\/deep-dive-cross-data-center-replication-xdcr\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/deep-dive-cross-data-center-replication-xdcr\/\">Profundizaci\u00f3n en la replicaci\u00f3n entre centros de datos (XDCR)<\/a> por <a title=\"https:\/\/twitter.com\/deniswsrosa\" href=\"https:\/\/twitter.com\/deniswsrosa\">Denis Rosa<\/a><br \/>\nConfiguraci\u00f3n de XDCR mediante Docker - <a title=\"https:\/\/www.couchbase.com\/blog\/replicate-nosql-data-between-datacenters-with-couchbase-xdcr\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/replicate-nosql-data-between-datacenters-with-couchbase-xdcr\/\">Replicar datos NoSQL entre centros de datos con Couchbase XDCR<\/a> por <a title=\"https:\/\/twitter.com\/nraboy\" href=\"https:\/\/twitter.com\/nraboy\">Nick Raboy<\/a><br \/>\nV\u00eddeo corto sobre la configuraci\u00f3n de XDCR utilizando Docker - <a title=\"https:\/\/www.couchbase.com\/blog\/use-xdcr-replicate-nosql-data-couchbase-docker-containers\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/use-xdcr-replicate-nosql-data-couchbase-docker-containers\/\">Usar XDCR para replicar datos NoSQL entre contenedores Couchbase Docker - Video Tutorial<\/a> por <a title=\"https:\/\/twitter.com\/nraboy\" href=\"https:\/\/twitter.com\/nraboy\">Nick Raboy<\/a><\/p>\n<\/div>\n<h2 id=\"_mca_client_details_in_brief\">Detalles del cliente de MCA en breve<\/h2>\n<div class=\"paragraph\">\n<p>El MCA Java SDK se basa en el est\u00e1ndar <a title=\"https:\/\/docs.couchbase.com\/java-sdk\/current\/start-using-sdk.html\" href=\"https:\/\/docs.couchbase.com\/java-sdk\/current\/start-using-sdk.html\">SDK Java de Couchbase<\/a>. La API b\u00e1sica imita en gran medida la del cliente est\u00e1ndar.<\/p>\n<\/div>\n<div class=\"paragraph\">En la actualidad, el cliente MCA a\u00f1ade otros grupos de funciones, entre las que se incluyen:<\/div>\n<ol>\n<li>La posibilidad de priorizar una lista de agrupaciones.<\/li>\n<li>Formas de proporcionar normas sobre lo que constituye un fracaso.<\/li>\n<li>API para coordinar las instancias cliente.<\/li>\n<li>Una interfaz de gesti\u00f3n.<\/li>\n<\/ol>\n<p>Discutiremos los dos primeros utilizando el ejemplo de c\u00f3digo. La gesti\u00f3n se realiza mediante programaci\u00f3n o a trav\u00e9s de una interfaz JMX. Esto permite a los administradores cambiar de cl\u00faster en la lista de prioridades. Queda fuera del alcance de este art\u00edculo.<\/p>\n<h2 id=\"_the_sample_application\">La aplicaci\u00f3n de ejemplo<\/h2>\n<div class=\"paragraph\">\n<p>Para ilustrar el uso del cliente MCA, tenemos una aplicaci\u00f3n de ejemplo sencilla. La aplicaci\u00f3n ejecuta un n\u00famero configurable de hilos en grupos. Un grupo simplemente lee de la base de datos, otro escribe nuevos registros aleatorios, otro lee documentos, los modifica y luego los vuelve a escribir, y otro realiza un sencillo <a title=\"n1ql\" href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">N1QL<\/a> consulta. La idea es proporcionar una variedad de cargas para aplicar contra un cl\u00faster. En <a title=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" href=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" rel=\"noopener noreferrer\">este seminario<\/a>Hemos utilizado esta aplicaci\u00f3n para ilustrar un comportamiento sencillo de conmutaci\u00f3n por error entre cl\u00fasteres.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Puedes encontrar el c\u00f3digo completo, junto con las instrucciones de construcci\u00f3n y otros materiales <a title=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\" href=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\">en GitHub<\/a>. A continuaci\u00f3n se muestra un ejemplo de invocaci\u00f3n ejecutada contra dos clusters de 3 nodos con 10 hilos actualizando documentos.<\/p>\n<\/div>\n<pre class=\"lang:sh decode:true\">java -jar mca-1.0.jar -c 172.23.123.4,172.23.123.5,172.23.123.6:172.23.122.55,172.23.122.56,172.23.122.57 -b my_bucket -i user -p password -u 10 -l statistics<\/pre>\n<p>Ahora, repasemos las partes principales del c\u00f3digo.<\/p>\n<h2 id=\"_code_walkthrough\">Gu\u00eda de c\u00f3digos<\/h2>\n<div class=\"paragraph\">\n<p>El c\u00f3digo de la aplicaci\u00f3n, en este caso, consiste en una clase principal y algunas clases simples de ayuda. Una vez que tenemos la instancia del cliente MCA, se utiliza casi exactamente igual que el cliente normal. Me centrar\u00e9, entonces, en la configuraci\u00f3n del cliente. El c\u00f3digo proviene de la clase\u00a0<a title=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\/blob\/master\/src\/main\/java\/com\/couchbase\/server\/mca\/ClusterBasics.java\" href=\"https:\/\/github.com\/couchbaselabs\/mca-java-sample\/blob\/master\/src\/main\/java\/com\/couchbase\/server\/mca\/ClusterBasics.java\">ClusterBasics<\/a> clase.<\/p>\n<\/div>\n<div class=\"sect3\">\n<h4 id=\"_cluster_nodes_and_groupings\">Nodos de cl\u00faster y agrupaciones<\/h4>\n<div class=\"paragraph\">\n<p>Los clusters se especifican en la l\u00ednea de comandos como grupos de nodos separados por dos puntos (<code>:<\/code>). Dentro de cada grupo, los nombres de los nodos o las direcciones IP est\u00e1n separados por comas. Impl\u00edcitamente, los clusters se especifican por orden de prioridad. Este bloque de c\u00f3digo descompone ese formato simple en conjuntos y crea una especificaci\u00f3n de cl\u00faster para cada cl\u00faster. (Una especificaci\u00f3n de cluster puede incluir un id para facilitar la referencia. No era necesario aqu\u00ed, pero vale la pena se\u00f1alarlo).<\/p>\n<\/div>\n<pre class=\"lang:java decode:true\">String[] clusters = options.stringValueOf(\"clusters\").split(\":\");\r\n\r\nList&lt;ClusterSpec&gt; specs = new ArrayList&lt;&gt;(clusters.length);\r\n\r\nfor (String cluster: clusters) {\r\n  Set&lt;String&gt; nodes = Arrays.stream(cluster.split(\",\")).collect(Collectors.toSet());\r\n  specs.add(ClusterSpec.create(nodes));\r\n}<\/pre>\n<\/div>\n<h4 id=\"_couchbase_service_types\">Tipos de servicio Couchbase<\/h4>\n<div class=\"paragraph\">\n<p>Hablaremos de la coordinaci\u00f3n y la monitorizaci\u00f3n de fallos en un momento. Puedes ajustar ambos por tipo de servicio. En este ejemplo, estamos utilizando la recuperaci\u00f3n directa de clave\/valor (<code>TipoServicio.BINARY<\/code>) y las consultas N1QL (<code>TipoServicio.QUERY<\/code>). Estas dos l\u00edneas siguientes preparan un conjunto de tipos de servicio para su uso posterior.<\/p>\n<\/div>\n<pre class=\"lang:java decode:true\">serviceTypes.add(ServiceType.BINARY);\r\nserviceTypes.add(ServiceType.QUERY);<\/pre>\n<h4 id=\"_inter_client_coordination\">Coordinaci\u00f3n entre clientes<\/h4>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n empezamos a ver la verdadera diferencia de capacidades de este cliente. <code>Coordinadores<\/code> gestionar la orquestaci\u00f3n del comportamiento a trav\u00e9s de instancias cliente. Actualmente, s\u00f3lo se han implementado coordinadores aislados, pero eso es apropiado para este caso de todos modos. Otros m\u00e1s sofisticados est\u00e1n previstos para el futuro. A\u00fan as\u00ed, mirando todas las opciones, puedes ver que incluso un coordinador aislado permite bastante control. He aqu\u00ed c\u00f3mo crear uno con algunas opciones no predeterminadas.<\/p>\n<\/div>\n<pre class=\"lang:java decode:true\">Coordinator coordinator = Coordinators.isolated(new IsolatedCoordinator.Options() \r\n  .clusterSpecs(specs) \r\n  .activeEntries(specs.size()) \r\n  .failoverNumNodes(2) \r\n  .gracePeriod(TIMEOUT) \r\n  .topologyBehavior(TopologyBehavior.WRAP_AT_END) \r\n  .serviceTypes(serviceTypes) \r\n);<\/pre>\n<div>\n<p>Notas de c\u00f3digo (por n\u00famero de l\u00ednea):<\/p>\n<ol>\n<li>Create an `IsolatedCoordinator` instance with the configured options<\/li>\n<li>Especifique los nodos para cada miembro de esta topolog\u00eda<\/li>\n<li>Establece el n\u00famero de clusters que se considerar\u00e1n activos<\/li>\n<li>Establece el n\u00famero de nodos individuales que fallan antes de que todo el cl\u00faster falle por completo.<\/li>\n<li>Per\u00edodo de gracia tras el fallo antes de la conmutaci\u00f3n del cl\u00faster<\/li>\n<li>Selecciona el comportamiento cuando se alcanza el final de una topolog\u00eda. Las alternativas incluyen permanecer en el cluster final, o retroceder a trav\u00e9s de la lista. La mejor opci\u00f3n depender\u00e1 de su escenario espec\u00edfico.<\/li>\n<li>Asignar los servicios gobernados<\/li>\n<\/ol>\n<h4 id=\"_failure_detection\">Detecci\u00f3n de fallos<\/h4>\n<div class=\"paragraph\">\n<p>El cliente puede monitorizar bastante informaci\u00f3n mientras funciona. Los detectores de fallos hacen uso de esta riqueza de informaci\u00f3n que ocurre bajo el cap\u00f3. La utilizan para enviar una se\u00f1al al coordinador. El coordinador puede entonces decidir c\u00f3mo responder.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A <code>TrafficMonitoringFailureDetector<\/code> observa las peticiones enviadas al servidor. Puedes configurar los tipos de errores (excepciones) a contar, el n\u00famero umbral de excepciones, el intervalo de tiempo en el que deben ocurrir y m\u00e1s. Yo suelo usar los valores por defecto y s\u00f3lo ajusto el recuento de operaciones fallidas y el intervalo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El cliente tambi\u00e9n tiene visibilidad de lo que ocurre con los nodos y el cl\u00faster directamente. Esto se captura utilizando un <code>NodeHealthFailureDetector<\/code>. Hay algunos matices que es mejor dejar para la documentaci\u00f3n. Aqu\u00ed s\u00f3lo utilizo los valores predeterminados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por \u00faltimo, puede construir combinaciones de condiciones complejas utilizando <code>ConjunctionFailureDetector<\/code> y <code>DisjunctionFailureDetector<\/code>. Piense que los detectores de conjunci\u00f3n realizan una \"y\" l\u00f3gica de los detectores constituyentes. La disyunci\u00f3n realiza una \"o\". Quiero que se dispare ante cualquier fallo, as\u00ed que conecto mi monitorizaci\u00f3n del tr\u00e1fico y de la salud a un <code>DisjunctionFailureDetector<\/code> para obtener el objeto detector final que se entregar\u00e1 al cliente.<\/p>\n<\/div>\n<pre class=\"lang:java decode:true\">TrafficMonitoringFailureDetector.Options trafficOptions = TrafficMonitoringFailureDetector.options() \r\n  .maxFailedOperations(5) \r\n  .failureInterval(60); \r\n\r\nFailureDetectorFactory&lt;TrafficMonitoringFailureDetector&gt; traffic = FailureDetectorFactories.trafficMonitoring(coordinator, trafficOptions); \r\n\r\nNodeHealthFailureDetector.Options healthOptions = NodeHealthFailureDetector.options();\r\n\r\nFailureDetectorFactory&lt;NodeHealthFailureDetector&gt; health = FailureDetectorFactories.nodeHealth(coordinator, healthOptions); \r\n\r\nDisjunctionFailureDetectorFactory detector = FailureDetectorFactories.disjunction(traffic, health);<\/pre>\n<p>Notas de c\u00f3digo (por n\u00famero de l\u00ednea):<\/p>\n<ol>\n<li>Instanciar y configurar el <code>TrafficMonitoringFailureDetector<\/code> opciones<\/li>\n<li>Fijar el n\u00famero de operaciones fallidas necesarias para indicar un problema<\/li>\n<li>Establezca el intervalo de tiempo en el que se almacenar\u00e1n los fallos.<\/li>\n<li value=\"5\">Crear un <code>TrafficMonitoringFailureDetector<\/code> con acceso a la base de datos <code>Coordinador<\/code> y nuestras opciones<\/li>\n<li value=\"9\">Crear un <code>NodeHealthFailureDetector<\/code> con opciones por defecto<\/li>\n<li value=\"11\">Define la l\u00f3gica final utilizando un <code>DisjunctionFailureDetector<\/code>de nuevo a trav\u00e9s de una f\u00e1brica<\/li>\n<\/ol>\n<\/div>\n<h4 id=\"_client_instantiation\">Instanciaci\u00f3n del cliente<\/h4>\n<div class=\"paragraph\">\n<p>Finalmente, instanciamos un cliente, y lo usamos para obtener una instancia de bucket. Para aquellos que no est\u00e9n familiarizados con Couchbase, los buckets son una abstracci\u00f3n organizativa de alto nivel. Puedes pensar en ellos como algo intermedio entre una tabla y una base de datos completa.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El manejador del bucket es todo lo que necesitamos para ejecutar las cargas contra nuestros clusters. Un cliente bucket multi-cluster te permite especificar tiempos de espera para operaciones individuales. Para simplificar, he envuelto la interfaz en una fachada, aplicando s\u00f3lo un tiempo de espera fijo a cada operaci\u00f3n. Esto hace que la interfaz sea id\u00e9ntica a la est\u00e1ndar.<\/p>\n<\/div>\n<pre class=\"lang:java decode:true\">MultiClusterClient client = new MultiClusterClient(coordinator, detector);\r\n\r\nclient.authenticate(options.stringValueOf(\"id\"), options.stringValueOf(\"password\"));\r\nbucket = new BucketFacade(client.openBucket(bucketName, null), TIMEOUT, TimeUnit.MILLISECONDS);<\/pre>\n<h2 id=\"_wrapping_up\">Conclusi\u00f3n<\/h2>\n<div class=\"paragraph\">\n<p>Eso es todo para los nuevos conceptos necesarios para arrancar con el cliente MCA. El resto del c\u00f3digo analiza las opciones, configura los hilos solicitados y los ejecuta en bucles. Hay algunas estad\u00edsticas. Hago llamadas para obtener los datos aleatorios para escribir y actualizar documentos, por lo que este c\u00f3digo no est\u00e1 optimizado para conducir la carga. Sin embargo, puede dar una idea del rendimiento que ofrece Couchbase.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>De nuevo, para ver todo esto en acci\u00f3n, junto con c\u00f3mo se comportan los clusters, echa un vistazo a la demostraci\u00f3n durante la segunda mitad de\u00a0<a title=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" href=\"https:\/\/event.on24.com\/eventRegistration\/EventLobbyServlet?target=reg20.jsp&amp;referrer=https%3A%2F%2Fwww.couchbase.com%2Fresources%2Fwebinars&amp;eventid=1569790&amp;sessionid=1&amp;key=86048A27BD53D35AFA6FFF8D43A09435&amp;regTag=&amp;sourcepage=register\" rel=\"noopener noreferrer\">este seminario<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Recientemente se ha publicado la versi\u00f3n 1.0 del cliente MCA. En el momento de redactar este art\u00edculo, se trata de una funci\u00f3n exclusiva de la edici\u00f3n Enterprise. Para obtener m\u00e1s informaci\u00f3n y acceso al cliente, habla con un representante de ventas de Couchbase (<a href=\"mailto:sales@couchbase.com\">sales@couchbase.com<\/a>). Tambi\u00e9n puede ponerse en contacto conmigo para obtener m\u00e1s informaci\u00f3n, como se describe a continuaci\u00f3n.<\/p>\n<\/div>\n<h3 id=\"_postscript\">Posdata<\/h3>\n<div class=\"paragraph\">Couchbase es de c\u00f3digo abierto y se puede probar gratuitamente.<\/div>\n<div class=\"paragraph\"><strong>Empezar<\/strong> con <a title=\"https:\/\/www.couchbase.com\/get-started\" href=\"https:\/\/developer.couchbase.com\/tutorials\">c\u00f3digo de ejemplo, consultas de ejemplo, tutoriales y mucho m\u00e1s<\/a>.<\/div>\n<div class=\"paragraph\">M\u00e1s recursos en nuestra <a title=\"https:\/\/developer.couchbase.com\/community?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" href=\"https:\/\/developer.couchbase.com\/community?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">portal para desarrolladores.<\/a><\/div>\n<div class=\"paragraph\">S\u00edguenos en Twitter <a title=\"https:\/\/twitter.com\/CouchbaseDev\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<\/div>\n<div class=\"paragraph\">Puede enviar preguntas a nuestro <a title=\"https:\/\/www.couchbase.com\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">foros<\/a>.<\/div>\n<div class=\"paragraph\">Y participamos activamente en <a title=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<\/div>\n<div class=\"paragraph\">Env\u00edame tus preguntas, comentarios, temas que te gustar\u00eda ver, etc. a Twitter. <a title=\"https:\/\/twitter.com\/HodGreeley\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>In this post, I\u2019m going to take a look at a sample application that uses the Couchbase Server Multi-Cluster Aware (MCA) Java client. This client goes hand-in-hand with Couchbase\u2019s Cross-Data Center Replication (XDCR) capabilities. XDCR supports flexible replication of data [&hellip;]<\/p>","protected":false},"author":73,"featured_media":4519,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,9415,1818],"tags":[2127,2126,1725],"ppma_author":[9042],"class_list":["post-4641","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-xdcr","category-java","tag-disaster-recovery","tag-high-availability","tag-nosql-database"],"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>Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client<\/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\/es\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client\" \/>\n<meta property=\"og:description\" content=\"In this post, I\u2019m going to take a look at a sample application that uses the Couchbase Server Multi-Cluster Aware (MCA) Java client. This client goes hand-in-hand with Couchbase\u2019s Cross-Data Center Replication (XDCR) capabilities. XDCR supports flexible replication of data [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-19T23:01:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:46:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1673\" \/>\n\t<meta property=\"og:image:height\" content=\"1056\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client\",\"datePublished\":\"2018-02-19T23:01:36+00:00\",\"dateModified\":\"2025-06-14T03:46:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\"},\"wordCount\":1326,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png\",\"keywords\":[\"Disaster Recovery\",\"High Availability\",\"NoSQL Database\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"Cross Data Center Replication (XDCR)\",\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\",\"name\":\"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png\",\"datePublished\":\"2018-02-19T23:01:36+00:00\",\"dateModified\":\"2025-06-14T03:46:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png\",\"width\":1673,\"height\":1056},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducci\u00f3n a Couchbase HA\/DR: Cliente Java Multi-Cluster Aware","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\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/","og_locale":"es_MX","og_type":"article","og_title":"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client","og_description":"In this post, I\u2019m going to take a look at a sample application that uses the Couchbase Server Multi-Cluster Aware (MCA) Java client. This client goes hand-in-hand with Couchbase\u2019s Cross-Data Center Replication (XDCR) capabilities. XDCR supports flexible replication of data [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-02-19T23:01:36+00:00","article_modified_time":"2025-06-14T03:46:29+00:00","og_image":[{"width":1673,"height":1056,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png","type":"image\/png"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client","datePublished":"2018-02-19T23:01:36+00:00","dateModified":"2025-06-14T03:46:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/"},"wordCount":1326,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png","keywords":["Disaster Recovery","High Availability","NoSQL Database"],"articleSection":["Best Practices and Tutorials","Couchbase Server","Cross Data Center Replication (XDCR)","Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/","name":"Introducci\u00f3n a Couchbase HA\/DR: Cliente Java Multi-Cluster Aware","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png","datePublished":"2018-02-19T23:01:36+00:00","dateModified":"2025-06-14T03:46:29+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/01\/HADR-2.png","width":1673,"height":1056},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-high-availability-disaster-recovery-java-multi-cluster-aware-client\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Intro to Couchbase HA\/DR: Java Multi-Cluster Aware Client"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4641","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4641"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4641\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4519"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4641"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}