Azure Cosmos DB

En palabras de Microsoft, Cosmos DB es su servicio de base de datos multimodelo globalmente distribuida. Al ser globalmente distribuida permite la replicación y el uso de la base de datos sobre las regiones de Azure con unos cuantos clics y en muy poco tiempo. El ser multimodelo significa que no está atado a un modelo de datos como el relacional y deja al usuario la elección del modelo que mejor aplique para su caso de uso. 

Cosmos DB tiene otras características importantes, que fueron diseñadas para cumplir con los siguientes objetivos. 

  • Permitir a los clientes escalar el rendimiento y almacenamiento en demanda 
  • Permitir construir aplicaciones para misiones criticas de respuesta rápida 
  • El sistema debe estar siempre disponible 
  • Permitir a los desarrolladores elegir el nivel de trade-off entre consistencia y velocidad para su aplicación 
  • Automatizar la indexación si es deseado y deshacerse del uso de esquema de base de datos 
  • Soportar múltiples modelos de datos 

Cosmos DB entonces es ideal para algún proyecto o aplicación cuyas demandas puedan ser satisfechas por el cumplimiento de los puntos anteriores. 

Creando una cuenta de Cosmos DB  

Una vez que hemos accedido a nuestra cuenta de Azure buscamos y damos clic en agregar 

Nos mostrará la siguiente pantalla: 

La elección del API es muy importante. Como se ha mencionado Cosmos DB es un sistema multimodelo. Concretamente el nucleo de Cosmos es un sistema basado en ARS (Átomo, Registro y Secuencia) que es traducido al modelo de datos que hemos elegido. Al elegir un API elegimos una representación de nuestros datos así como el lenguaje que usaremos para interactuar con el. 

Las opciones son: 

  • Core (SQL). Modelo base de datos documental con lenguaje SQL. 
  • Mongo DB. Modelo base de datos documental con lenguaje Mongo DB y compatibilidad con herramientas de Mongo DB. 
  • Cassandra. Modelo base de datos columna-familia con lenguaje  Cassandra y  compatibilidad con herramientas de Cassandra. 
  • Tabla de Azure. Para aplicaciones de Azure Table Storage. 
  • Gremlin. Modelo base de datos de grafos con lenguaje Gremlin y compatibilidad con herramientas de Gremlin. 

Una vez creada la cuenta de Cosmos no podemos cambiar este API ni la manera como interactuar con él. En este tutorial usaremos Core (SQL). 

Redundancia geografica y escrituras en varias regiones habilitan los servicios globales pero estos pueden ser habilitados posteriormente. 

La sección de red nos servirá para gestionar los accesos a nuestra cuenta o si tenemos un servicio de redes virtuales. 

Una vez creado nuestro recurso accedamos a él y en la sección de explorador de datos veremos esta pantalla. 

Para empezar a trabajar con nuestros datos debemos crear una base de datos y un contenedor, esto se hace seleccionando el boton nombrado de esa manera. 

Dentro de los campos pedidos están las opciones de “Provision database throughput” y “Partition Key”.  

Provision database throughput establece un limite maximo de RUs para todos los contenedores de esa base de datos. Un RU (Request Unit) es la unidad manejada por Cosmos para determinar los costos y se usa para medir el numero de operaciones en la base de datos. Si aprovisionamos nuestra base de datos con 400RU/s seriamos capaces unicamente de realizar 400 operaciones de lectura sobre un documento de 1Kb. Para calcular con mayor detalle los costos se puede usar esta herramienta.  

Si elegimos aprovisionar la base de datos significará que cualquier contenedor dentro de esta base tendrá a lo más dicho rendimiento ya que las RUs se comparten entre todos los contenedores. Una mejor opción sería aprovisionar a nivel contenedor, que es posible. 

La opción Partition Key determina un campo de nuestro documento como llave de particiones. Es recomendado usar un campo que pueda garantizar particiones de tamaño similar. Dado que el rendimiento se distribuye entre las particiones el no seleccionar una llave de partición adecuada podría resultar en recursos no utilizados y cuellos de botella de rendimiento en las particiones más grandes. 

Habiendo creado nuestra base de Datos y Contenedor nos encontramos con esta pantalla. 

En las opciones de la izquierda vemos que podemos almacenar Items (Documentos JSON), así como Procedures, Triggers y funciones, estos últimos serán útiles si estamos interesados en implementar transacciones ya que Cosmos solo proporciona un ambiente transaccional para operaciones llevados a cabo dentro de ellos. 

El usar el API de SQL facilita a aquellos familiarizados con el lenguaje al no tener que aprender algún otro medio para interactuar con los datos. Aunque nuestros datos sean de tipo JSON podemos usar el SQL familiar para operar con ellos. 

Para ejemplificar su uso, creé dos documentos que se muestran a continuación. 

Podrán notar que ambos tienen una estructura distinta con campos distintos, esto es gracias al diseño sin esquema de Cosmos DB donde incluso podemos crear elementos complejos como arrays.

Además de esto en ningun momento tuvimos necesidad de crear indices, esto es gracias a que Cosmos se encarga automaticamente de la indexación. Para tener información a detalle sobre como los crea pueden consultar este documento.

Como ejemplo de las capacidades de SQL en cosmos estas imágenes muestran dos queries basicos.

Aunque el lenguaje es similar a SQL, existen escenarios que requieren el uso de funciones especiales. Adelante tenemos un ejemplo que en SQL clásico podría ser resuelto con el uso de la palabra reservada LIKE. En este caso, ya que los campos pueden ser desde strings hasta arrays debemos de usar la función Contains.

Utilizando el API podemos también interactuar con nuestra cuenta de Cosmos, podemos crear bases de datos y contenedores así como manejar la ingesta y manipulación de los datos.

Para mayor información pueden consultar los siguientes links.

Información Técnica.

Transacciones en Cosmos DB.

Particiones.

Soluciones de almacenamiento en Azure

¿Qué es Azure?

Azure es un servicio de computación en la nube extremadamente flexible con tipos de servicios PaaS (Plataforma como servicio), SaaS (Software como servicio) o IaaS (Infraestructura como servicio) que soporta además arquitecturas completamente en la nube o hibridas, dejando así a los desarrolladores enfocarse en el código sin lidiar con mantenimiento de servidores o gestión de hardware y software.

Una parte importante de los servicios que Azure oferta es que una gran cantidad de ellos se paga por lo que se usa, de esta manera se incentiva la experimentación y la adopción de nuevas tecnologías. Si quisiéramos que nuestra empresa use un SQL Data Warehouse, nos tomaría probablemente semanas o meses para que éste se encuentre operativo on-premise además de la alta inversión inicial. Azure nos permite tener este servicio funcionando en minutos.

Dentro de las muchas ofertas tecnológicas de Azure, una de ellas es el manejo de datos y es en la que se enfocarán estos artículos.


Esta imagen muestra los servicios de Azure en datos, aunque no está actualizada nos servirá en este artículo ya que ilustra la intención de Microsoft de mantenerse en la vanguardia tecnológica y ofrecer un servicio completo a diferentes tipos de necesidades que el cliente o el desarrollador tenga, todo esto en la nube.

Para resumir, ¿Por qué migrar a la nube, y en particular a Azure, mis necesidades de datos?

  • Facilidad de migración y gestión. La creación y gestión de servicios son fáciles y rápidos ya que pueden ser realizados desde el portal de Azure o automatizados usando Azure CLI. La migración es segura y confiable usando herramientas como Microsoft Data Migration Assistant o el servicio de Azure Data Box para grandes cantidades de datos.
  • Compatibilidad y flexibilidad. Usando servicios como Azure Data Factory se puede dirigir los flujos de datos de muchas aplicaciones de forma sencilla ya que existen conectores para SAP, Microsoft Dynamics o AWS. Azure permite también el uso de arquitecturas hibridas o completamente en la nube.
  • Tecnología de punta en unos cuantos clicks. Big Data, Machine Learning, IoT son tecnologías que están siendo usadas exitosamente por una gran cantidad de empresas. El desarrollo y la infraestructura necesaria para usarlas supone un costo prohibitivo. Azure tiene todo listo para que esta tecnología sea aprovechada por el desarrollador sin preocupaciones extra.

¿Qué servicios usar?

La gran cantidad de opciones que tenemos puede llegar a intimidar y aunque existen muchos recursos en línea para ayudarnos con nuestras dudas, algunos son contradictorios o no son del todo claros.

Para hablar con claridad acerca de los servicios de Azure debemos recordar algunas definiciones que nos ayudaran a distinguir y hacer una buena elección.

  • Datos Estructurados. Mejor conocidos como SQL, son tabulares y generalmente relacionales. Datos muy organizados que siguen un esquema.
  • Datos Semiestructurados. No necesariamente siguen un esquema y no son tan organizados. Por ejemplo, datos Json o XML.
  • Datos no estructurados. Datos difíciles de interpretar como logs binarios, vídeos o imágenes.

Además de diferentes tipos de datos hay diferencias en los objetivos de las bases de datos.

  • Transaccional. Generalmente operativas, se enfocan en garantizar velocidad e integridad al realizar operaciones. Una transacción es aquella que cumple la propiedad ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad). Por ejemplo, bases de datos bancarias.
  • Analítica. Almacena datos históricos que pueden ser usados para obtener información de negocio y alimentar el proceso de toma de decisiones. Por ejemplo, SQL Data Warehouse.

Una vez recordado estas definiciones la siguiente imagen que muestra algunos servicios importantes de Azure que pueden ser de utilidad para planear un proyecto en la nube de almacenamiento.

* CosmosDB soporta transacciones únicamente al usar Stored Procedures o Triggers

Si mi negocio necesita almacenar imágenes o vídeos para algún tipo de catálogo y no tengo interés en tecnología analítica, alguna implementación de Azure Blob Storage sería lo indicado.

Tengo necesidad de almacenar operaciones transaccionales Azure SQL DB o Azure Cosmos DB es de mi interés. Cosmos DB sería especialmente útil si los datos que voy a almacenar no siguen siempre el mismo esquema o patrón.

Azure Data Lake Gen 2 y Azure Synapse Analytics son bases de datos analíticas enfocadas a big data donde ASA(Azure Synapse Analytics) es la combinación de los servicios de SQL Data Warehouse y Data Lakes, si nuestro negocio tiene necesidad de almacenar transacciones históricas para hacer análisis buscaría usar Azure SQL Data Warehouse, si mis datos no son de bases de datos relacionales usaría Azure Data Lake Gen 2 y si tengo necesidad de ambos Azure Synapse Analytics podría ser la mejor solución.

Además de estas características otro factor que influenciará nuestra decisión es el costo ya que no todas cobra de la misma manera.

¿Por qué usar Data Lake cuando puedo usar Synapse? ¿Si sólo me interesa el almacenamiento sin los servicios de análisis aun así debería de usar un Data Lake? Para responder estas preguntas será necesario hacer un análisis de costos y Microsoft nos apoya también con esto.

Usando esta herramienta y con ayuda de documentación podemos encontrar los servicios de mayor utilidad y menor precio.

En los próximos artículos hablaré un poco mas a detalle de Azure Cosmos DB y Azure Data Lakes haciendo también una pequeña arquitectura con estas herramientas.

Crea una cuenta de Azure gratis.

Documentación.