martes, 15 de diciembre de 2009

CouchDB: Introducción

CONCEPTO

Couch (sofá, diván) DB (DataBase) es un nuevo concepto de bases de datos, de la mano de la comunidad Apache. El nombre no ha sido elegido al azar, ni de manera casuística. Su nombre evoca relax, y ésa es su filosofía. Evoca tranquilidad, debido a que todo ahora es más sencillo y produce menos problemas, incluso para personas no técnicas.



Lo primero que llama la atención de CouchDB es que no sigue el concepto de base de datos tradicional entidad-relación (modelo relacional), si no un modelo de almacenamiento documental, gestionado por un potente motor de consultas sencillísimo de utilizar.

El modelo entidad-relación está basado en la definición de tablas de datos, estructuradas por columnas (campos) y filas (registros). Para la creación de un documento complejo, como una factura, es necesario definir varias tablas para evitar la repetición de datos, y relacionar estas tablas mediante claves (id cliente, id proveedor, nº factura…). Este sistema, tiene la ventaja de ahorrar información y establecer reglas relacionales (constraints), de tal forma que no se pueda cometer errores ni quebrantar las relaciones, obligando a tener una fila en cada una de las tablas involucradas. Este sistema, sin embargo, supone definir una estructura muy compleja y poco flexible, y cualquier cambio o normalización impactaría seriamente al resto de datos y a la aplicación. Otro inconveniente derivado del modelo entidad-relación, es que se obliga a definir y completar campos que son opcionales (aunque sea con un valor NULL o vacío).

CouchDB adopta un modelo de datos “auto-contenidos”, con lo que es posible tener una colección de documentos del mismo tipo (semántica), con variantes en cómo está estructurada la información (sintaxis), tal y como se tiene en el mundo real. Un ejemplo sencillo sería una colección de tarjetas de visita. Casi todas las tarjetas tienen una información común (nombre, apellidos, dirección, teléfono), pero alguna omitirá o añadirá algún dato, como el fax, la página web o el correo electrónico. Mientras que en el modelo entidad-relación habría que definir estos campos, el modelo documental permite que una tarjeta tenga o no estos campos.
Una base de datos CouchDB es una colección de documentos. Los documentos son objetos compuestos por campos, cuyos valores pueden ser cadenas de texto, números, fechas, listas ordenadas y mapas asociativos. Un ejemplo de documento podría ser el siguiente:

"Asunto": "Introducción a CouchDB"
"Autor": "Rafael Hernampérez"
"Fecha": "15/12/2006"
"Etiquetas": ["CouchDB", "Base de datos", "Apache"]
"Resumen": "Introducción a la base de datos documental CouchDB y diferencias con respecto a bases de datos relacionales"


Cada documento está identificado por un ID único (código o identificador).
Para gestionar los documentos, CouchDB integra un modelo de vistas que utilizan JavaScript, las cuales permiten agregar y reportar en los documentos en la base de datos. Las vistas son construidas dinámicamente y no afectan por debajo al documento, pudiendo tener tantas vistas diferentes de los mismos datos como se desee.

A diferencia de una base de datos relacional, CouchDB está diseñado para almacenar y reportar grandes cantidades de datos semi-estructuradas orientadas a documentos, sin un esquema o estructura. En una base de datos relacional, el esquema es predefinido y limita la información que es necesaria, especialmente cuando las necesidades cambian con respecto a las anticipadas en el diseño. Esto ocasiona problemas en la actualización en un medio distribuido. CouchDB no está forzado por un esquema, y los nuevos tipos de datos pueden ser añadidos sin problemas en documentos similares.
CouchDB posee utilidades para trabajar en línea de comandos o directamente a través de una URL y un navegador, hablando con el gestor en formato JSON (JavaScript Object Notation). Asimismo, posee utilidades en una interfaz de administración, que permiten al usuario realizar las operaciones sin necesidad de comandos, a través de la URL:

http://127.0.0.1:5984/_utils/


Arquitectura de CouchDB

En su motor late un corazón tolerante a fallos, los cuales se producen en un entorno controlado, y son tratados de forma que no afectan al sistema servidor, si no en peticiones aisladas. No se esperan comportamientos aleatorios ni errores no traceables en las operaciones. Asimismo, gestiona perfectamente un entorno de tráfico variable, absorbiendo peticiones concurrentes sin errores, tomando para ello, más tiempo para cada petición hasta su finalización. Por otra parte, CouchDB está diseñado para escalabilidad extrema, permitiendo el crecimiento o la disminución del hardware, y la replicación incremental.

CouchDB puede ser integrado en sistemas grandes y complejos de información, gracias a sus componentes que pueden ser usados como bloques de construcción, adaptándose a las necesidades del sistema, garantizando la flexibilidad, el rendimiento y la fiabilidad, incluso cuando el sistema requiere de una escalabilidad cambiante y rápida.

Uno de estos componentes está enfocado a la replicación incremental, capaz de sincronizar varias bases de datos con la fiabilidad de poder hacerlo entre máquinas por almacenamiento redundante, distribuir datos a un cluster que comparte un subconjunto del total de peticiones (balanceo de carga), o distribuir datos entre localizaciones físicas distantes.

CouchDB es una base de datos nacida en la red (no desarrollada para la web). Esta filosofía toma especial relevancia en cuanto a latencia se refiere. La experiencia del usuario radica principalmente en su satisfacción en cuanto a la respuesta de datos. Lo normal en las aplicaciones web es solicitar datos, crear una conexión, realizar una consulta, esperar respuesta y transmitir la respuesta. Este proceso puede llevar segundos de demora, y más si hay demasiada concurrencia. Si a esto le unimos el estar offline, la cosa empeora, pues si no hay conectividad no hay datos. CouchDB permite un escenario en el que, por ejemplo, un dispositivo móvil tiene CouchDB, y que se sincroniza mientras está online, y la latencia es muy baja mientras accede a los datos de forma local.

CouchDB toma como referente el teorema de CAP:
- Consistency: Consistencia o la capacidad de que todos los clientes vean los mismos datos, incluso con actualizaciones concurrentes
- Availability: Disponibilidad o la capacidad de que todos los clientes accedan a la misma versión de los datos.
- Partition tolerance: Partición tolerante o la capacidad de que la base de datos pueda estar dividida en múltiples servidores.

El verdadero corazón de CouchDB es un potente motor de almacenamiento B-Tree, una estructura de datos ordenada que permite búsquedas, inserciones y eliminaciones en tiempo logarítmico. Este sistema permite un alto rendimiento, una alta disponibilidad, mejoras de velocidad, y la partición de los datos en múltiples nodos sin afectar a la disponibilidad de consultar cada nodo aisladamente.

El cálculo de los resultados de una vista es realizado mediante MapReduces (mapeo y reducción), que son aplicados a cada documento de forma aislada, lo que presta a sí mismo una computación paralela e incremental. Estas funciones (mapeo y reducción) producen pares de clave/valor, que son insertados en el motor de almacenamiento B-Tree, ordenados por clave, haciendo extremadamente eficiente las búsquedas por clave o por rango.

Otra característica de CouchDB es que no utiliza bloqueos, como en las bases de datos relacionales, en donde una actualización de un dato provoca un bloqueo que impide a cualquier consulta acceder al dato mientras dure la actualización. Cuando hay múltiples actualizaciones/peticiones concurrentes, se está desperdiciando un enorme poder de procesamiento de los servidores, tomando mucho tempo en decidir quién hace qué, cuándo y en qué orden, en lugar de realizar su trabajo. En lugar de ello, CouchDB utiliza un sistema de Control de Concurrencia Multi Versión (MVCC en inglés), para gestionar el acceso concurrente a la base de datos, ejecutando en paralelo las peticiones, incluso en un sistema de carga extrema. Los documentos son versionados con un sistema de control de versiones (de forma similar a Subversion). Cada actualización genera una nueva versión del documento y lo guarda por encima del antiguo. Esto optimiza el rendimiento concurrente, ya que una lectura puede leer la última versión mientras aún se está actualizando, sin tener que esperar la actualización.

La validación previa de los datos complejos es posible gracias a funciones JavaScript, lo que permite que cuando se actualiza un documento se realice una validación del mismo en una copia del documento, denegando o aprobando el mismo según sus reglas.

Cuando se trabaja con varios nodos, la consistencia distribuida está asegurada con CouchDB, gracias a la replicación incremental, que evita preocuparnos de la disponibilidad de la información en caso que uno de los nodos deje de funcionar, gracias a la copia periódica entre servidores de los cambios realizados en los documentos. Esta replicación se puede programar mediante un gestor de tareas. Después de cada replicación, cada nodo es capaz de trabajar de forma independiente.

Además, CouchDB posee un sistema automático detección y resolución de conflictos, en el caso de que un documento se intente actualizar en distintos nodos, guardando varias versiones las actualizaciones, y poniendo como la versión más reciente la versión ganadora. Para gestionar conflictos, CouchDB permite acceder a las versiones, cambiar el orden de las versiones, y guardarlas.


ENLACES:
Sitio oficial: http://couchdb.apache.org/
Guía de CouchDB: http://books.couchdb.org/relax
Wiki: http://wiki.apache.org/couchdb/
Planet CouchDB: http://planet.couchdb.org/

Creative Commons License
Introducción a CouchDB by Rafael Hernamperez is licensed under a Creative Commons Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 Unported License.
Based on a work at rafinguer.blogspot.com.
Safe Creative #0912155118793