CouchDB es un software de base de datos NoSQL de código abierto escrito en Erlang. Usa HTTP como interfaz principal y JSON para almacenamiento de datos. Los documentos se indexan y almacenan de forma flexible sin esquema fijo. Incluye características como replicación continua, vistas, seguridad y auditoría.
3. Descripción
Apache CouchDB es un software de gestión de bases de datos
OpenSource publicado por Apache Software Foundation. CouchDB
(Couch es un acrónimo para cluster of unreliable commodity hardware)
está escrito en Erlang, un lenguaje de programación funcional con
enfoque en la creación de aplicaciones tolerantes a fallos y altamente
concurrentes.
4. Descripción
CouchDB usa HTTP como su interfaz de programación principal y JSON
para almacenamiento de datos.
Todos los recursos de la base de datos tiene una URI única que expone
servicios a travez de los métodos que implementa HTTP(POST, GET, PUT Y
DELETED), estos métodos son utilizados para el CRUD.
5. Propiedades ACID
La capa de archivos y el sistema de confirmaciones (commitment) de
CouchDB contribuyen a cumplir las características ACID .
En disco CouchDB nunca sobre escribe información confirmada
(commited) o la que tenga estructuras asociadas, asegurando que los
archivos de la base datos están en un estado consistente.
La actualización de documentos (add, edit, delete) son serializadas, lo que
permite escritura concurrente. El control de lectura lo hace utilizando
MVCC (Multi-Vesion Concurrency Control), este modelo permite que cada
cliente mire una instantánea coherente de la base de datos desde el
principio hasta el final de la operación de lectura
6. Propiedades ACID
Los documentos se indexan en árboles B utilizando su nombre (DocID) y un
documento de identidad de secuencia.
Cada actualización a una instancia de la base genera un nuevo número
secuencial.
La secuencias de IDs son usados después para encontrar los cambios de
forma incremental.
Los índices del árbol B se actualizan simultáneamente cuando los
documentos son guardados o borrados, hay que tener en cuenta que las
actualizaciones del índice siempre se efectúan al final del archivo
(append-only updates).
7. Views
Las vistas (Views) son la herramienta utilizada para consultas y reportes en
los documentos de CouchDB, las vistas son utilizadas para algunos
propósitos, entre los cuales podemos mencionar:
Filtrar los documentos en la base de datos para encontrar los que sean
relevantes para un proceso en particular.
Extraer datos desde los documentos, y presentarlos en un orden especifico.
Construcción de índices eficientes para la encontrar documentos por cualquier
valor o estructura que se encuentre en ellos.
Uso de los índices para representar relaciones entre documentos.
Operaciones con los tipos de datos de los documentos, ejemplo si los
documentos representan las transacciones financieras de la empresa, una vista
puede responder a la pregunta de cuál es el gasto en la última semana, mes o
año.
8. Modelo de Vista
Para encarar el hecho de agregar estructuras de respaldo a los datos no
estructurados y semi-estructurados, CouchDB integra un modelo de vista,
las vistas son el método de agregación y representación de informes sobre
los documentos en una base de datos, y se construyen bajo demanda
para agregar, unir e informar sobre los documentos de la base de datos.
JavaScript Funciones de vista
Las vistas se definen mediante las funciones de JavaScript, una función de
vista toma un documento CouchDB como un argumento y luego hace los
cálculos necesarios para determinar los datos que se van a poner a
disposición a través de la vista.
10. Arquitectura
HTTP Client: Permite realizar las peticiones contra el servidor de la base de
datos. Los clientes pueden ser cualquier aplicación que permita el uso de
HTTP, esto permite potenciar el uso de entones web, así como el trabajo
offline, apoyando la posibilidad de replicación cunado la aplicación
vuelva a online.
Erlang HTTP: Basado en Mochiviewb un kit para servidores HTTP ligeros
escrito en ERLANG, permite el control y gestión de HTTP (gestión de
peticiones, concurrencia, cabeceras HTTP, encriptado, autentificación,…)
Mod_Couch: Es el core de la máquina virtual de Erlang de CouchDB, este
componente implemente la API y es el encargado de entender y
gestionar las diferentes operaciones solicitadas por el cliente HTTP.
11. Arquitectura
View_Engine: Este componente realiza todo el proceso de las vistas, el
diseño de los documentos, la indexación,…, utilizando arboles B.
Storage_Engine: Gestiona las escrituras en Disco, este componente se
comunica activamente con el View Engine y el Replicador ya que las
vistas son incrementables y deben reflejar los cambios escritos a disco.
Replicador: Permite la replicación de los documentos, ayuda a la
distribución entre diferentes dispositivos, tanto online como offline, este
componente solo actúa si es activado manual o programáticamente pero
no funciona de manera continua.
12. Replicación
Para la replicación se envía una petición HTTP a CouchDB incluyendo la
base de datos origen (source) y una de destino (target), y CouchDB envía
los cambios del origen al destino, el siguiente código denota un ejemplo
de replicación en CouchDB.
POST /_replicate HTTP/1.1
{"source":"database","target":"http://example.org/ database "}
13. Replicación
La sincronización se puede efectuar en ambas direcciones, para lo cual se
debe cambiar la fuente por el destino, es decir:
La replicación es una forma de crear “snapshots” de las bases de datos en
una sola instancia de CouchDB, con esto se puede testear código sin
poner en riesgo los datos
.
POST /_replicate HTTP/1.1
{"source":"http://example.org/database","target":"da
tabase"}
14. Replicación
Replicación Continua: Esta petición de replicación no se detiene cuando
se terminan de replicar los documentos del origen al destino, si no que
continua a la escucha de cambios en cualquier documento, una vez
encontrados los cambios se realiza la replicación, esta replicación no se la
efectúa de inmediato.
.
> curl -X POST http://127.0.0.1:5984/_replicate -d
'{"source":"db", "target":"db-replica",
"continuous":true}
15. Seguridad
La instalación por defecto de CouchDB permite peticiones realizadas por
cualquier cliente, CouchDB llama a esto “The Admin Party”, todo mundo
tiene privilegios para hacer cualquier cosa.
CouchDB contempla la idea de un usuario admin(superusuario, root,
administrador) el cual tiene permitido hacer cualquier petición a una
instancia de CouchDB.
Un usuario admin puede ejecutar un las siguientes peticiones en la
instancia de CouchDB [5]:
Creación de bases de datos (PUT /database)
Eliminación de bases de datos (DELETE /database)
Creación de un documento de diseño (PUT /database/_design/app)
16. Seguridad
La actualización de un documento de diseño (PUT
/database/_design/apprev=1-4E2)
Eliminación de un documento de diseño(DELETE
/database/_design/app?rev=1-6A7)
Activación de comparación (POST /_restart)
Lectura de la configuración activa (GET /_config)
Actualización de la configuración activa (PUT /_config)
17. Seguridad
Creación de usuarios admin:
En la instalación inicial crea una base de datos por defecto, lo que se
debe crear como paso siguiente es un usuario administrador, en este caso
se creara un usuario jose, y su contraseña será adminJose
> curl -X PUT $HOST/_config/admins/jose -d '"adminJose"'
""
18. Seguridad
Cookie de Autenticación: CouchDB genera un token de una sola vez que
el cliente podrá utilizar en su próxima solicitud a CouchDB, cunado
CouchDB ve el token en una solicitud posterior, se autenticara al usuario
basándose en el token sin la necesidad de requerir la contraseña, el token
tiene una duración de 10 minutos.
> HOST="http://127.0.0.1:5984"
> curl -vX POST $HOST/_session -H
'application/x-www-form-urlencoded' -d
'name=anna&password=secret'
19. Auditoria
Audit CouchDB
Es una herramienta simple, que solo utiliza la dirección URL de Apache
CouchDB, para responder a las preguntas comunes de auditoria tales
como:
¿Cuál es la configuración del servidor?
¿Cuántas cuentas de usuario existentes?
¿Qué funciones de usuario existen?
¿Cuál es la configuración de seguridad implementada en cada base de datos?
¿Cuáles son las funciones de validación en cada documento de diseño?
20. Auditoria
La auditoría se puede implementar desde la consola web de CouchDB,
para lo cual basta con ir a Security-> Audit.
21. Performance Management
Una vez que se empieza a manejar un número grade de documentos se
tiene que ser cuidadoso con el manejo del mismo, así como de la forma
de escribir el código, a continuación se presentan puntos a considerar
para un rendimiento óptimo de CouchDB.
Disco Entrada/Salida
Tamaño del archivo: El menor tamaño de sus archivos, menos operaciones
de E/S, dan como resultado un mayor número de archivos almacenados
en CouchDB y en sistema operativo. Se debe ser cuidadoso con los datos
que se está almacenando, por ejemplo es una mala práctica utilizar
claves demasiado largas o utilizar claves únicas de caracteres individuales.
22. Performance Management
Rendimiento en disco y sistema de archivos
Erlang sugiere la siguieren técnica para aumentar el rendimiento del
sistema de archivos.
En sistemas operativos con soporte de threads, es posible hacer que las
operaciones de archivos sean mejoradas con threads. Para lo cual se
embrace en las variables de entorno de Erlang un número mayor de
threads, ya que en la instalación por defecto se especifican 0 threads,
para modificar el número de threads se debe ingresar el siguiente
comando:
export ERL_FLAGS="+A 4"
23. Limitaciones de los recursos del
Sistema
Uno de los problemas latentes en implementaciones grandes es la
asignación por defecto de recursos que provee CouchDB y el sistema
operativo, el aumento de estos límites puede permitir que la
implementación de CouchDB crezca más allá de lo que la configuración
por defecto ofrece.
Delayed_commits: Esto permite mejorar el rendimiento de escritura para
algunas cargas de trabajo.
Esta configuración hace que CouchDB espere un segundo antes de que
confirmar nuevos datos después de una actualización, esta configuración
tiene el defecto de que si el servidor se bloquea antes de que la
instrucción sea completada, cualquier grabación desde el último commit
se pierde.
24. Limitaciones de los recursos del
Sistema
Max_dbs_open: Esta configuración aumenta el límite de bases de datos
concurrentes. Esta configuración es recomendada en implementaciones
en las que muchas bases de datos estarán replicando de forma continua.
[couchdb]
max_dbs_open = 100
25. Red
Hay que tener cuidado del tamaño que se elige para los lotes, ya que
lotes grandes requieren más tiempo en el cliente para codificar los
elementos en archivos JSON y aun mas tiempo para decodificar el número
de peticiones.
Si se posee un sistema rápido de E/S, se puede utilizar la concurrencia para
tener múltiples peticiones/respuestas al mismo tiempo. Esto mitiga la
latencia involucrada en el uso de los archivos JSON, haciendo el trabajo
en red y la decodificación de JSON más eficiente.
26. Red
Mochiweb implementa un buffet TCP, que almacena todas las peticiones
pequeñas y espera a que todas estas completen un tamaño mayor y las
envía por el protocolo TCP, este comportamiento TCP búfer puede ser
desactivado a través de httpd/sochet_options:
[httpd]
socket_options = [{nodelay, true}]
27. CouchDB
IDs de los documentos: El tamaño del archivo de la base de datos se
deriva del tamaño de los documentos y de las vistas, pero también de
múltiples de los _id, ya que un ID presente en un documento se encuentra
duplicado en todo el árbol.
La inserción de ID secuenciales es más rápida que las identificaciones
aleatorias, por tanto se debe tener en cuenta generar los IDs de manera
manual o supervisada, por ejemplo, algo que lleva 16 dígitos
hexadecimales se puede hacer de 4 dígitos de base 62 esto representa(10
números, 26 minúsculas, y 26 mayúsculas).
28. Vistas
Las Vistas generadas con el servidor de consultas de JavaScript son
demasiado lentas, cuando existen un número excesivo de documentos
para procesar, la creación de las consultas no consume una sola CPU y
mucho menos el sistema de E/S, el problema se ve en la latencia que se
genera en la consulta, esto se debe a que el servidor de consulta de
CouchDB se encuentra separado del interprete couchjs.
Reducción en la construcción de funciones: Si se hace el uso de funciones
sencillas como sumas o restas, se puede hacer su implementación
haciendo uso de las funciones por defecto de Erlang, por ejemplo _sum o
_count, esto ayuda al rendimiento ya que reduce la entrada y salida entre
CouchDB y el servidor de consultas JavaScript.
29. Metadata Management
A diferencia de los archivos JSON normales, CouchDB agrega dos campos
especiales al documento: el “_id” y ”_rev”.
El campo “_id” es un campo que permite identificar al documento, este
campo puede ser definido de manera manual, pero se recomienda
hacerlo de manera automática, ya que CouchDb asigna valores únicos y
universales, lo cual ayuda en temas de replicación o sincronización.
El siguiente campo es “_rev”, este campo es importante para CuchDB, ya
que este maneja a sus archivos por numero de versión, es decir si un
documento es modificado, a diferencia de bases de datos
convencionales, CouchDB, genera un nuevo documento con un numero
de versión diferente. Este valor aumenta una unidad por cada cambio que
se realice
30. Metadata Management
Sin estructura fija: En las bases de datos convencionales se definen las
características de los datos que se desean guardar, por ejemplo:
CREATE TABLE usuario
(nombre VARCHAR(20), correo VARCHAR(20),edad int(3));
{
"_id" : "234a41170621c326ec63382f846d5764",
"_rev" : "1-480277b989ff06c4fa87dfd0366677b6",
"nombre" : "Jose",
"correo" : "Jtapia@gmail.com",
"edad" : "45"
}
31. Backup and Recovery
Las características previas discutidas acerca de CouchDB aseguran que se
trata de una base datos muy fiable, pero sin embargo se debe tener en
cuenta los agentes externos que pudiesen atentar con la integridad de la
mismas, ejemplo de esto pueden ser, accidentes del servidor
irrecuperables, hackers que encuentran las credenciales de administrador
y eliminan los datos…
Existen estrategias de backup tradicionales para CouchDB entre las cuales
se puede mencionar:
Replicación
Archivo de copia de seguridad de base de datos.
Instantáneas del sistema de archivos.
32. Backup and Recovery
Replicación: CouchDB denota de las otras bases de datos, por la
implementación de la replicación tira y afloja, es decir cualquier base de
datos CouchDB puede ser replicada en cualquier otra si se tiene acceso
HTTP y as credenciales apropiadas.
Archivo de copia de seguridad de base de datos: La similitud que
CouchDB posee con git permiten que la base de datos almacene índices
y archivos en el sistema de archivos subyacente, esta copia de seguridad
se puede hacer de manera programática usando la línea de comando, u
utilizando el cron en sistemas Unix o con el uso de herramientas como
rsync, estas alternativas, realizan Backus de manera incremental.
Instantáneas del sistema de archivos: La utilización de la máquina virtual
de Erlang asegura la creación de instantáneas de los archivos, según esta
crea necesario, o según el administrador las programe.
33. Data warehouse Facilities
Las características de CouchDB no son las idóneas para la implementación
de Data warehose, ya que el manejo de versiones temporales de
documentos y las vistas implementadas con JavaScript sugieren un
problema para bases de datos que cresen de manera exponencial.
Sin embargo se puede hacer la implementación de CouchDB para bases
de datos que no cambien continuamente, esto se lo hace con el objetivo
de usar las facilidades que posee CouchDb para la manipulación de
archivos JSON, esto se lo puede hacer implementando NodeJS
34. Data warehouse Facilities
CouchDB ofrece MapReduce como característica principal, a más de esto
cuenta con la interfaz Futon, que permite a los desarrolladores escribir
declaraciones MapReduce basadas en JavaScript en un entorno de
prueba, el código que se mostro pudo ser implementado utilizando una
vista almacenada en CouchDB, y su llamada sería igual que llamar un
procedimiento en un sistema RDBMS, la eficiencia de usar MapReduce se
ve en la implementación de CouchDB en varios servidores, esto ayuda a
escalar de manera rápida sin afectar el rendimiento de la consulta.
35. DBA Tools existentes
Existen varias herramientas OpenSource, la herramienta por defecto en la
instalación de CouchDB es Futon, esta herramienta presenta una interfaz
muy amigable, la cual es accedida por el navegador una vez que se ha
iniciado el agente de CouchDB.
Erica, es una herramienta que ayuda a crear el diseño de los documentos,
a más de esto brinda soporte para las aplicaciones web (couchapps), el
requerimiento mínimo es Erlang R14B04 o superiores.
Situo.py: Es un cliente CouchApp que utiliza lenguaje Python, esta
herramienta permite realizar pruebas automatizadas.