Primeros pasos con Couchbase Server

1
6495
vector digital speed technology, abstract background

Índice de contenidos

​1.​ Introducción

Los requisitos de las aplicaciones han cambiado en los últimos años. Hoy en día, éstas necesitan responder a millones de operaciones realizadas por usuarios concurrentes y necesitan hacerlo rápido (en milisegundos). Además tienen que presentar una alta disponibilidad y escalado.

Para satisfacer estas necesidades no solo hacen falta aplicaciones bien diseñadas sino además que el motor de base de datos subyacente responda a estos requisitos. Las bases de datos tradicionales, pensadas para ofrecer consistencia y control, pero que carecen de flexibilidad no son las más apropiadas. Es aquí donde entran en juego una serie de bases de datos no relacionales (algunas de ellas orientadas a documentos) cuyas arquitecturas modelan estas características. Una de ellas es Couchbase.

Couchbase es una base de datos distribuida, NoSQL y orientada a documentos. Su diseño permite servir a muchos usuarios al mismo tiempo mediante la creación, almacenamiento, recuperación, agregación, manipulación y presentación de datos.

En este tutorial veremos algunas de las características de Couchbase. Realizaremos una instalación para explorar de manera visual, desde la consola web, la creación y recuperación de documentos y posteriormente haremos lo mismo pero programáticamente usando el SDK (Software Development Kits) que ofrece.

​2.​ Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Macbook Pro 15″ (2.5 GHz Intel Core i7, 16GB DDR3)
  • Sistema Operativo: Mac OS High Sierra
  • IDE: Eclipse Photon (4.8)
  • Apache Maven 3.5.4
  • Docker 18.06
  • Couchbase Server 5.0
  • Couchbase Java SDK 2.7

​3.​ Conceptos

Antes de comenzar con la instalación y con un ejemplo práctico, veamos algunos de los conceptos principales y terminología que usa Couchbase:

  • Server: Una instancia de Couchbase Server.
  • Node: Máquina física o virtual que contiene una instancia de Couchbase Server.
  • Cluster: Una o varias instancias de Couchbase Server, cada una corriendo en un node independiente pero colaborando entre sí de manera que forman un único sistema.
  • Bucket: Es la unidad principal de almacenamiento para los datos (items). Permite que éstos sean accedidos, indexados y replicados. También sirve como namespace. Existen tres tipos:
    • Couchbase buckets: Almacenan datos tanto persistentemente como en memoria. Permiten que los datos sean replicados automáticamente.
    • Ephemeral buckets: Son una alternativa a los couchbase bucket cuando no se requiere que los datos sean persistidos debido, por ejemplo, a que el acceso a disco implica demasiada sobrecarga.
    • Memcached buckets: Están diseñados para ser usados junto con otras plataformas de base de datos.
  • Item: Representa el dato a ser almacenado. Está formado por una llave (key o ID) y un valor. Cada key es única dentro de su bucket. El valor puede ser de dos tipos: binary o JSON. En caso de estar en formato JSON podemos referirnos a él como Documento. A continuación se muestra una comparación de cómo se almacena el dato en un modelo relacional (fila) y en el modelo no relacional orientado a documentos de couchbase:

 

En el siguiente diagrama se representan todos estos elementos:

4.​  Instalación

Existen dos versiones de Couchbase:

  • Couchbase Server Enterprise: Presenta todas las características disponibles en la plataforma. No es necesario licencias para entornos de preproducción y testing pero sí para entornos de producción.
  • Couchbase Server Community: Es la versión open source. Está mantenida por la comunidad (Couchbase Forums). No presenta todas las características disponibles en la plataforma pero para desarrollos no empresariales cumple perfectamente.

 

Para comenzar a explorar los diferentes elementos de Couchbase vamos a realizar una instalación rápida de la versión Enterprise usando la imagen Docker oficial de Couchbase. Para ello es necesario tener instalado Docker. Si no se tiene, se puede instalar a través de los siguientes enlaces dependiendo del SO:

 

Una vez instalado Docker, desde la consola ejecutamos el siguiente comando:

docker run -t --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase/server-sandbox:5.0.1

Al ejecutar el comando, Docker se descarga, instala y configura un servidor Couchbase:

Starting Couchbase Server -- Web UI available at http://<ip>:8091
and logs available in /opt/couchbase/var/lib/couchbase/logs
Configuring Couchbase Server. Please wait (~60 sec)...
Configuration completed!
Couchbase Admin UI: http://localhost:8091 
Login credentials: Administrator / password

Comprobamos que tenemos acceso a la consola web accediendo a la url http://localhost: 8091. La imagen Docker que hemos usado ya viene preconfigurada con un usuario:   user: ‘Administrator’ y pass: ‘password’.

Una vez que entremos nos aparecerá el Cluster Dashboard donde veremos un resumen gráfico del estado del cluster:

Si accedemos a la pestaña “Buckets” veremos que hay uno creado: ‘travel-sample’. Este bucket es de tipo couchbase y ya viene creado con la imagen docker que hemos usado. Podemos acceder a él para explorar los documentos que contiene.

 

​5.​ Crear y recuperar documentos desde la Consola

Con la instancia de Couchbase en ejecución, vamos a crear, desde la consola web, un bucket de prueba para almacenar en él un documento y posteriormente consultarlo.

En la esquina superior derecha pinchamos en ‘Add Bucket’. Aparecerá un ventana modal donde vamos a introducir un nombre para nuestro bucket, en este caso le llamaremos ‘greeting’. Por defecto nos creará un bucket de tipo couchbase.

 

Con el bucket ‘greeting’ creado, podemos pasar ahora a almacenar un documento en él. Para esto pinchamos en el link ‘Documents’ que aparece al final de la fila:

Seleccionamos ‘Add document’ y nos sale un primer formulario para introducir el id o key del documento:

Le damos a ‘Save Document’ y a continuación podemos editar el contenido del documento, vamos a añadir dos campos: message y author:

 

Podemos ver el documento que acabamos de crear seleccionando el bucket ‘greeting’:

Antes de pasar a realizar una consulta sencilla sobre el bucket que hemos creado, hay que mencionar el lenguaje de consulta usado por Couchbase: N1QL (SQL para documentos). Este lenguaje está compuesto por sentencias, expresiones y comentarios. Las sentencias están categorizadas en dos grupos:

  • DDL (Data Definition Language ): Sentencias para crear, modificar y eliminar índices.
  • DML (Data Manipulation Language): Sentencias para seleccionar, insertar, actualizar y eliminar datos en los documentos JSON.

 

Para realizar consultas sobre el bucket ‘greeting’ primero es necesario crear un índice asociado al campo por el que queremos filtrar, en este caso por ‘author’:

Nos vamos a la pestaña ‘Query’ y ejecutamos la siguiente sentencia:

CREATE INDEX index_author on `greeting`(author);

Con el índice creado ya podemos consultar los documentos almacenados en el bucket:

SELECT message FROM `greeting` WHERE author='foo'

​6.​ Crear y recuperar documentos programáticamente (SDK)

Lo mismo que hemos hecho anteriormente desde la consola web lo podemos hacer programáticamente usando la librería (SDK) que nos proporciona Couchbase.

Existen versiones de SDKs para los siguientes lenguajes: Java, .Net, Node.js, Go, PHP y Python. En este caso usaremos la versión para Java.

A continuación crearemos una aplicación standalone donde primero nos conectaremos al cluster y abriremos una conexión con el bucket ‘greeting’ para posteriormente crear y consultar un documento.

Creamos la aplicación con maven:

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.autentia.example.couchbase -DartifactId=greeting-app

Editamos el pom.xml para añadir la dependencia del SDK. El pom se vería así:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion> 
  <groupId>com.autentia.example.couchbase</groupId>
  <artifactId>greeting-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>greeting-app</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>com.couchbase.client</groupId>
      <artifactId>java-client</artifactId>
      <version>2.5.1</version>
    </dependency> 
    <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version>
      <scope>test</scope> 
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <id>couchbase</id>
      <name>couchbase repo</name>
      <url>http://files.couchbase.com/maven2</url>
      <snapshots><enabled>false</enabled></snapshots>
    </repository>
  </repositories>

</project>

 

En la clase App.java modificamos el método main añadiendo las siguientes líneas:

 

Cluster cluster = CouchbaseCluster.create("localhost:8091");
cluster.authenticate("Administrator", "password");
Bucket bucket = cluster.openBucket("greeting");

JsonObject hello = JsonObject.create()
  .put("message", "Hello World!")
  .put("author", "foo");

bucket.upsert(JsonDocument.create("g:hello", hello));

System.out.println(bucket.get("g:hello"));

bucket.bucketManager().createN1qlPrimaryIndex(true, false);

N1qlQueryResult result = bucket.query(
N1qlQuery.parameterized("SELECT name FROM `greeting` WHERE author=$1",
JsonArray.from("foo")));

for (N1qlQueryRow row : result) {
  System.out.println(row);
}

bucket.close();
cluster.disconnect();

 

Hemos realizado lo siguiente:

  1. Crear una conexión al cluster que tenemos escuchando en localhost:8091.
  2. Una vez que tenemos una instancia del cluster, a partir de ella, obtenemos una instancia del bucket para realizar operaciones sobre él.
  3. Se crea un documento JSON y se realiza un upsert (Esta operación reemplaza el documento independientemente de si su ID existe o no).
  4. Después creamos programáticamente la misma consulta que hemos realizado desde la consola web.
  5. Se imprimen los resultados
  6. Y finalmente cerramos el bucket y nos desconectamos del cluster.

Es importante obtener las instancias del cluster y del bucket durante la inicialización y reutilizarlas en toda la aplicación hasta que ésta se cierre. Esto es debido a que la configuración de una conexión es muy costosa en Couchbase. El SDK está diseñado para ser thread safe, asi que estas instancias pueden ser usadas eficientemente desde todos los hilos de la aplicación.

​7.​ Conclusiones

En este sencillo tutorial hemos visto algunos conceptos generales de Couchbase y cuáles son las necesidades que puede cubrir. Hemos visto cómo crear y consultar documentos tanto desde la consola como desde una aplicación cliente. Espero que os haya servido como introducción a esta tecnología.

Saludos!

​8.​ Referencias

 

 

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad