{"id":635,"date":"2025-02-06T10:00:00","date_gmt":"2025-02-06T10:00:00","guid":{"rendered":"https:\/\/cloudlab.urv.cat\/catedracloud\/?p=635"},"modified":"2025-01-05T14:07:14","modified_gmt":"2025-01-05T14:07:14","slug":"desafiando-el-teorema-cap-como-google-spanner-logra-consistencia-y-disponibilidad-global","status":"publish","type":"post","link":"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/02\/06\/desafiando-el-teorema-cap-como-google-spanner-logra-consistencia-y-disponibilidad-global\/","title":{"rendered":"Desafiando el Teorema CAP: C\u00f3mo Google Spanner logra Consistencia y Disponibilidad Global"},"content":{"rendered":"\n<p>El <a href=\"https:\/\/sites.cs.ucsb.edu\/~rich\/class\/cs293b-cloud\/papers\/brewer-cap.pdf\" data-type=\"link\" data-id=\"https:\/\/sites.cs.ucsb.edu\/~rich\/class\/cs293b-cloud\/papers\/brewer-cap.pdf\">Teorema CAP<\/a> es un principio fundamental en el dise\u00f1o de sistemas distribuidos que implica que, en presencia de una partici\u00f3n de la red, un sistema debe elegir entre mantener la consistencia o el 100% de disponibilidad. En 2017, <a href=\"https:\/\/cloud.google.com\/blog\/products\/databases\/inside-cloud-spanner-and-the-cap-theorem\">Google present\u00f3 Spanner para Google Cloud<\/a>, una base de datos global SQL que desafiaba el teorema CAP: Spanner puede ofrecer consistencia y disponibilidad frente a particiones de red, a pesar de estar altamente distribuido a nivel global. \u00bfC\u00f3mo es esto posible? En este blog explicamos el teorema CAP y su relaci\u00f3n con Spanner.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Entendiendo el teorema CAP<\/strong><\/h2>\n\n\n\n<p>El Teorema CAP establece que, en un sistema distribuido, es imposible garantizar simult\u00e1neamente estas tres siguientes propiedades:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Consistencia (Consistency): <\/strong>Todos los nodos del sistema tienen la misma vista de los datos, la m\u00e1s reciente, en cualquier momento dado.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Disponibilidad (Availability): <\/strong>El 100% de las solicitudes de un cliente recibe una respuesta, tanto para lecturas como escrituras.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tolerancia a particiones (Partition Tolerance): <\/strong>El sistema sigue funcionando incluso si hay una partici\u00f3n en la red que impide la comunicaci\u00f3n entre algunos o todos los nodos.<\/li>\n<\/ul>\n\n\n\n<p>El teorema CAP implica que un sistema distribuido, como una base de datos, puede cumplir con dos de las tres propiedades a la vez, pero no con las tres simult\u00e1neamente. Esto significa que los dise\u00f1adores de sistemas distribuidos deben elegir dos de las caracter\u00edsticas y sacrificar la tercera, seg\u00fan la necesidad o objetivo de cada sistema. Seg\u00fan el Teorema CAP, en presencia de una partici\u00f3n de la red, un sistema debe elegir entre consistencia y disponibilidad. Por lo tanto, esto nos deja con dos posibilidades:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CP: <\/strong>Frente a una partici\u00f3n de red, el sistema es consistente, por lo que algunas peticiones de lecturas o escrituras fallar\u00e1. Este es el modelo que implementa MongoDB.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AP:<\/strong> Frente a una partici\u00f3n de red, el sistema atiende el 100% de las peticiones de lectura y escritura, pero puede devolver datos antiguos que no est\u00e1n actualizados. En este caso, al restaurar la partici\u00f3n de red, se deber\u00e1n aplicar mecanismos para hacer que el sistema recupere su consistencia. Este es el modelo que implementa Cassandra.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 garant\u00edas tiene Spanner: \u00bfconsistencia o disponibilidad?<\/h2>\n\n\n\n<p><a href=\"https:\/\/cloud.google.com\/blog\/products\/databases\/inside-cloud-spanner-and-the-cap-theorem\">Spanner sostiene que es tanto consistente como altamente disponible<\/a> pese a ser un sistema distribuido a nivel global, haci\u00e9ndolo un sistema CA. Entonces, \u00bfSpanner no contempla particiones de red? En un sistema distribuido, las particiones siempre pueden ocurrir, incluso a la escala de la nube de Google. La respuesta es que, en realidad, Spanner s\u00ed tolera particiones, en las que se prioriza la consistencia sobre la disponibilidad, lo que lo convierte t\u00e9cnicamente en un sistema CP.<\/p>\n\n\n\n<p>\u00bfC\u00f3mo puede Spanner entonces ser altamente disponible? La cuesti\u00f3n aqu\u00ed es que, el teorema CAP contempla un 100% de disponibilidad. Aunque ning\u00fan sistema garantiza una disponibilidad del 100%, en la pr\u00e1ctica, Spanner ofrece una disponibilidad tan alta que la mayor\u00eda de los usuarios no deben preocuparse de la disponibilidad. Spanner anuncia que alcanza m\u00e1s de cinco nueves de disponibilidad (99.999% de disponibilidad,&nbsp; menos de una falla en 100.000).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La trampa: evitar las particiones de red<\/h2>\n\n\n\n<p><a href=\"https:\/\/static.googleusercontent.com\/media\/research.google.com\/en\/\/pubs\/archive\/45855.pdf\">La alta disponibilidad de Spanner se debe a la red global privada de Google y las mejoras operativas que mitigan o hasta llegan a evitar las particiones.<\/a> Google controla completamente su red cloud privada, en vez de utilizar una wide are network \u201cdescontrolada\u201d como internet, y asegura redundancia de caminos de red entre los centros de datos. De hecho, el riesgo principal no es un hecho f\u00edsico, como la ca\u00edda de un operador de red, sin\u00f3 las actualizaciones de software que puedan contener fallos que rompan m\u00faltiples caminos simult\u00e1neamente, un riesgo que Google trabaja constantemente para prevenir y mitigar.<\/p>\n\n\n\n<p>A\u00fan as\u00ed, Spanner tolera particiones implementando un complejo sistema de coordinaci\u00f3n entre los nodos de la base de datos. Spanner utiliza two-phase commit (2PC) y bloqueo estricto de dos fases para asegurar la consistencia. Aunque 2PC impide la disponibilidad total, pero Spanner lo mitiga utilizando grupos Paxos, que permiten que cada miembro sea altamente disponible. Esto puede resultar en que algunos usuarios queden sin acceso, pero la mayor\u00eda de los servicios multi-regi\u00f3n seguir\u00e1n siendo operativos. Adem\u00e1s, Spanner utiliza TrueTime, un sistema de sincronizaci\u00f3n global de tiempo que contribuye significativamente a garantizar las transacciones multi-regiones en situaciones de fallos de red. Spanner tambi\u00e9n soporta \u201csnapshots\u201d, que son consistentes y no requieren bloqueos.<\/p>\n\n\n\n<p>En resumen, Spanner puede ser visto como dos tipos de sistema, seg\u00fan el teorema CAP: CP + A, pero no al 100%; o bien CA + P cercana a cero.<\/p>\n\n\n\n<p>Fuentes:<br><a href=\"https:\/\/cloud.google.com\/blog\/products\/databases\/inside-cloud-spanner-and-the-cap-theorem\">https:\/\/cloud.google.com\/blog\/products\/databases\/inside-cloud-spanner-and-the-cap-theorem<\/a><br><a href=\"https:\/\/static.googleusercontent.com\/media\/research.google.com\/en\/\/pubs\/archive\/45855.pdf\">https:\/\/static.googleusercontent.com\/media\/research.google.com\/en\/\/pubs\/archive\/45855.pdf<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El Teorema CAP es un principio fundamental en el dise\u00f1o de sistemas distribuidos que implica que, en presencia de una partici\u00f3n de la red, un sistema debe elegir entre mantener la consistencia o el 100% de disponibilidad. En 2017, Google present\u00f3 Spanner para Google Cloud, una base de datos global SQL que desafiaba el teorema [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":637,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","_swt_meta_header_display":false,"_swt_meta_footer_display":false,"_swt_meta_site_title_display":false,"_swt_meta_sticky_header":false,"_swt_meta_transparent_header":false,"footnotes":""},"categories":[34],"tags":[],"class_list":["post-635","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-almacenamiento"],"jetpack_featured_media_url":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner.webp","uagb_featured_image_src":{"full":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner.webp",1200,630,false],"thumbnail":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner-150x150.webp",150,150,true],"medium":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner-300x158.webp",300,158,true],"medium_large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner-768x403.webp",768,403,true],"large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner-1024x538.webp",1024,538,true],"1536x1536":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner.webp",1200,630,false],"2048x2048":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/01\/googlecloud-cloud-spanner.webp",1200,630,false]},"uagb_author_info":{"display_name":"Aitor Arjona","author_link":"https:\/\/cloudlab.urv.cat\/catedracloud\/author\/aitor\/"},"uagb_comment_info":5,"uagb_excerpt":"El Teorema CAP es un principio fundamental en el dise\u00f1o de sistemas distribuidos que implica que, en presencia de una partici\u00f3n de la red, un sistema debe elegir entre mantener la consistencia o el 100% de disponibilidad. En 2017, Google present\u00f3 Spanner para Google Cloud, una base de datos global SQL que desafiaba el teorema&hellip;","_links":{"self":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/comments?post=635"}],"version-history":[{"count":2,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/635\/revisions"}],"predecessor-version":[{"id":638,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/635\/revisions\/638"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media\/637"}],"wp:attachment":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media?parent=635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/categories?post=635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/tags?post=635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}