Azure Cosmos DB
Azure Cosmos DB — это глобально распределённая многомодельная система управления базами данных (СУБД), разработанная корпорацией Microsoft. Относится к классу NoSQL-баз данных и предназначена для обеспечения высокой доступности, низкой задержки доступа к данным и автоматического масштабирования в глобальном масштабе. Ключевая особенность Cosmos DB — поддержка нескольких моделей данных (документная, графовая, семейство столбцов, ключ-значение) и нескольких API, включая SQL API, MongoDB, Cassandra, Gremlin и Table.
История
Azure Cosmos DB была впервые представлена публике в мае 2017 года на конференции Microsoft Build. Проект изначально разрабатывался внутри Microsoft под кодовым названием «Project Olympus» и был создан для поддержки собственных глобальных сервисов компании, таких как Bing, Office 365 и Skype. Первоначально сервис назывался Azure DocumentDB и поддерживал только документную модель данных с API, похожим на SQL. С выпуском Cosmos DB Microsoft расширила функциональность, добавив поддержку других NoSQL-моделей и API.
В 2019 году Microsoft объявила о запуске Azure Cosmos DB Serverless, позволяющего платить только за потреблённые ресурсы без необходимости предварительного выделения пропускной способности. В 2021 году была добавлена поддержка Azure Synapse Link, позволяющая выполнять аналитические запросы непосредственно к данным Cosmos DB без копирования их в отдельное хранилище.
Архитектура и ключевые характеристики
Глобальное распределение
Основная архитектурная концепция Cosmos DB — глобальное распределение. База данных может быть развёрнута в любом количестве регионов Azure по всему миру. Данные автоматически реплицируются между выбранными регионами, обеспечивая низкую задержку чтения (менее 10 мс для чтения и менее 15 мс для записи в пределах одного региона) и высокую доступность (SLA 99,999% для чтения и 99,99% для записи). Пользователь может настроить политику согласованности данных и выбрать, какие регионы будут участвовать в репликации.
Модели данных и API
Azure Cosmos DB поддерживает несколько моделей данных через различные API:
- SQL API (Core API): Документная модель, использующая SQL-подобный синтаксис для запросов. Это основной API, предоставляемый по умолчанию. Данные хранятся в формате JSON.
- MongoDB API: Полностью совместим с протоколом MongoDB (версии 3.6 и 4.0). Позволяет приложениям, написанным для MongoDB, подключаться к Cosmos DB без изменения кода.
- Cassandra API: Поддерживает протокол Apache Cassandra (версия 3.x). Позволяет использовать Cosmos DB как замену для кластеров Cassandra.
- Gremlin API: Графовая модель данных, использующая язык запросов Apache TinkerPop Gremlin. Предназначена для работы с графами (узлы и рёбра).
- Table API: Поддерживает протокол Azure Table Storage, предоставляя масштабируемое хранилище типа «ключ-значение» с возможностью запросов по ключу.
Уровни согласованности
В отличие от традиционных реляционных баз данных, которые обычно предлагают только строгую согласованность, Cosmos DB предоставляет пять чётко определённых уровней согласованности, которые пользователь может выбирать в зависимости от требований приложения:
- Strong (Строгая): Гарантирует, что все операции чтения увидят последнюю запись. Обеспечивает самую высокую согласованность, но самую высокую задержку.
- Bounded Staleness (Ограниченное устаревание): Чтения могут отставать от записей не более чем на заданное количество версий или интервал времени (например, не более 5 секунд).
- Session (Сессионная): Гарантирует, что в рамках одной сессии (например, пользовательской) клиент увидит все свои собственные записи. Это уровень по умолчанию.
- Consistent Prefix (Согласованный префикс): Гарантирует, что чтения никогда не увидят записи в неправильном порядке (например, сначала версию 2, потом версию 1).
- Eventual (Конечная): Самая слабая согласованность. Гарантирует, что в конечном итоге все реплики получат все записи, но в любой момент времени чтения могут вернуть устаревшие данные.
Производительность и единицы запросов (RU)
Производительность в Cosmos DB измеряется в единицах запросов (Request Units, RU). RU — это абстрактная единица, которая объединяет в себе потребление процессора, памяти и операций ввода-вывода. Каждая операция (чтение, запись, запрос) потребляет определённое количество RU. Пользователь может заранее выделить определённое количество RU в секунду для контейнера или базы данных. Автоматическое масштабирование позволяет динамически увеличивать или уменьшать выделенные RU в зависимости от нагрузки.
Классификация и виды
Azure Cosmos DB можно классифицировать по нескольким признакам:
- По модели данных: Документная (SQL, MongoDB), графовая (Gremlin), столбцовая (Cassandra), ключ-значение (Table).
- По способу распределения: Глобально распределённая база данных с возможностью выбора регионов.
- По уровню управления: Полностью управляемый облачный сервис (PaaS — Platform as a Service). Пользователь не управляет серверами, операционной системой или обновлениями.
- По типу использования: Операционные базы данных (OLTP — Online Transaction Processing) для приложений с высокой нагрузкой на чтение и запись.
Применение
Azure Cosmos DB используется в следующих сценариях:
- Интернет-вещей (IoT): Обработка и хранение потоков данных от миллионов устройств.
- Персонализация и рекомендации: Хранение профилей пользователей и их поведения для предоставления персонализированного контента.
- Глобальные веб-приложения: Создание веб-сайтов и мобильных приложений, доступных пользователям по всему миру с низкой задержкой.
- Системы управления контентом (CMS): Хранение и управление контентом для крупных медиа-порталов.
- Финансовые услуги: Обработка транзакций и ведение реестров с высокой доступностью.
- Игры: Хранение игровых данных, рейтингов и профилей игроков.
Критика
Несмотря на широкие возможности, Azure Cosmos DB подвергается критике по нескольким направлениям:
- Стоимость: Модель ценообразования на основе RU может быть непредсказуемой для приложений с нестабильной нагрузкой. Высокая стоимость хранения данных по сравнению с некоторыми конкурентами (например, Amazon DynamoDB в определённых сценариях).
- Сложность настройки: Настройка глобальной репликации, уровней согласованности и политик индексирования требует глубокого понимания архитектуры и может быть сложной для новичков.
- Ограничения модели данных: Несмотря на поддержку нескольких моделей, Cosmos DB не является реляционной базой данных и не поддерживает полноценные SQL-запросы с JOIN и транзакциями ACID в том же объёме, что и традиционные СУБД.
- Привязка к облаку: Сервис является проприетарным и тесно связан с экосистемой Microsoft Azure. Миграция на другую платформу может быть сложной и дорогостоящей.
Интересные факты
- Azure Cosmos DB была использована для поддержки работы Cortana — голосового помощника Microsoft.
- Технология TokuDB, лежащая в основе некоторых механизмов хранения Cosmos DB, была приобретена Microsoft в 2018 году.
- Cosmos DB поддерживает автоматическое индексирование всех полей по умолчанию, что упрощает разработку, но увеличивает стоимость хранения.
Источники
- Microsoft Docs. «Introduction to Azure Cosmos DB».
- Microsoft Docs. «Consistency levels in Azure Cosmos DB».
- Microsoft Docs. «Request Units in Azure Cosmos DB».
- Статья «Azure Cosmos DB: The database of the future» на портале TechCrunch (2017).
- Официальный блог Microsoft Azure.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →