Azure Cosmos DB es un servicio de base de datos multimodelo distribuido globalmente ofrecido por Microsoft . Está diseñado para proporcionar alta disponibilidad, escalabilidad y acceso de baja latencia a los datos para aplicaciones modernas. A diferencia de las bases de datos relacionales tradicionales, Cosmos DB es una base de datos NoSQL (que significa "No solo SQL", en lugar de "cero SQL") y vectorial, [ 1 ] lo que significa que puede manejar tipos de datos no estructurados, semiestructurados, estructurados y vectoriales. [ 2 ]
Modelo de datos
Internamente, Cosmos DB almacena "elementos" en "contenedores" [ 3 ] , y estos dos conceptos se presentan de forma diferente según la API utilizada (por ejemplo, serían "documentos" en "colecciones" al usar la API compatible con MongoDB). Los contenedores se agrupan en "bases de datos", que son análogas a los espacios de nombres por encima de los contenedores. Los contenedores son independientes del esquema, lo que significa que no se impone ningún esquema al agregar elementos.
Por defecto, cada campo de cada elemento se indexa automáticamente, lo que generalmente proporciona un buen rendimiento sin necesidad de ajustarlo a patrones de consulta específicos. Estos valores predeterminados se pueden modificar configurando una política de indexación que permite especificar, para cada campo, el tipo de índice y la precisión deseada. Cosmos DB ofrece dos tipos de índices:
- rango, rango de soporte y consultas ORDER BY
- espacial, admite consultas espaciales a partir de puntos, polígonos y cadenas de líneas codificadas en fragmentos GeoJSON estándar.
Los contenedores también pueden imponer restricciones de clave única para garantizar la integridad de los datos. [ 4 ]
Cada contenedor de Cosmos DB expone un flujo de cambios, al que los clientes pueden suscribirse para recibir notificaciones sobre nuevos elementos que se agreguen o actualicen en el contenedor. [ 5 ] Al 7 de junio de 2021 , las eliminaciones de elementos no se exponen en el flujo de cambios. Los cambios se persisten en Cosmos DB, lo que permite solicitar cambios desde cualquier momento desde la creación del contenedor.
Se puede especificar un " Tiempo de vida " (o TTL) a nivel de contenedor para que Cosmos DB elimine automáticamente los elementos después de un tiempo determinado, expresado en segundos. Esta cuenta regresiva comienza después de la última actualización del elemento. Si es necesario, el TTL también se puede modificar a nivel de elemento.
API multimodelos
El modelo de datos interno descrito en la sección anterior se expone a través de:
- una API SQL propietaria.
- Cinco API de compatibilidad diferentes, que exponen puntos finales parcialmente compatibles con los protocolos de comunicación de MongoDB , Gremlin , Cassandra , Azure Table Storage y etcd ; estas API de compatibilidad permiten que cualquier aplicación compatible se conecte y utilice Cosmos DB a través de controladores o SDK estándar, al tiempo que se beneficia de las características principales de Cosmos DB, como el particionamiento y la distribución global.
API SQL
La API SQL permite a los clientes crear, actualizar y eliminar contenedores y elementos. Los elementos se pueden consultar con un dialecto SQL de solo lectura compatible con JSON . [ 8 ] Dado que Cosmos DB incorpora un motor JavaScript , la API SQL también permite:
- Procedimientos almacenados . Funciones que agrupan un conjunto arbitrariamente complejo de operaciones y lógica en una transacción compatible con ACID . Están aislados de los cambios realizados durante la ejecución del procedimiento almacenado y, o bien todas las operaciones de escritura tienen éxito, o bien todas fallan, dejando la base de datos en un estado consistente. Los procedimientos almacenados se ejecutan en una única partición. Por lo tanto, quien los llama debe proporcionar una clave de partición al llamar a una colección particionada. Los procedimientos almacenados pueden utilizarse para compensar la falta de ciertas funcionalidades. Por ejemplo, la falta de capacidad de agregación se compensa con la implementación de un cubo OLAP como procedimiento almacenado en el proyecto de código abierto documentdb-lumenize [ 9 ] .
- Disparadores . Funciones que se ejecutan antes o después de operaciones específicas (como la inserción de un documento, por ejemplo) y que pueden modificar o cancelar la operación. Los disparadores solo se ejecutan bajo petición.
- Funciones definidas por el usuario (UDF) . Funciones que se pueden llamar desde el lenguaje de consulta SQL y que lo amplían, compensando las limitaciones de las funciones SQL.
La API SQL se expone como una API REST , que a su vez está implementada en varios SDK que son compatibles oficialmente con Microsoft y están disponibles para .NET Framework , .NET , [ 10 ] Node.js ( JavaScript ), Java y Python .
Particionamiento
Cosmos DB incorporó la capacidad de particionamiento automático en 2016 con la introducción de los contenedores particionados. Internamente, los contenedores particionados abarcan múltiples particiones físicas, distribuyendo los elementos mediante una clave de partición proporcionada por el cliente. Cosmos DB decide automáticamente cuántas particiones distribuir los datos según el tamaño y las necesidades de rendimiento. Cuando se agregan o eliminan particiones, la operación se realiza sin interrupciones, por lo que los datos permanecen disponibles mientras se reequilibran entre las particiones nuevas o restantes.
Antes de que existieran los contenedores particionados, era común escribir código personalizado para particionar los datos, y algunos SDK de Cosmos DB admitían explícitamente varios esquemas de particionamiento diferentes. Este modo sigue estando disponible, pero solo se recomienda cuando los requisitos de almacenamiento y rendimiento no superan la capacidad de un contenedor, o cuando la función de particionamiento integrada no satisface las necesidades de la aplicación.
Rendimiento ajustable
Los desarrolladores pueden especificar el rendimiento deseado para que coincida con la carga esperada de la aplicación. Cosmos DB reserva recursos (memoria, CPU e IOPS ) para garantizar el rendimiento solicitado mientras mantiene la latencia de la solicitud por debajo de 10 ms tanto para lecturas como para escrituras en el percentil 99. El rendimiento se especifica en Unidades de Solicitud (RU) por segundo. El costo para leer un elemento de 1 KB es 1 Unidad de Solicitud (o 1 RU). Las operaciones de selección por 'id' consumen un número menor de RU en comparación con las operaciones de eliminación, actualización e inserción para el mismo documento. Las consultas grandes (por ejemplo, agregaciones como count) y las ejecuciones de procedimientos almacenados pueden consumir cientos o miles de RU dependiendo de la complejidad de las operaciones necesarias. [ 11 ] La facturación mínima es por hora.
El rendimiento se puede aprovisionar a nivel de contenedor o de base de datos. Cuando se aprovisiona a nivel de base de datos, el rendimiento se comparte entre todos los contenedores de esa base de datos, con la posibilidad adicional de tener rendimiento dedicado para algunos contenedores. El rendimiento aprovisionado en un contenedor de Azure Cosmos está reservado exclusivamente para ese contenedor. [ 12 ] El máximo predeterminado de RU que se puede aprovisionar por base de datos y por contenedor es de 1.000.000 RU, pero los clientes pueden aumentar este límite poniéndose en contacto con el servicio de atención al cliente.
Como ejemplo de cálculo de costes, utilizando una única instancia de región, un recuento de 1.000.000 de registros de 1k cada uno en 5s requiere 1.000.000 RUs.$0,008/ h , lo que equivaldría a $800 . Dos regiones duplican el costo.
Distribución global
Las bases de datos de Cosmos DB se pueden configurar para que estén disponibles en cualquiera de las regiones de Microsoft Azure (54 regiones a diciembre de 2018), lo que permite a los desarrolladores de aplicaciones ubicar sus datos más cerca de donde se encuentran sus usuarios. [ 13 ] Los datos de cada contenedor se replican de forma transparente en todas las regiones configuradas. Agregar o eliminar regiones se realiza sin tiempo de inactividad ni impacto en el rendimiento. Al aprovechar la API de multi-homing de Cosmos DB, las aplicaciones no necesitan actualizarse ni volver a implementarse cuando se agregan o eliminan regiones, ya que Cosmos DB enrutará automáticamente sus solicitudes a las regiones disponibles y más cercanas a su ubicación.
Niveles de consistencia
La consistencia de los datos es configurable en Cosmos DB, lo que permite a los desarrolladores de aplicaciones elegir entre cinco niveles diferentes: [ 14 ]
- Eventual no garantiza ningún orden y solo asegura que las réplicas eventualmente convergerán.
- El prefijo consistente añade garantías de ordenación además de la eventual
- La sesión está limitada a una única conexión de cliente y básicamente garantiza una consistencia de lectura de escrituras propias para cada cliente; es el nivel de consistencia predeterminado [ 15 ].
- La obsolescencia limitada mejora la consistencia del prefijo al garantizar que las lecturas no se retrasen más allá de x versiones de un elemento o un intervalo de tiempo especificado.
- La consistencia fuerte (o linealizable ) garantiza que los clientes siempre lean la última versión comprometida globalmente.
El nivel de consistencia deseado se define a nivel de cuenta, pero puede modificarse para cada solicitud mediante un encabezado HTTP específico o la función correspondiente que ofrecen los SDK. Los cinco niveles de consistencia se han especificado y verificado utilizando el lenguaje de especificación TLA+ , cuyo modelo de código abierto está disponible en GitHub. [ 16 ]
Multimaster
El modelo de distribución original de Cosmos DB implica una única región de escritura, siendo todas las demás regiones réplicas de solo lectura. En marzo de 2018, Microsoft anunció una nueva capacidad multi-maestro para Azure Cosmos DB, que permite que varias regiones actúen como réplicas de escritura. Esta característica introdujo una mejora significativa con respecto a su modelo original de una única región de escritura, donde las demás regiones eran de solo lectura. Con la configuración multi-maestro, las escrituras concurrentes desde diferentes regiones pueden generar posibles conflictos, que pueden resolverse mediante la política predeterminada "La última escritura gana" (LWW) o un mecanismo de resolución de conflictos personalizado, como una función de JavaScript. La política LWW se basa en marcas de tiempo para determinar la escritura ganadora, mientras que la opción personalizada permite a los desarrolladores gestionar los conflictos mediante reglas definidas por la aplicación. [ 17 ]
Tienda analítica
Esta característica, anunciada en mayo de 2020, [ 18 ] es un almacén de columnas totalmente aislado que permite realizar análisis a gran escala sobre datos operativos en Azure Cosmos DB, sin afectar a sus cargas de trabajo transaccionales. Esta característica resuelve los problemas de complejidad y latencia que presentan las canalizaciones ETL tradicionales , las cuales requieren un repositorio de datos optimizado para ejecutar el procesamiento analítico en línea. Para ello, sincroniza automáticamente los datos operativos en un almacén de columnas independiente, adecuado para realizar consultas analíticas a gran escala de forma optimizada, lo que reduce la latencia de dichas consultas.
Mediante Microsoft Azure Synapse Link [ 19 ] para Cosmos DB, es posible crear soluciones híbridas de procesamiento transaccional/analítico sin ETL , conectándose directamente con el almacén analítico de Azure Cosmos DB desde Synapse Analytics. Esto permite ejecutar análisis a gran escala casi en tiempo real directamente sobre los datos operativos.
Casos de uso reales
Microsoft utiliza Cosmos DB en muchas de sus propias aplicaciones, [ 20 ] incluyendo Microsoft Office , Skype , Active Directory , Xbox y MSN .
Cosmos DB se combina con otros servicios de Azure, como Azure App Services y Azure Traffic Manager, para crear una aplicación más resiliente. [ 21 ]
Perfilador de base de datos Cosmos
La herramienta de optimización de costos en la nube Cosmos DB Profiler detecta consultas de datos ineficientes en las interacciones entre una aplicación y su base de datos Cosmos DB. El profiler alerta a los usuarios sobre el desperdicio de rendimiento y los gastos excesivos en la nube. También recomienda cómo resolverlos aislando y analizando el código y dirigiendo a los usuarios a la ubicación exacta. [ 22 ]
Limitaciones
- SQL es limitado. Las agregaciones se limitan a las funciones COUNT, SUM, MIN, MAX y AVG, pero no admite GROUP BY ni otras funcionalidades de agregación presentes en los sistemas de bases de datos. Sin embargo, se pueden usar procedimientos almacenados para implementar la capacidad de agregación dentro de la base de datos. [ 23 ]
- Las uniones SQL entre "tablas" no son posibles,
- Solo admite tipos de datos JSON puros. En particular, Cosmos DB no admite datos de fecha y hora, lo que obliga a almacenarlos utilizando los tipos de datos disponibles. Por ejemplo, se pueden almacenar como una cadena ISO-8601 o un entero de época. MongoDB , la base de datos con la que más se compara Cosmos DB, extendió JSON en su especificación de serialización binaria BSON para admitir datos de fecha y hora, así como tipos numéricos tradicionales, expresiones regulares y valores indefinidos.
Referencias
- ↑ "Base de datos de vectores" . learn.microsoft.com . Consultado el 30 de marzo de 2024 .
- ↑ Kumar, Chandan (7 de marzo de 2023). "Azure Cosmos DB y bases de datos NoSQL" . skillzcafe . Archivado del original el 31 de mayo de 2023. Recuperado el 11 de abril de 2023 .
- ↑ "Trabajar con bases de datos, contenedores y elementos de Azure Cosmos DB" . docs.microsoft.com . Consultado el 13 de diciembre de 2018 .
- ↑ "Claves únicas en Azure Cosmos DB" . Blog de Dibran . 3 de julio de 2018. Consultado el 13 de diciembre de 2018 .
- ↑ "Trabajar con la compatibilidad con fuentes de cambios en Azure Cosmos DB" . docs.microsoft.com . Consultado el 3 de julio de 2021 .
- ↑ "La API de Azure Cosmos DB ahora admite la versión 3.6 de MongoDB" . azure.microsoft.com . Consultado el 11 de febrero de 2020 .
- ↑ "Introducción a la API etcd de Azure Cosmos DB" . docs.microsoft.com . Consultado el 10 de junio de 2020 .
- ↑ "Sintaxis del lenguaje SQL en Azure Cosmos DB" . docs.microsoft.com . Consultado el 13 de diciembre de 2018 .
- ↑ Maccherone, Larry. "Anuncio de documentdb-lumenize" . blog.lumenize.com . Archivado del original el 20 de diciembre de 2016. Consultado el 11 de diciembre de 2016 .
- ↑ "Uso de Azure DocumentDB y ASP.NET Core para un rendimiento NoSQL extremo" . auth0.com .
- ↑ "Rendimiento aprovisionado: Unidades de solicitud en Azure Cosmos DB" . docs.microsoft.com . Consultado el 21 de julio de 2019 .
- ↑ "Provisionar el rendimiento en contenedores y bases de datos" . docs.microsoft.com . Consultado el 21 de julio de 2019 .
- ↑ "Cómo distribuir datos globalmente con Azure Cosmos DB" . docs.microsoft.com . Consultado el 22 de agosto de 2017 .
- ↑ "Profundizando en los diferentes niveles de consistencia de Azure Cosmos DB" . www.c-sharpcorner.com . Consultado el 13 de diciembre de 2018 .
- ↑ "Niveles de consistencia de datos configurables en Azure Cosmos DB" . docs.microsoft.com . Microsoft . Consultado el 22 de agosto de 2017 .
- ↑ GitHub - Azure/azure-cosmos-tla: Especificaciones de Azure Cosmos TLA+. , Microsoft Azure, 09/12/2018 , consultado el 13/12/2018
- ↑ "Compatibilidad con multi-maestro de Cosmos DB ya disponible de forma general | Actualizaciones de Azure | Microsoft Azure" .
- ↑ "Microsoft anuncia una nueva opción de modelo de precios para Azure Cosmos DB y más funcionalidades" . www.infoq.com . Consultado el 20 de junio de 2020 .
- ↑ "Un vistazo más de cerca a Azure Synapse Link" . ZDNet . Consultado el 15 de abril de 2017 .
- ↑ "Indexación independiente del esquema con Azure DocumentDB" (PDF) .
- ↑ Pietschmann, Chris (28 de junio de 2017). "Creación de aplicaciones resilientes a nivel global con Azure App Service y Cosmos DB" . Build5Nines.com . Opsgility . Consultado el 30 de enero de 2018 .
- ↑ "Cosmos DB Profiler" . hibernatingrhinos.com . Hibernating Rhinos . Consultado el 20 de mayo de 2020 .
- ↑ "Agregar compatibilidad con Group By para funciones de agregación" . feedback.azure.com . Consultado el 31 de marzo de 2019 .
Enlaces externos
- Sitio web oficial
- Bases de datos orientadas a documentos
- Servicios en la nube de Microsoft
- NoSQL
- Almacenes de datos distribuidos