Download Introducción a CouchDB - News · Creative People

Document related concepts

CouchDB wikipedia , lookup

Servidor de CouchBase wikipedia , lookup

MongoDB wikipedia , lookup

Modelo de base de datos wikipedia , lookup

Modelo relacional wikipedia , lookup

Transcript
Introducción a CouchDB
Por Rafael Hernampérez
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 entidadrelació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 BTree, 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/