{"id":7272,"date":"2019-08-09T10:00:48","date_gmt":"2019-08-09T17:00:48","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7272"},"modified":"2024-09-12T02:30:29","modified_gmt":"2024-09-12T09:30:29","slug":"introduction-to-jepsen-testing-at-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/introduction-to-jepsen-testing-at-couchbase\/","title":{"rendered":"Introducci\u00f3n A Las Pruebas Jepsen En Couchbase"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Introducci\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Como la mayor\u00eda de vosotros sab\u00e9is, Couchbase es una base de datos que proporciona a los usuarios una serie de opciones de consistencia y tolerancia a fallos para asegurar que el estado de sus datos cumple ciertos criterios o garant\u00edas. Los usuarios pueden especificar distintos niveles de replicaci\u00f3n, persistencia, r\u00e9plicas, grupos de servidores, etc. para garantizar que sus datos sean duraderos, consistentes y correctos bajo ciertos escenarios de fallos y operaciones de cluster. Para la pr\u00f3xima versi\u00f3n 6.5.0, se han introducido las nuevas mejoras siguientes <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Durability_(database_systems)\"><span style=\"font-weight: 400;\">durabilidad<\/span><\/a><span style=\"font-weight: 400;\"> proporcionar\u00e1n a los usuarios a\u00fan m\u00e1s seguridad y garant\u00edas en caso de fallos. Como reconocemos que las garant\u00edas son tan buenas como sus pruebas, vamos a dar un vistazo en profundidad a c\u00f3mo usamos Jespen, un est\u00e1ndar de la industria, para probar la durabilidad de las bases de datos en Couchbase.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7273\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/07\/client-register-diagram.png\" alt=\"\" width=\"960\" height=\"515\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram.png 960w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-300x161.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-768x412.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/client-register-diagram-20x11.png 20w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">El marco Jepsen funciona disparando operaciones de cliente a un cl\u00faster mientras inyecta simult\u00e1neamente alg\u00fan tipo de caos como particiones de red, matanza de procesos, ralentizaci\u00f3n de discos, etc. A continuaci\u00f3n, Jepsen analiza el historial de operaciones con comprobadores de historial de operaciones integrados o personalizados. En particular, Jepsen viene con un <\/span><i><span style=\"font-weight: 400;\">consistencia linealizable<\/span><\/i><span style=\"font-weight: 400;\"> comprobador. Couchbase, con los nuevos niveles de durabilidad mejorados en 6.5.0, s\u00f3lo afirma ser <\/span><i><span style=\"font-weight: 400;\">coherencia secuencial<\/span><\/i><span style=\"font-weight: 400;\">. Sin embargo, la consistencia linealizable implica consistencia secuencial [1]. Por lo tanto, pasar la comprobaci\u00f3n de consistencia linealizable tambi\u00e9n implica que el historial de operaciones es realmente consistente secuencialmente. Sin embargo, no superar la comprobaci\u00f3n de consistencia linealizable no implica que el historial de la operaci\u00f3n no sea secuencialmente consistente. En resumen, cuando una operaci\u00f3n pasa el chequeo de consistencia linealizable, podemos asumir que Couchbase es secuencialmente consistente. Si una operaci\u00f3n falla el chequeo de consistencia linealizable, Couchbase a\u00fan puede ser secuencialmente consistente, pero se requiere mayor investigaci\u00f3n para confirmarlo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nuestro objetivo con Jepsen es probar, desde muchos \u00e1ngulos diferentes, que nuestro cliente Java SDK y el motor KV del lado del servidor funcionan al un\u00edsono para: 1.) No perder nunca escrituras reconocidas; y 2.) Proporcionar, como m\u00ednimo, un modelo de consistencia secuencial mientras se aplican al sistema operaciones de cluster y fallos.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Arquitectura<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Jepsen proporciona interfaces para las siguientes abstracciones: Database, Client, Checker, Nemesis, Generators, y Workload. Para crear una prueba Jepsen, tuvimos que implementar todos estos espec\u00edficamente para Couchbase. Cada test es una combinaci\u00f3n de estas abstracciones y par\u00e1metros adicionales.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Base de datos<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Implementamos la l\u00f3gica de configuraci\u00f3n, desmontaje y recopilaci\u00f3n de registros para un cl\u00faster de Couchbase. Esta l\u00f3gica incluye soporte para configuraciones personalizadas de cubos, grupos de servidores y conmutaci\u00f3n autom\u00e1tica por error. El soporte completo para cada posible configuraci\u00f3n de bucket y cluster no tiene mucho sentido porque el n\u00famero de posibles clusters har\u00e1 que probar todas las permutaciones sea inviable. Sin embargo, hemos creado soporte para todas las configuraciones y opciones de cluster m\u00e1s cr\u00edticas.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Cliente<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hemos implementado dos clientes diferentes: un cliente \"register\" y un cliente \"set\". El cliente de registro escribir\u00e1, leer\u00e1 y comparar\u00e1 e intercambiar\u00e1 valores de claves independientes en un bucket de Couchbase. El cliente \"set\" s\u00f3lo a\u00f1ade y elimina documentos de un bucket. Puedes pensar en el bucket como el conjunto y en el documento como un miembro de ese conjunto. Utilizamos este cliente con un verificador de conjuntos personalizado en lugar del verificador de linealidad, ya que no estamos actualizando ning\u00fan documento. Las pruebas que utilizan el cliente de conjuntos y el verificador de conjuntos funcionan entrelazando fases de adici\u00f3n de documentos a un cubo o de eliminaci\u00f3n de documentos de un cubo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ambos clientes reciben operaciones de un proceso generador. (M\u00e1s adelante hablaremos de ello).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Se debe tener especial cuidado para manejar los errores del cliente. Por ejemplo, una DurabilityImpossibleException y una RequestTimeoutException deben ser tratadas de forma diferente por Jepsen. En la primera, sabemos que la operaci\u00f3n ha fallado, pero en la segunda, la operaci\u00f3n podr\u00eda haber tenido \u00e9xito. En el caso de que no podamos distinguir si una operaci\u00f3n ha fallado o ha tenido \u00e9xito, el comprobador de linealidad de Jepsen realizar\u00e1 una comprobaci\u00f3n asumiendo que la operaci\u00f3n ha fallado y otra asumiendo que la operaci\u00f3n ha pasado. El efecto es que se duplica el tiempo de comprobaci\u00f3n para cada operaci\u00f3n ambigua. Por lo tanto, queremos escenarios de prueba que limiten el n\u00famero potencial de resultados de este tipo de operaciones. El comprobador de linealidad pasar\u00e1 si al menos una de las dos historias posibles es linealizable.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Checker<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para nuestras pruebas, podemos elegir entre tres comprobadores: comprobador de linealidad, comprobador de conjuntos y comprobador de cordura. El verificador de linealidad viene con Jepsen y se utiliza para comprobar la coherencia de claves independientes en un cubo. Hemos implementado un comprobador de conjuntos para asegurarnos de que las pruebas con el cliente de conjuntos tienen el conjunto correcto de documentos en un cubo. Por \u00faltimo, hemos implementado un verificador de sanidad que garantizar\u00e1 que la propia prueba haya pasado por la secuencia de cambios de estado del cl\u00faster sin errores. Por ejemplo, una prueba puede implicar un reequilibrio que falla cuando no deber\u00eda. En este caso, el verificador de sanidad marcar\u00e1 la prueba como \"desconocida\" en lugar de \"fallida\", ya que estamos denotando pruebas fallidas como aquellas que fallan el verificador de conjunto o el verificador de linealidad. El verificador de sanidad tambi\u00e9n se asegura de que al menos algunas operaciones tengan \u00e9xito.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">N\u00e9mesis<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Tradicionalmente en Jepsen, una n\u00e9mesis es un proceso que recibir\u00e1 operaciones de un proceso generador y luego actuar\u00e1 contra el sistema en consecuencia. Por ejemplo, la n\u00e9mesis de partici\u00f3n incorporada puede recibir una operaci\u00f3n de bloqueo y restauraci\u00f3n que particionar\u00e1 la red y restaurar\u00e1 la red entre dos nodos. La mayor\u00eda de las n\u00e9mesis incorporadas son suficientes para escenarios muy b\u00e1sicos, pero quer\u00edamos probar escenarios adicionales que puedan, por ejemplo, ralentizar un disco aleatorio en un grupo de servidores aleatorio, matar el proceso memcached del mismo servidor y finalmente restaurar el disco.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para poder probar cualquier escenario que queramos, creamos una \u00fanica n\u00e9mesis de Couchbase que modela el cluster de Couchbase a trav\u00e9s de cambios de estado desde un estado inicial. Mantenemos un mapa de nodos y su estado de red, servidor, disco y cluster. Cada vez que se produce una operaci\u00f3n, el estado se actualiza para reflejar el cambio en el sistema. Las operaciones que se pasan a nuestra n\u00e9mesis especifican las opciones de orientaci\u00f3n de los nodos, una operaci\u00f3n y los par\u00e1metros de la operaci\u00f3n. Las opciones de selecci\u00f3n de nodos indican a la n\u00e9mesis, por ejemplo, que se dirija a un subconjunto aleatorio de nodos de tama\u00f1o dos de entre todos los nodos sanos de un grupo de servidores aleatorio. Esta es la raz\u00f3n principal por la que rastreamos el estado de los nodos: nos da m\u00e1s flexibilidad en la forma en que nuestra n\u00e9mesis puede actuar.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nuestra n\u00e9mesis tiene soporte para las siguientes acciones: conmutaci\u00f3n por error (graceful y hard), recuperaci\u00f3n (completa y delta), partici\u00f3n de red personalizada, recuperaci\u00f3n de red, espera de conmutaci\u00f3n por error autom\u00e1tica, reequilibrio en un conjunto de nodos, reequilibrio fuera de un conjunto de nodos, intercambio de reequilibrio de dos conjuntos de nodos, fallo de un reequilibrio, matar un proceso (memcached, babysitter, ns_server) en un conjunto de nodos, reiniciar los mismos procesos en un conjunto de nodos, ralentizar el cliente dcp, reiniciar el cliente dcp, activar la compactaci\u00f3n, hacer fallar un disco en un conjunto de nodos, ralentizar un disco en un conjunto de nodos y recuperar un disco en un conjunto de nodos. Tenemos previsto soportar m\u00e1s operaciones n\u00e9mesis en el futuro.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Generadores<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Otra pieza clave de una prueba Jepsen son los generadores de operaciones cliente y n\u00e9mesis.  Estos generadores crear\u00e1n una secuencia finita o infinita de operaciones. Cada prueba tendr\u00e1 su propio generador n\u00e9mesis, pero lo m\u00e1s probable es que comparta un generador cliente com\u00fan. Un generador n\u00e9mesis, por ejemplo, podr\u00eda ser una secuencia de partici\u00f3n, suspensi\u00f3n y restauraci\u00f3n, repetida infinitamente. Un generador de cliente especificar\u00e1 una secuencia aleatoria e infinita de operaci\u00f3n de cliente, as\u00ed como los par\u00e1metros asociados, como el nivel de durabilidad, la clave del documento, el nuevo valor a escribir o cas, etc. Cuando se inicia una prueba, el generador de cliente alimenta operaciones de cliente al cliente y el generador de n\u00e9mesis alimenta operaciones a la n\u00e9mesis. La prueba continuar\u00e1 hasta que el generador de n\u00e9mesis haya completado un n\u00famero determinado de operaciones, se alcance un l\u00edmite de tiempo o se produzca un error.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Carga de trabajo<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Una carga de trabajo Jepsen es simplemente un mapa que une todos los componentes anteriores - junto con cualquier par\u00e1metro adicional - en una sola prueba. Nuestras cargas de trabajo modificar\u00e1n la l\u00f3gica generadora de n\u00e9mesis y clientes en funci\u00f3n de los par\u00e1metros de entrada, como la activaci\u00f3n de grupos de servidores y la conmutaci\u00f3n por error autom\u00e1tica.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7274\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/07\/Jepsen-Diagram-1.jpg\" alt=\"\" width=\"929\" height=\"543\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1.jpg 929w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-300x175.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-768x449.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/Jepsen-Diagram-1-20x12.jpg 20w\" sizes=\"auto, (max-width: 929px) 100vw, 929px\" \/><\/p>\n<h2><span style=\"font-weight: 400;\">Desaf\u00edos<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Durante la elaboraci\u00f3n de estas pruebas nos encontramos con dos problemas principales, ambos derivados de la escasez de recursos: 1.) El elevado n\u00famero de permutaciones de la configuraci\u00f3n del cl\u00faster; y 2.) El tiempo necesario para ejecutar el verificador de linealidad.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Dado que Couchbase es una plataforma de datos compleja y altamente personalizable, hay cientos de ajustes que modificar. Algunos ajustes son binarios (por ejemplo: conmutaci\u00f3n autom\u00e1tica por error activada), mientras que otros son continuos (cuota de RAM para KV). Esto crea un n\u00famero extremadamente alto de posibles estados iniciales del cl\u00faster para probar. Luego, con las casi infinitas formas en que podr\u00edamos componer nuestras operaciones n\u00e9mesis, tenemos un espacio de pruebas demasiado grande para cubrirlo por completo.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El comprobador de linealizabilidad, aunque es muy \u00fatil y fruto de una investigaci\u00f3n muy buena, tiene algunas limitaciones. El tiempo que tarda el verificador en analizar un historial crece exponencialmente con el n\u00famero de operaciones. Adem\u00e1s, las operaciones ambiguas tambi\u00e9n provocan un crecimiento exponencial. As\u00ed que tenemos un problema: queremos forzar al m\u00e1ximo a los clientes durante la duraci\u00f3n de una prueba, pero si forzamos demasiado a los clientes, el verificador puede quedarse sin memoria y no analizar el historial. Esto tambi\u00e9n significa que queremos que las pruebas se ejecuten lo m\u00e1s r\u00e1pido posible, pero esto reducir\u00e1 la superficie para encontrar un error.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Soluciones<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para superar estos retos, decidimos hacer lo siguiente: centrarnos en un subconjunto de par\u00e1metros de prueba que son los m\u00e1s cr\u00edticos para nuestros clientes, mantener las pruebas lo m\u00e1s cortas posible y ejecutarlas con la mayor frecuencia posible. Al probar \u00fanicamente par\u00e1metros comunes como las r\u00e9plicas de cubos, todos los nuevos niveles de durabilidad mejorados, la conmutaci\u00f3n por error autom\u00e1tica, etc., podemos centrarnos en un conjunto manejable de pruebas que constituir\u00e1n una base s\u00f3lida para demostrar nuestras garant\u00edas de durabilidad.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Primero nos centramos en las configuraciones cr\u00edticas de KV, con planes para a\u00f1adir nuevos servicios y configuraciones (consulta, \u00edndice, xdcr, etc.) a medida que se a\u00f1adan nuevas funciones y a petici\u00f3n del cliente. A continuaci\u00f3n, ajustamos nuestro n\u00e9mesis para que funcionara lo m\u00e1s r\u00e1pido posible, reduciendo los tiempos de espera, sondeando el estado de las operaciones, limitando el n\u00famero de operaciones y no cargando ning\u00fan documento. Tener cubos vac\u00edos al comienzo de las pruebas acelera los reequilibrios posteriores durante la prueba. Sin embargo, necesitamos probar escenarios en los que los cubos tienen grandes cantidades de datos y una cantidad relativamente peque\u00f1a de RAM por cubo. Estos escenarios de alta densidad de datos, que est\u00e1n en preparaci\u00f3n, requerir\u00e1n mucho m\u00e1s tiempo de ejecuci\u00f3n. Tenemos que ajustar el tama\u00f1o inicial de la carga de datos para que las operaciones de reequilibrio sean lo suficientemente r\u00e1pidas como para que el comprobador de linealidad no se quede sin memoria. Adem\u00e1s, debido al l\u00edmite de velocidad de las operaciones del cliente, tenemos que ejecutar las pruebas varias veces. Con una tasa de operaciones de cliente m\u00e1s lenta, hay menos probabilidades de que dos operaciones se solapen o de que una operaci\u00f3n se produzca en un momento de error, pero si ejecutamos la prueba varias veces podemos aumentar el n\u00famero total de operaciones solapadas y, con suerte, descubrir un error.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para ejecutar las pruebas con la mayor frecuencia posible, hemos creado una jerarqu\u00eda de suites de pruebas. Nuestras suites se dividen en cuatro categor\u00edas: sanidad, diaria, semanal y completa. El conjunto de pruebas de sanidad tiene un peque\u00f1o subconjunto de pruebas que deben ejecutarse despu\u00e9s de que lleguen nuevas confirmaciones, y tardan menos de una hora en completarse. El conjunto diario, m\u00e1s amplio, no deber\u00eda tardar m\u00e1s de 12 horas en ejecutarse, y el semanal deber\u00eda terminar en dos d\u00edas. El conjunto de pruebas completo es una lista de todas las pruebas y tarda aproximadamente una semana en completarse. Para crear las suites reducimos la suite de pruebas completa eliminando pruebas similares y manteniendo la cobertura al m\u00e1ximo. Actualmente, nuestro conjunto completo tiene 612 pruebas, el semanal tiene 396, el diario tiene 227 y el de cordura tiene 6 pruebas. Tambi\u00e9n tenemos un conjunto de errores de versiones anteriores (4.6.x, 5.0.x, 5.5.x, 6.0.x) que utilizamos para verificar que ya no est\u00e1n presentes en el producto. Ejemplos de este tipo de errores son <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-29369\"><span style=\"font-weight: 400;\">MB-29369<\/span><\/a><span style=\"font-weight: 400;\"> y <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-29480\"><span style=\"font-weight: 400;\">MB-29480<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Resultados<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Nuestras pruebas Jepsen han tenido \u00e9xito en encontrar varios bugs dentro de Couchbase. Estos fallos se dividen en dos categor\u00edas: fallos generales del producto y fallos de durabilidad y consistencia de los datos. Los bugs de durabilidad y consistencia son la raz\u00f3n por la que empezamos nuestras pruebas Jepsen, por lo que los consideramos de mayor importancia ya que tenemos una suite de regresi\u00f3n funcional completa que captura bugs generales del producto. Algunos ejemplos de errores de durabilidad y consistencia que hemos encontrado son <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35135\"><span style=\"font-weight: 400;\">MB-35135<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35060\"><span style=\"font-weight: 400;\">MB-35060<\/span><\/a><span style=\"font-weight: 400;\">y <\/span><a href=\"https:\/\/issues.couchbase.com\/browse\/MB-35053\"><span style=\"font-weight: 400;\">MB-35053<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nuestro trabajo inicial con Jepsen y los errores que nos ha ayudado a encontrar nos han dado una mayor confianza en la capacidad de Couchbase para mantener tus datos seguros a trav\u00e9s de una amplia gama de escenarios de fallo y operaciones de cl\u00faster. Sin embargo, se necesitan pruebas continuas, ya que Jepsen puede detectar un error despu\u00e9s de cientos de ejecuciones. Seguiremos ejecutando nuestras pruebas de Jepsen diaria y semanalmente, al tiempo que desarrollamos la compatibilidad con m\u00e1s escenarios. Jepsen es una herramienta indispensable a la hora de construir sistemas con garant\u00edas de coherencia y durabilidad de los datos, y seguiremos utiliz\u00e1ndola y ampliando sus capacidades.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Enlaces:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">[1] <\/span><a href=\"https:\/\/courses.csail.mit.edu\/6.852\/01\/papers\/p91-attiya.pdf\"><span style=\"font-weight: 400;\">https:\/\/courses.csail.mit.edu\/6.852\/01\/papers\/p91-attiya.pdf<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[2] <\/span><a href=\"https:\/\/jepsen.io\/\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[3] <\/span><a href=\"https:\/\/jepsen.io\/consistency\/models\/linearizable\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/consistency\/models\/linearizable<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[4] <\/span><a href=\"https:\/\/jepsen.io\/consistency\/models\/sequential\"><span style=\"font-weight: 400;\">https:\/\/jepsen.io\/consistency\/models\/sequential<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">[5] <\/span><a href=\"https:\/\/github.com\/jepsen-io\/jepsen\"><span style=\"font-weight: 400;\">https:\/\/github.com\/jepsen-io\/jepsen<\/span><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>M\u00e1s recursos<\/h3>\n<p class=\"p1\"><i>Descargar<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=server&amp;product=couchbase-server-developer\">Descargar Couchbase Server 6.5<\/a><\/span><\/p>\n<p class=\"p1\"><i>\u00a0<\/i><i>Documentaci\u00f3n<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/release-notes\/relnotes.html\">Notas de la versi\u00f3n de Couchbase Server 6.5<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\">Novedades de Couchbase Server 6.5<\/a><\/span><\/p>\n<p class=\"p1\"><i>Blogs<\/i><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-server-6-5-0-whats-new-and-improved\/\">Blog: Anuncio de Couchbase Server 6.5 GA - Novedades y mejoras<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-brings-distributed-multi-document-acid-transactions-to-nosql\/\">Blog: Couchbase lleva las Transacciones Distribuidas Multidocumento ACID a NoSQL<\/a><\/span><\/p>\n<p class=\"p2\"><span class=\"s1\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/6-5\/\"><b>Todos los blogs de 6.5<\/b><\/a><\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]<\/p>","protected":false},"author":13828,"featured_media":6719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2396],"tags":[2378,1313,2194],"ppma_author":[9069],"class_list":["post-7272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-transactions","tag-6-5","tag-consistency","tag-durability"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introduction To Jepsen Testing At Couchbase - The Couchbase Blog<\/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\/introduction-to-jepsen-testing-at-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introduction To Jepsen Testing At Couchbase\" \/>\n<meta property=\"og:description\" content=\"Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/introduction-to-jepsen-testing-at-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-09T17:00:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T09:30:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1278\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Korrigan Clark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Korrigan Clark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"},\"author\":{\"name\":\"Korrigan Clark\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8\"},\"headline\":\"Introduction To Jepsen Testing At Couchbase\",\"datePublished\":\"2019-08-09T17:00:48+00:00\",\"dateModified\":\"2024-09-12T09:30:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"},\"wordCount\":2218,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"keywords\":[\"6.5\",\"Consistency\",\"durability\"],\"articleSection\":[\"Couchbase Server\",\"Transactions\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\",\"name\":\"Introduction To Jepsen Testing At Couchbase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"datePublished\":\"2019-08-09T17:00:48+00:00\",\"dateModified\":\"2024-09-12T09:30:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg\",\"width\":2048,\"height\":1278},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introduction To Jepsen Testing At Couchbase\"}]},{\"@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\/7c204a2d8fcb7858db7ab30e0a02fee8\",\"name\":\"Korrigan Clark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/0ebfb10631fa5355ed00af2eb7ca5911\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"caption\":\"Korrigan Clark\"},\"description\":\"Korrigan Clark is a Software Engineer in Test at Couchbase.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/korrigan-clark\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introduction To Jepsen Testing At Couchbase - The Couchbase Blog","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\/introduction-to-jepsen-testing-at-couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"Introduction To Jepsen Testing At Couchbase","og_description":"Intro As most of you know, Couchbase is a database that provides users with a range of consistency and fault tolerance options to ensure that the state of their data meet certain criteria or guarantees. Users can specify varying levels [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/introduction-to-jepsen-testing-at-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-08-09T17:00:48+00:00","article_modified_time":"2024-09-12T09:30:29+00:00","og_image":[{"width":2048,"height":1278,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","type":"image\/jpeg"}],"author":"Korrigan Clark","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Korrigan Clark","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"},"author":{"name":"Korrigan Clark","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8"},"headline":"Introduction To Jepsen Testing At Couchbase","datePublished":"2019-08-09T17:00:48+00:00","dateModified":"2024-09-12T09:30:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"},"wordCount":2218,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","keywords":["6.5","Consistency","durability"],"articleSection":["Couchbase Server","Transactions"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/","name":"Introduction To Jepsen Testing At Couchbase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","datePublished":"2019-08-09T17:00:48+00:00","dateModified":"2024-09-12T09:30:29+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/GettyImages-598530576.jpg","width":2048,"height":1278},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/introduction-to-jepsen-testing-at-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introduction To Jepsen Testing At Couchbase"}]},{"@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\/7c204a2d8fcb7858db7ab30e0a02fee8","name":"Korrigan Clark","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/0ebfb10631fa5355ed00af2eb7ca5911","url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","caption":"Korrigan Clark"},"description":"Korrigan Clark es Ingeniero de Software en Pruebas en Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/korrigan-clark\/"}]}},"authors":[{"term_id":9069,"user_id":13828,"is_guest":0,"slug":"korrigan-clark","display_name":"Korrigan Clark","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","author_category":"","last_name":"Clark","first_name":"Korrigan","job_title":"","user_url":"","description":"Korrigan Clark es Ingeniero de Software en Pruebas en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7272","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\/13828"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=7272"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/6719"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7272"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}