Cosmos DB
Cosmos DB — это глобально распределённая, многомодельная система управления базами данных (СУБД), разработанная корпорацией Microsoft. Относится к классу NoSQL-баз данных и предоставляется как полностью управляемый облачный сервис (PaaS) в составе платформы Microsoft Azure. Ключевыми особенностями Cosmos DB являются автоматическое горизонтальное масштабирование, гарантированная задержка на чтение и запись на уровне миллисекунд, поддержка нескольких API для работы с данными и возможность глобального распределения данных с несколькими центрами обработки данных (регионами).
История
Разработка Cosmos DB началась внутри Microsoft как проект под кодовым названием «Project Florence» в начале 2010-х годов. Целью было создание базы данных, способной обрабатывать огромные объёмы данных с высокой скоростью и низкой задержкой для внутренних продуктов Microsoft, таких как Bing, Office 365, Skype и Xbox Live. В 2017 году Microsoft официально анонсировала Azure Cosmos DB на конференции Build, представив его как эволюцию предыдущего сервиса Azure DocumentDB, который был запущен в 2015 году. DocumentDB, в свою очередь, базировался на той же технологии, что и Cosmos DB, но был ограничен только моделью данных JSON и API, совместимым с MongoDB. Cosmos DB расширил возможности, добавив поддержку нескольких API и моделей данных.
Архитектура и ключевые технологии
Архитектура Cosmos DB основана на нескольких фундаментальных технологиях, обеспечивающих её производительность и масштабируемость.
Глобальное распределение и репликация
Cosmos DB позволяет распределять данные по любому количеству географических регионов Azure. Данные автоматически реплицируются между выбранными регионами, обеспечивая высокую доступность и устойчивость к сбоям. Пользователь может настроить политику согласованности для каждого региона, а также определить, в каком регионе данные будут доступны для записи. В случае сбоя одного региона Cosmos DB автоматически переключает запись на другой регион без вмешательства администратора.
Механизм репликации с несколькими ведущими узлами (Multi-Master)
Эта функция позволяет выполнять операции записи в любом из регионов, где развёрнута база данных. Изменения, внесённые в одном регионе, автоматически и асинхронно реплицируются во все остальные. Это позволяет добиться максимальной производительности и низкой задержки для глобально распределённых приложений, где пользователи находятся в разных частях света.
Подсистема хранения и индексации
Cosmos DB использует собственный механизм хранения, основанный на B-деревьях и LSM-деревьях (Log-Structured Merge-Tree). Данные автоматически индексируются по умолчанию без необходимости создания схемы или индексов вручную. Система поддерживает индексацию всех свойств JSON-документов, что позволяет выполнять эффективные запросы без предварительного определения структуры данных.
Уровни согласованности (Consistency Levels)
В отличие от традиционных реляционных баз данных, которые обычно предлагают только строгую согласованность, Cosmos DB предоставляет пять чётко определённых уровней согласованности, позволяя разработчикам выбирать компромисс между согласованностью, производительностью и доступностью:
- Strong (Строгая): Гарантирует, что все операции чтения возвращают последнюю записанную версию данных. Обеспечивает максимальную согласованность, но может снижать производительность и доступность.
- Bounded Staleness (Ограниченное устаревание): Гарантирует, что задержка между записью и чтением не превышает заданного количества операций (K) или времени (T). Обеспечивает компромисс между строгой согласованностью и производительностью.
- Session (Сессионная): В рамках одной сессии (например, одного пользователя) гарантирует чтение собственных записей. Это наиболее часто используемый уровень, обеспечивающий хороший баланс для большинства приложений.
- Consistent Prefix (Согласованный префикс): Гарантирует, что операции чтения никогда не увидят операции записи в неправильном порядке. Например, если сначала была записана версия A, а затем версия B, то чтение никогда не вернёт версию B без версии A.
- Eventual (Конечная): Не даёт никаких гарантий относительно порядка или времени появления записей. Обеспечивает максимальную производительность и доступность, но данные могут быть временно устаревшими.
Единица пропускной способности (Request Unit — RU)
Пропускная способность в Cosmos DB измеряется в единицах запросов (Request Units, RU). Одна RU — это единица измерения затрат на выполнение одной операции чтения, записи, запроса или транзакции. Стоимость операции зависит от размера документа, количества индексов, которые необходимо обновить, и сложности запроса. Cosmos DB позволяет выделять определённое количество RU в секунду для каждой базы данных или контейнера, что даёт возможность точно контролировать производительность и стоимость.
Модели данных и API
Cosmos DB является многомодельной базой данных, что означает, что она может работать с различными моделями данных через разные API. Все API, кроме собственного SQL API, являются эмуляциями, то есть Cosmos DB внутренне хранит данные в формате JSON, но предоставляет интерфейс, совместимый с другими базами данных.
Поддерживаемые API
- SQL API (Core API): Собственный API Cosmos DB, основанный на SQL-подобном языке запросов для работы с JSON-документами. Это наиболее полный и функциональный API, предоставляющий доступ ко всем возможностям Cosmos DB.
- MongoDB API: Предоставляет интерфейс, совместимый с MongoDB. Позволяет приложениям, написанным для MongoDB, подключаться к Cosmos DB без изменения кода. Cosmos DB эмулирует протокол MongoDB версии 4.0 и 4.2.
- Cassandra API: Предоставляет интерфейс, совместимый с Apache Cassandra. Позволяет приложениям, использующим Cassandra, мигрировать на Cosmos DB.
- Gremlin API: Предоставляет интерфейс для работы с графовыми базами данных на основе языка запросов Apache TinkerPop Gremlin. Позволяет хранить и запрашивать графовые структуры (узлы, рёбра, свойства).
- Table API: Предоставляет интерфейс, совместимый с Azure Table Storage. Позволяет приложениям, использующим Azure Table Storage, перейти на Cosmos DB с улучшенной производительностью и глобальным распределением.
Применение
Cosmos DB используется в широком спектре сценариев, где требуется высокая производительность, глобальная доступность и низкая задержка.
- Веб-приложения и мобильные приложения: Для хранения пользовательских данных, сессий, настроек, лент новостей и другого контента, требующего быстрого доступа.
- Интернет вещей (IoT): Для сбора и обработки данных с датчиков, устройств и телеметрии в реальном времени.
- Игровая индустрия: Для хранения данных игроков, игровых состояний, таблиц лидеров и внутриигровых покупок.
- Рекомендательные системы: Для хранения профилей пользователей и истории взаимодействия для построения персонализированных рекомендаций.
- Электронная коммерция: Для управления каталогами товаров, корзинами покупок, заказами и транзакциями.
- Аналитика в реальном времени: Для обработки и анализа потоков данных с низкой задержкой.
Сравнение с другими базами данных
Cosmos DB часто сравнивают с другими облачными NoSQL-базами данных, такими как Amazon DynamoDB (AWS) и Google Cloud Firestore (Google Cloud). Ключевые отличия:
- Глобальное распределение: Cosmos DB предлагает встроенную поддержку глобального распределения с репликацией с несколькими ведущими узлами, что является более зрелой и гибкой функцией по сравнению с DynamoDB, которая требует дополнительной настройки для глобальных таблиц.
- Уровни согласованности: Cosmos DB предоставляет пять чётко определённых уровней согласованности, в то время как DynamoDB предлагает два (Eventual и Strong) и Firestore — один (Strong).
- Многомодельность: Cosmos DB поддерживает несколько API (SQL, MongoDB, Cassandra, Gremlin, Table), что делает её более универсальной, чем DynamoDB (только документы и ключ-значение) и Firestore (только документы).
- Модель ценообразования: Cosmos DB использует модель RU, которая может быть сложной для прогнозирования, но позволяет точно контролировать производительность. DynamoDB использует модель на основе чтения/записи (RCU/WCU), а Firestore — на основе количества операций и объёма данных.
Критика
Несмотря на свои преимущества, Cosmos DB подвергается критике по нескольким причинам:
- Сложность: Настройка и управление Cosmos DB, особенно в глобально распределённых сценариях, может быть сложной задачей, требующей глубокого понимания архитектуры и моделей согласованности.
- Стоимость: Cosmos DB может быть дорогим, особенно при высоких требованиях к пропускной способности (RU) и глобальной репликации. Стоимость может быстро расти, если не оптимизировать запросы и не выбирать правильный уровень согласованности.
- Привязка к вендору (Vendor Lock-in): Cosmos DB является проприетарным продуктом Microsoft, что создаёт зависимость от платформы Azure. Миграция на другую базу данных может быть сложной и дорогостоящей, хотя поддержка нескольких API (например, MongoDB API) несколько смягчает эту проблему.
- Ограничения API: API, эмулирующие другие базы данных (MongoDB, Cassandra), могут не поддерживать все функции оригинальных баз данных, что может ограничивать возможности разработчиков.
Источники
- Документация Microsoft Azure: Azure Cosmos DB
- Официальный блог Microsoft Azure: анонс Azure Cosmos DB (2017)
- Технические статьи и документация по архитектуре Cosmos DB
- Сравнительные обзоры облачных NoSQL-баз данных (например, от Gartner, Forrester)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →