{"id":4093,"date":"2017-10-30T09:05:19","date_gmt":"2017-10-30T16:05:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4093"},"modified":"2025-06-13T15:55:15","modified_gmt":"2025-06-13T22:55:15","slug":"fast-failover-couchbase-server-5","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/fast-failover-couchbase-server-5\/","title":{"rendered":"Failover r\u00e1pido con Couchbase Server 5.0"},"content":{"rendered":"<div class=\"paragraph\">\n<p>La conmutaci\u00f3n r\u00e1pida por error es una de las muchas mejoras que incorpora la versi\u00f3n de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Servidor Couchbase 5.0<\/a> (ya disponible para descargar).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>La conmutaci\u00f3n por error es uno de los conceptos importantes que hay que entender cuando se trata de bases de datos distribuidas. <a href=\"https:\/\/www.infoq.com\/articles\/cap-twelve-years-later-how-the-rules-have-changed\">El teorema CAP<\/a> establece que una base de datos distribuida no puede estar disponible a la vez <em>y<\/em> coherente <em>todos<\/em> del tiempo. La arquitectura de Couchbase Server est\u00e1 dise\u00f1ada para ser <em>siempre<\/em> consistente, y tolerar particiones. Con la r\u00e1pida conmutaci\u00f3n por error, Couchbase Server est\u00e1 cerrando la brecha en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/combine-clusters-to-achieve-high-availability\/\">alta disponibilidad<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En esta entrada de blog, voy a demostrar la conmutaci\u00f3n por error en acci\u00f3n. Usar\u00e9 Docker para crear un cl\u00faster de 3 nodos Couchbase en mi m\u00e1quina local.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Puedes seguir el ejemplo de c\u00f3digo en esta entrada del blog: es <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/084FastFailoverNet\/src\/FastFailoverDemo\">disponible en GitHub<\/a>.<\/em><\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_fast_failover_overview\">Visi\u00f3n general de la conmutaci\u00f3n r\u00e1pida por error<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Necesitar\u00e1s un poco de preparaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Primero, crea un cluster de 3 nodos (al menos) de Couchbase Server. Hay varias formas de hacerlo, incluyendo <a href=\"https:\/\/github.com\/couchbaselabs\/vagrants\">Vagabundos<\/a>M\u00e1quinas virtuales, m\u00e1quinas reales, <a href=\"https:\/\/www.couchbase.com\/blog\/es\/azure-getting-started-easy-free\/\">Azure<\/a>y mucho m\u00e1s.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Opt\u00e9 por utilizar Docker. Ya escrib\u00ed en el blog c\u00f3mo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/docker-and-asp-net-core-with-couchbase-server\/\">crear un Cluster Couchbase en Docker y acceder a \u00e9l con una aplicaci\u00f3n .NET Core<\/a> (\u00a1no te olvides de la red de puentes!). As\u00ed que volv\u00ed a seguir las mismas instrucciones. La \u00fanica diferencia es que utilic\u00e9 una aplicaci\u00f3n de consola en lugar de una aplicaci\u00f3n ASP.NET (sobre la que puedes leer m\u00e1s adelante en este post).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/08401-three-couchbase-nodes.png\" alt=\"Three Couchbase Server nodes\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Utilic\u00e9 el <a href=\"https:\/\/hub.docker.com\/r\/couchbase\/server\/tags\/\">Imagen Couchbase Server 5.0.0-beta2 de Docker Hub<\/a>pero para cuando leas esto, la versi\u00f3n oficial de Couchbase Server 5.0 ya estar\u00e1 disponible. <a href=\"https:\/\/hub.docker.com\/r\/library\/couchbase\/tags\/\">disponible en el repositorio oficial de docker Couchbase<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, cree un bucket llamado \"mybucket\". Aseg\u00farate de habilitar las r\u00e9plicas para crear copias adicionales de datos dentro del mismo cl\u00faster.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/08402-bucket.png\" alt=\"Couchbase Server bucket\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Despu\u00e9s de eso, crea un usuario (yo llam\u00e9 al m\u00edo \"myuser\") con al menos permiso de Data Writer y Data Reader para \"mybucket\"). <em>Si a\u00fan no est\u00e1 familiarizado con Couchbase Server <a href=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-rbac-security-for-collections\/\">Control de acceso basado en funciones (RBAC)<\/a>empezar con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/authentication-authorization-rbac-net\/\">esta entrada del blog sobre Autenticaci\u00f3n con RBAC y .NET.<\/a><\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/08403-user.png\" alt=\"Couchbase Server user\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por \u00faltimo, activa la conmutaci\u00f3n por error r\u00e1pida autom\u00e1tica. Desde la Consola de Couchbase, ve a Configuraci\u00f3n, y luego a Auto-Failover. Marca la casilla \"Activar auto-failover\". A partir de la versi\u00f3n 5.0, puedes establecer el valor de Timeout a tan s\u00f3lo 5 (segundos). Anteriormente, el valor ten\u00eda que ser de al menos 30 segundos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/08404-fast-failover-enable.png\" alt=\"Enable fast failover\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Hay una raz\u00f3n por la que el auto-failover est\u00e1 desactivado por defecto. Por favor, revise la <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/clustersetup\/automatic-failover.html\">documentaci\u00f3n sobre la conmutaci\u00f3n autom\u00e1tica por error<\/a> para asegurarte de que te conviene.<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"__net_example\">Ejemplo .NET<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Ahora que tienes un cluster de 3 nodos corriendo dentro de tu host Docker, es hora de escribir una aplicaci\u00f3n de demostraci\u00f3n. Decid\u00ed escribir una aplicaci\u00f3n de consola que continuamente realizara lecturas contra Couchbase. En alg\u00fan momento, \"desconectar\u00e9\" uno de los nodos para mostrar la conmutaci\u00f3n r\u00e1pida autom\u00e1tica en acci\u00f3n.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_connecting_to_the_cluster\">Conexi\u00f3n al cl\u00faster<\/h3>\n<div class=\"paragraph\">\n<p>Despu\u00e9s de crear una nueva aplicaci\u00f3n de consola .NET Core en Visual Studio, a\u00f1ad\u00ed el archivo <a href=\"https:\/\/www.nuget.org\/packages\/CouchbaseNetClient\/\">Couchbase .NET SDK (actualmente versi\u00f3n 2.5.1) usando NuGet<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, he creado una configuraci\u00f3n para conectarse al cl\u00faster de 3 nodos, autenticar a \"myuser\", y abrir \"mybucket\".<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var clientConfig = new ClientConfiguration\r\n{\r\n    Servers = new List&lt;Uri&gt;\r\n    {\r\n        new Uri(\"https:\/\/172.17.0.2\"),\r\n        new Uri(\"https:\/\/172.17.0.3\"),\r\n        new Uri(\"https:\/\/172.17.0.4\")\r\n    }\r\n};\r\nvar cluster = new Cluster(clientConfig);\r\n\r\nvar credentials = new PasswordAuthenticator(\"myuser\", \"password\");\r\ncluster.Authenticate(credentials);\r\n\r\n_bucket = cluster.OpenBucket(\"mybucket\");<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Esas direcciones IP son las direcciones que <em>interno<\/em> al host Docker. Esta aplicaci\u00f3n .NET Core tambi\u00e9n se ejecutar\u00e1 dentro del host Docker, donde se resolver\u00e1n esas direcciones IP. Desde <em>fuera de<\/em> el host docker, s\u00f3lo se resolver\u00e1 \"localhost:8091\" (suponiendo que est\u00e1 siguiendo la etiqueta <a href=\"https:\/\/www.couchbase.com\/blog\/es\/docker-and-asp-net-core-with-couchbase-server\/\">tutorial<\/a> que he enlazado antes). Si no est\u00e1s usando Docker, pon las direcciones IP de las m\u00e1quinas Azure, las VMs, etc, en su lugar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Siguiente, <code>Contrase\u00f1aAutenticaci\u00f3n<\/code> para garantizar el acceso a los cubos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por \u00faltimo, obtenga un objeto cubo utilizando <code>OpenBucket<\/code>.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_setting_up_documents\">Creaci\u00f3n de documentos<\/h3>\n<div class=\"paragraph\">\n<p>Para esta demostraci\u00f3n, quiero crear un mont\u00f3n de documentos de los que luego leer\u00e9 repetidamente. En primer lugar, escrib\u00ed un bucle para crear un n\u00famero arbitrario de documentos, que cada uno tiene una clave como \"documentKey[num]\" (por ejemplo, \"documentKey1\", \"documentKey2\", etc).<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var docKeys = new List&lt;string&gt;();\r\nfor (var i = 0; i &lt; numDocuments; i++)\r\n{\r\n    var key = \"documentKey\" + i;\r\n    docKeys.Add(key);\r\n    _bucket.Upsert(key, new { name = \"Document\" + i });\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>En mi c\u00f3digo, <code>n\u00fameroDocumentos<\/code> est\u00e1 fijado en 50. Pero si usted est\u00e1 siguiendo a lo largo, no dude en establecer que a otro n\u00famero y ver qu\u00e9 pasa.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_reading_documents\">Lectura de documentos<\/h3>\n<div class=\"paragraph\">\n<p>Por lo tanto, hay 50 documentos con claves conocidas. El resto del programa ser\u00e1 un bucle continuo. Cada iteraci\u00f3n del bucle intentar\u00e1 recuperar los 50 documentos.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var iteration = 0;\r\nwhile (true)\r\n{\r\n    Console.WriteLine($\"Getting {numDocuments} documents [{iteration++}]\");\r\n    foreach(var docKey in docKeys)\r\n    {\r\n        var result = _bucket.Get&lt;dynamic&gt;(docKey);\r\n        if(terse)\r\n            ShowResultTerse(result, docKey);\r\n        else\r\n            ShowResult(result, docKey);\r\n    }\r\n    Console.WriteLine();\r\n\r\n    Thread.Sleep(2000);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>En primer lugar, observa que hay un bucle dentro del bucle. El bucle interior se ejecutar\u00e1 50 veces para realizar un <code>Visite<\/code> en cada documento. <code>MostrarResultado<\/code> mostrar\u00e1 lo que ocurre en la consola (<code>MostrarResultadoTerse<\/code> hace lo mismo, pero de forma mucho m\u00e1s compacta. <code>MostrarResultado<\/code> est\u00e1 m\u00e1s abajo, pero en las capturas de pantalla posteriores se utilizar\u00e1 <code>MostrarResultadoTerse<\/code>).<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">private static void ShowResult(IOperationResult&lt;dynamic&gt; result, string id)\r\n{\r\n    \/\/ happy path, document was found\r\n    if (result.Success)\r\n    {\r\n        Console.WriteLine(\"Result: success\");\r\n        return;\r\n    }\r\n\r\n    \/\/ error, possibly node down\r\n    \/\/ show error, try to get replica\r\n    Console.WriteLine($\"Result: unsuccessful {result.Message}\");\r\n    Console.WriteLine(\"\\tAttempting to get replica.\");\r\n\r\n    var replica = _bucket.GetFromReplica&lt;dynamic&gt;(id);\r\n\r\n    \/\/ happy path for replica, it was found\r\n    if (replica.Success)\r\n    {\r\n        Console.WriteLine(\"\\tReplica result: success\");\r\n        return;\r\n    }\r\n\r\n    \/\/ error! replication may not be configured\r\n    \/\/ or it's possible something catastrophic happened\r\n    \/\/ this should be rare, but definitely want to log it\r\n    \/\/ maybe retry and\/or escalate\r\n    \/\/ in this example, it's just logged to console\r\n    Console.WriteLine(\"\\tReplica result unsuccessful: {result.Message}\");\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Los comentarios le ayudar\u00e1n a seguir el hilo, pero <code>MostrarResultado<\/code> hace tres comprobaciones:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>\u00bfHa tenido \u00e9xito la lectura? Si es as\u00ed, ind\u00edcalo. \u00a1Listo! Si no...<\/li>\n<li>Intenta obtener una r\u00e9plica (de otro nodo). \u00bfTuvo \u00e9xito? Si es as\u00ed, env\u00edalo. \u00a1Listo! Si no...<\/li>\n<li>La aplicaci\u00f3n no ha podido leer el documento o una de sus r\u00e9plicas. En este ejemplo, esto va a ser muy raro. En realidad, podr\u00eda significar que el documento no existe, o que la replicaci\u00f3n no est\u00e1 configurada correctamente, o que algo m\u00e1s ha ido mal.<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>Entonces, est\u00e1s listo para ejecutar la aplicaci\u00f3n. Si est\u00e1s usando Docker, no olvides ejecutar esta aplicaci\u00f3n en Docker (que es <a href=\"https:\/\/www.couchbase.com\/blog\/es\/docker-and-asp-net-core-with-couchbase-server\/\">f\u00e1cil de hacer desde Visual Studio<\/a>). <em>(Aseg\u00farese tambi\u00e9n de conectar el contenedor de aplicaciones .NET Core a la red puente de Docker).<\/em><\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_pull_the_plug\">\u00a1Tira del enchufe!<\/h3>\n<div class=\"paragraph\">\n<p>Antes de desconectar uno de los nodos, veamos cu\u00e1l es la salida \"normal\" cuando se ejecuta la aplicaci\u00f3n .NET Core anterior.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En el siguiente GIF, lo ver\u00e1s:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Un cl\u00faster de tres nodos de Couchbase Server<\/li>\n<li>Cambiar a Visual Studio<\/li>\n<li>Cree e inicie el contenedor Docker con CTRL+F5<\/li>\n<li>La (escueta) salida de consola del contenedor Docker<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5660 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/08405-docker-output-min-compressed.gif\" alt=\"Console output from Docker\" width=\"700\" height=\"379\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>(He acelerado un poco la animaci\u00f3n). Observe que \"S\" se muestra 50 veces. Esto significa que cada documento ha sido recuperado con \u00e9xito.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, vamos a mostrar la conmutaci\u00f3n r\u00e1pida por error en acci\u00f3n. Voy a \"desconectar\" uno de los nodos. Con Docker, puedo ejecutar <code>docker stop db2<\/code>por ejemplo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hay mucho que controlar a la vez, as\u00ed que he creado un breve v\u00eddeo que muestra lo que ocurre.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>[youtube https:\/\/www.youtube.com\/watch?v=KbU5eG2R9XU&amp;w=700&amp;h=394]<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Lo que est\u00e1s viendo en ese video es:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>Funcionamiento normal (todas las \"S\" de \u00e9xito)<\/li>\n<li>Un nodo detenido (con Docker)<\/li>\n<li>Couchbase detecta que un nodo est\u00e1 ca\u00eddo.<\/li>\n<li>Couchbase iniciando fast failover para activar r\u00e9plicas.<\/li>\n<li>Durante ese periodo de conmutaci\u00f3n por error, ya no es todo \"S\". Tambi\u00e9n hay algunas \"R\" de r\u00e9plicas (que son de s\u00f3lo lectura).<\/li>\n<li>Cuando finaliza la conmutaci\u00f3n por error, los resultados vuelven a ser todos \"S\".<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>El objetivo de la conmutaci\u00f3n r\u00e1pida es reducir el periodo de tiempo en el que no todos los documentos est\u00e1n totalmente disponibles.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Resumen<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Couchbase Server 5.0 ha mejorado la conmutaci\u00f3n por error con una opci\u00f3n de \"conmutaci\u00f3n por error r\u00e1pida\" que puede ser \u00fatil para entornos con redes s\u00f3lidas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Esta entrada de blog muestra una aplicaci\u00f3n de consola que pretende demostrar la conmutaci\u00f3n por error r\u00e1pida. No es una aplicaci\u00f3n muy \u00fatil fuera de eso, pero puede tomar los principios y aplicarlos a un sitio web ASP.NET o ASP.NET Core.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Echa un vistazo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Servidor Couchbase 5.0<\/a> hoy mismo para disfrutar de esta y otras fant\u00e1sticas novedades.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Un agradecimiento especial a <a href=\"https:\/\/www.couchbase.com\/blog\/es\/author\/jeff-morris\/\">Jeff Morris<\/a> y al equipo del SDK por ayudarnos con esta entrada del blog.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Aqu\u00ed tienes algunos enlaces para obtener m\u00e1s informaci\u00f3n sobre la conmutaci\u00f3n r\u00e1pida por error:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>En <a href=\"https:\/\/github.com\/couchbaselabs\/sdk-rfcs\/blob\/master\/rfc\/0024-fast-failover.md\">SDK RFC<\/a> para una r\u00e1pida conmutaci\u00f3n por error. Este documento cubre .NET, pero tambi\u00e9n Java, libcouchbase y Go.<\/li>\n<li><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/clustersetup\/automatic-failover.html\">Documentaci\u00f3n sobre conmutaci\u00f3n autom\u00e1tica por error<\/a> para Couchbase Server.<\/li>\n<li><a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/084FastFailoverNet\/src\/FastFailoverDemo\">C\u00f3digo fuente de la aplicaci\u00f3n de consola .NET Core<\/a> utilizado en esta entrada del blog (GitHub)<\/li>\n<li>Dos JIRA tickets para .NET fast failover: <a href=\"https:\/\/issues.couchbase.com\/browse\/NCBC-1366\">NCBC-1366<\/a> y <a href=\"https:\/\/issues.couchbase.com\/browse\/NCBC-1388\">NCBC-1388<\/a>.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Si tiene preguntas o comentarios sobre la conmutaci\u00f3n por error, no deje de consultar el <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Foros de Couchbase<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por favor, deja tus preguntas y comentarios sobre todo lo relacionado con .NET y Couchbase o encu\u00e9ntrame en <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Fast failover is one of the many improvements that come with the release of Couchbase Server 5.0 (now available for download). Failover is one of the important concepts to understand when it comes to distributed databases. The CAP theorem states [&hellip;]<\/p>","protected":false},"author":71,"featured_media":4098,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,1816],"tags":[1519],"ppma_author":[8937],"class_list":["post-4093","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-couchbase-server","tag-docker"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fast Failover with Couchbase Server 5.0 - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.\" \/>\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\/fast-failover-couchbase-server-5\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fast Failover with Couchbase Server 5.0\" \/>\n<meta property=\"og:description\" content=\"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/fast-failover-couchbase-server-5\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-30T16:05:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T22:55:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"681\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Fast Failover with Couchbase Server 5.0\",\"datePublished\":\"2017-10-30T16:05:19+00:00\",\"dateModified\":\"2025-06-13T22:55:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/\"},\"wordCount\":1292,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg\",\"keywords\":[\"docker\"],\"articleSection\":[\".NET\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/\",\"name\":\"Fast Failover with Couchbase Server 5.0 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg\",\"datePublished\":\"2017-10-30T16:05:19+00:00\",\"dateModified\":\"2025-06-13T22:55:15+00:00\",\"description\":\"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg\",\"width\":1024,\"height\":681,\"caption\":\"https:\/\/commons.wikimedia.org\/wiki\/File:Holborn_Tube_Station_Escalator.jpg - Creative Commons - \\\"Holborn Tube Station Escalator\\\" by renaissancechambara\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fast Failover with Couchbase Server 5.0\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fast Failover with Couchbase Server 5.0 - The Couchbase Blog","description":"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.","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\/fast-failover-couchbase-server-5\/","og_locale":"es_MX","og_type":"article","og_title":"Fast Failover with Couchbase Server 5.0","og_description":"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/fast-failover-couchbase-server-5\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-10-30T16:05:19+00:00","article_modified_time":"2025-06-13T22:55:15+00:00","og_image":[{"width":1024,"height":681,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Fast Failover with Couchbase Server 5.0","datePublished":"2017-10-30T16:05:19+00:00","dateModified":"2025-06-13T22:55:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/"},"wordCount":1292,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg","keywords":["docker"],"articleSection":[".NET","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/","url":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/","name":"Fast Failover with Couchbase Server 5.0 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg","datePublished":"2017-10-30T16:05:19+00:00","dateModified":"2025-06-13T22:55:15+00:00","description":"Fast failover is a new feature of Couchbase Server 5.0. This blog post demonstrates with a .NET Core console application and a Docker cluster.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/084-hero-escalator-failover.jpg","width":1024,"height":681,"caption":"https:\/\/commons.wikimedia.org\/wiki\/File:Holborn_Tube_Station_Escalator.jpg - Creative Commons - \"Holborn Tube Station Escalator\" by renaissancechambara"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fast-failover-couchbase-server-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Fast Failover with Couchbase Server 5.0"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4093","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4093"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4093\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4098"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4093"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}