Azure Cosmos DB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:12, 21 января 2019.
(перенаправлено с «Cosmos DB»)
Cosmos DB
Cosmos db logo.jpg
Разработчики: Microsoft Corporation
Выпущена: май 2017 года
Состояние разработки: Активное
Написана на: C#
Тип ПО: СУБД
Лицензия: Проприетарное
Веб-сайт azure.microsoft.com/ru-ru/services/cosmos-db/

Azure Cosmos DB - это запатентованная глобально распределенная, мультимодельная система управления базами данных Microsoft для управления данными на планете, запущенная в мае 2017 года. Она основывается на и расширяет предыдущий Azure DocumentDB, который был выпущен в 2014 году. и обычно классифицируется как база данных NoSQL.[Источник 1].


Содержание

Описание

На конференции Microsoft Build 2017 компания представила Azure Cosmos DB — первый глобально-распределённый сервис баз данных, обеспечивающий горизонтальное масштабирование и позволяющий хранить данные практически в любом географическом регионе. При этом обеспечивается минимальная задержка, высокая доступность и стабильность. Cosmos DB был разработан для поддержки технологий Интернета вещей, мобильной разработки и искусственного интеллекта. [Источник 2].

Это первая облачная база данных, обладающая встроенной поддержкой множества моделей данных и API для запросов. Новый движок может оперировать большими объёмами информации и мгновенно отвечать на запросы. Всё это происходит без управления схемами или индексами. Также, это первая облачная база данных, в которой есть пять различных моделей согласованности, так что вы можете выбрать ту, которая лучше всего подходит для вашего приложения.

Azure Cosmos DB позволяет гибко и независимо масштабировать пропускную способность и ресурсы хранилища в любых регионах Azure, стоит лишь нажать кнопку. Она гарантирует пропускную способность, задержку, доступность и согласованность в соответствии с соглашениями об уровне обслуживания (SLA), которые зачастую не могут предложить другие службы баз данных. Бесплатную пробную версию Azure Cosmos DB можно использовать без подписки Azure, без оплаты и каких-либо обязательств.

Ключевые возможности

В качестве глобально распределенной многомодельной службы базы данных Azure Cosmos DB позволяет легко создавать быстродействующие и масштабируемые приложения в глобальном масштабе.

Интегрированные возможности глобального распределения

  • Вы можете распределять данные в любом числе регионов Azure одним щелчком мыши. Теперь вы можете размещать данные в непосредственной близости от пользователей, тем самым минимизируя возможные задержки.
  • Благодаря API-интерфейсам Azure Cosmos DB со множественной адресацией приложение получает актуальные данные о расположении ближайшего региона, что позволяет ему отправлять запросы в ближайший центр обработки данных. И все это возможно без необходимости изменять конфигурацию. Вы просто определяете регион записи и сколько угодно регионов чтения, а об остальном позаботится служба.
  • По мере добавления регионов в базу данных Cosmos DB и удаления их оттуда вам не нужно повторно развертывать приложение. Оно будет оставаться высокодоступным благодаря интерфейсам API множественной адресации.

Разные модели данных и популярные API-интерфейсы для доступа к данным и создания запросов к ним

  • Служба Azure Cosmos DB разработана по принципу модели данных на основе ARS. В нее встроена поддержка нескольких моделей данных, включая модели данных документов, пар "ключ-значение", графов, таблиц и семейств столбцов.
    • API-интерфейсы поддерживаются пакетами SDK, доступными на нескольких языках, для следующих моделей данных:
    • API SQL — ядро СУБД с поддержкой бессхемного формата JSON и широкими возможностями отправки SQL-запросов.
    • API MongoDB — решение MongoDB как услуга с высокой масштабируемостью на базе платформы Azure Cosmos DB. Совместимо с существующими библиотеками, драйверами, средствами и приложениями MongoDB.
    • API Cassandra — распределенное решение "Cassandra как услуга" на базе платформы Azure Cosmos DB. Совместимо с существующими библиотеками, драйверами, средствами и приложениями Apache Cassandra.
    • API Graph (Gremlin) — полностью управляемая, горизонтально масштабируемая служба базы данных графа, которая упрощает создание и запуск приложений, работающих с часто подключаемыми наборами данных, и поддерживает интерфейсы Open Graph API (созданная по спецификации Apache TinkerPop, Apache Gremlin).
    • API таблицы — служба базы данных пар "ключ-значение", созданная для предоставления возможностей уровня "Премиум" (например, автоматического индексирования, гарантировано низкой задержки и глобального распределения) существующим приложениям хранилища таблиц Azure без изменения приложений.
    • В ближайшее время будет реализована поддержка дополнительных моделей данных.

Гибкое и независимое масштабирование пропускной способности и хранилища по требованию и во всем мире

  • Легко масштабируйте пропускную способность баз данных с посекундной степенью детализации и изменяйте ее при необходимости.
  • Масштабируйте объем хранилища автоматически и прозрачно, чтобы раз и навсегда удовлетворить соответствующие требования.

Создание высокопроизводительных и критически важных приложений.

  • Azure Cosmos DB гарантирует пользователям низкую сквозную задержку на уровне 99-го процентиля.
  • Для обычного элемента размером 1 КБ Cosmos DB обеспечивает сквозную задержку операций чтения менее 10 мс, а для индексированных операций записи — менее 15 мс на уровне 99-го процентиля в пределах одного и того же региона Azure. Среднее значение задержки значительно ниже (менее 5 мс).

Гарантированная доступность

  • Доступность на уровне 99,99 % в соответствии с соглашением об уровне обслуживания для всех учетных записей базы данных в пределах одного региона и доступность для всех операций чтения на уровне 99,999 % для всех учетных записей базы данных в пределах нескольких регионов.
  • Выполняйте развертывание в любом количестве регионов Azure для повышения уровня доступности и производительности.
  • Динамически назначайте приоритет для регионов и моделируйте сбой одного или нескольких регионов с гарантированной нулевой потерей данных, чтобы проверить комплексную доступность всего приложения (не только базы данных).

Динамическая настройка

При использовании текущей рекомендуемой опции типа «секционированная коллекция», база данных Cosmos DB динамически настраивается по трем измерениям:

  • Пропускная способность. Разработчики резервируют пропускную способность сервиса в зависимости от нагрузки приложения. Cosmos DB увеличит используемые ресурсы (память, процессор и т.д.), чтобы достичь требуемой пропускной способности, сохраняя время задержки на чтение менее 10 мс и на запись менее 15 мс. Пропускная способность указывается в единицах запроса (RU) в секунду. Количество RU, потребляемых для конкретной операции, зависит от ряда факторов, но выбор одного документа 1 КБ по идентификатору занимает примерно 1 RU. Операции «Удалить», «Обновить» и «Вставить» потребляют примерно 5 RU с учетом 1 KB объема данных. Большие запросы и выполнение хранимых процедур могут потреблять от 100 до 1000 RU, исходя из их сложности.
  • Дисковое пространство. Аналогичным образом разработчики могут указать, сколько места им понадобится. Как пространство, так и пропускная способность напрямую влияют на скорость выполнения запросов пользователя. Возможна динамическая настройка, чтобы корректно обрабатывать пиковую нагрузку и уменьшать затраты при более легкой нагрузке сервера.
  • Согласованность. База данных Cosmos DB обеспечивает четыре уровня согласованности. В зависимости от требуемого уровня согласованности данных изменяется и стоимость операций RU, которая существенно снижает доступность сервиса при прочих равных.

Разделы

В 2016 году в Cosmos DB была добавлена возможность автоматического разбиения на разделы. Cosmos DB автоматически определяет, сколько разделов необходимо для хранения вашей информации базируясь на размере и количестве файлов. Во время ребалансировки разделов Cosmos DB данные остаются доступными.

Автоматическое индексирование

По умолчанию каждое поле в каждом документе автоматически индексируется, как правило, обеспечивая хорошую производительность без необходимости специальной настройки. Настройки по умолчанию можно изменить, установив политику индексирования, которая может варьироваться от поля к полю.

Поддержка JavaScript

Механизм JavaScript встроен в базу данных Cosmos. Он идеально подходит для обработки документов JSON, но также добавляет следующую дополнительную функциональность:

  • Хранимые процедуры. Функции, которые объединяют сложный набор операций и логики в ACID-совместимую транзакциию. Они изолированы от изменений, сделанных во время выполнения хранимой процедуры: либо все операции записи успешно завершаются, либо все отменяются с откатом произведенных изменений, оставляя базу данных в согласованном состоянии. Хранимые процедуры выполняются в одном разделе. Хранимые процедуры могут использоваться для восполнения недостатка определенных функций. Например, отсутствие возможности агрегации компенсируется реализацией OLAP в качестве хранимой процедуры.
  • Триггеры. Функции, которые выполняются до или после определенных операций (например, при вставке документа), которые могут либо изменить операцию, либо отменить ее.
  • Пользовательские функции (UDF). Функции, которые можно вызывать и дополнять язык запросов SQL.

Прочие поддерживаемые технологии

Рисунок 1 - Технологии Cosmos DB

В следующих средах все функции (кроме Direct Mode, которые в настоящее время поддерживаются только для .NET) явно поддерживаются выделенными SDK:

Кроме того, к базе данных Cosmos DB можно получить доступ используя следующие технологии:

  • REST API. Поддерживаются все функции, кроме Direct Mode. Вы можете вызвать REST API с любого языка программирования или платформы. На самом деле SDK Node.js, Java и Python - по сути, тонкие оболочки, вызывающие этот REST API.
  • Поддержка протокола MongoDB на уровне драйвера.

Механизмы для запросов

Предоставляются несколько механизмов для запросов:

  • SQL-подобный язык запросов с настройками для соответствия типам данных JSON.
  • LINQ интегрированные запросы.
  • Интегрированные запросы на языке JavaScript.
  • Язык запросов MongoDB (JSON).

Прочие особенности

Кроме того, у Cosmos DB есть поддержка:

  • Глобальная дистрибуция. Глобальная дистрибуция была добавлена к возможностям Cosmos DB в 2016 году. Эта функция позволяет вам масштабировать экземпляр базы данных Cosmos в разных регионах по всему миру и определять, какой тип согласованности вы хотите установить. Можно даже настроить автоматический и прозрачный изменение доступных ресурсов для конкретного региона.
  • Поддержка GeoJSON для хранения и запроса географической информации

Особенности системы

  • Триггеры должны быть явно указаны для каждой операции, которую вы хотите использовать, что делает их неэффективными как механизм поддержания согласованности бизнес-логики, если вы не можете быть уверены, что для каждой операции указаны все правильные триггеры.
  • Интегрированные запросы языка .NET LINQ не полностью поддерживаются. Со временем поддержка LINQ была добавлена, но разработчики часто путаются, когда код LINQ, который они используют в других системах, не работает должным образом в базе данных Cosmos DB, о чем свидетельствует большое количество вопросов StackOverflow, содержащих оба тега.
  • Отсутствие полностью функционирующей локальной версии. Тем не менее, осенью 2016 года был добавлен локальный эмулятор, работающий под MS Windows для использования настольных приложений для разработчиков.
  • Возможность агрегирования в SQL ограничена функциями COUNT, SUM, MIN, MAX, AVG. Нет поддержки GROUP BY или других функций агрегирования, существующих в системах баз данных. Однако хранимые процедуры могут использоваться для реализации возможности агрегации в базе данных.
  • Поддержка только для чистых типов данных JSON. В частности, в базе данных Cosmos DB отсутствует поддержка данных даты и времени, требующих сохранения этих данных с использованием доступных типов данных. Например, он может быть сохранен как строка ISO-8601 или целое число. MongoDB, база данных, к которой наиболее часто сравнивается база данных Cosmos, расширила JSON в их спецификации бинарной сериализации BSON, чтобы охватить данные даты и времени, а также традиционные типы номеров, регулярные выражения и Undefined. Тем не менее, многие утверждают, что выбор Cosmos DB чистого JSON на самом деле является преимуществом, поскольку он лучше подходит для JSON-REST API и механизма JavaScript, встроенного в базу данных.
  • Блокировка поставщика. Поскольку база данных Cosmos доступна только в качестве предложения PaaS от Microsoft Azure, и в настоящее время нет совместимой с API альтернативы, как только вы создадите систему на базе Cosmos DB, вы не сможете избежать оплаты использования Azure .

Преимущества использования с некоторыми решениями

Рисунок 2 - График зависимости различных уровней согласованности от доступности

Использование Azure Cosmos DB гарантированно обеспечит высокий уровень доступности, высокую пропускную способность, низкую задержку и настраиваемые уровни согласованности при использовании с любыми веб-приложениями, мобильными и игровыми приложениями, а также приложениями Интернета вещей, которым необходимо обрабатывать большой объем данных, большое число операций чтения и записи в глобальном масштабе с малым временем отклика практически в реальном времени. Дополнительные сведения о применении Azure Cosmos DB в Интернете вещей и телематике, в розничной торговле и маркетинге, в игровых приложениях, в веб-приложениях и мобильных приложениях.

Настраиваемые уровни согласованности данных - 5 различных уровней (Strong, Bounded Staleness, Session, Consistent Prefix, Eventual). На рисунке 2 можно видеть зависимость различных уровней согласованности от доступности, производительности и согласованности данных.

Пример работы

Создание базы данных

Создание базы данных Azure Cosmos DB происходит с помощью метода CreateDatabaseAsync или CreateDatabaseIfNotExistsAsync класса DocumentClient из пакета SDK .NET для SQL. База данных представляет собой логический контейнер для хранения документов JSON, разделенных между коллекциями.

await client.CreateDatabaseAsync(new Database { Id = "db" });

Выбор ключа секции

Коллекции — это контейнеры для хранения документов. Они являются логическими ресурсами и могут включать в себя одну или несколько физических секций. Ключ секции — это свойство (или путь) в документах, используемое для распределения данных между серверами или секциями. Все документы с одинаковым ключом секции хранятся в одной секции.

Определение ключа секции — важное решение, которое необходимо принять до создания коллекции. Ключи секции — это свойства (или пути) в документах, которые могут использоваться Azure Cosmos DB для распределения данных между несколькими серверами или секциями. База данных Cosmos DB хэширует значение ключа секции и использует хэшированный результат, чтобы определить, в какой секции сохранить документ. Все документы с одинаковым ключом секции хранятся в одной секции. Ключи секции невозможно изменить после создания коллекции.

Зададим ключ секции /deviceId, чтобы все данные одного устройства хранились в одной секции. Чтобы база данных Cosmos DB могла балансировать нагрузку по мере увеличения объема данных и достичь полной пропускной способности коллекции, необходимо выбрать ключ секции, содержащий большое количество значений, каждое из которых используется примерно с одинаковой частотой.

Создание коллекции

Теперь, когда указан ключ секции /deviceId, давайте создадим коллекцию с помощью метода CreateDocumentCollectionAsync или CreateDocumentCollectionIfNotExistsAsync класса DocumentClient. Коллекция представляет собой контейнер документов JSON и любую связанную с ними логику в виде приложения JavaScript.


Создание коллекции связано с ценовыми требованиями, так как для взаимодействия с базой данных Azure Cosmos DB для приложения резервируется пропускная способность. Дополнительные сведения см. на нашей странице цен.

// Collection for device telemetry. Here the JSON property deviceId is used  
// as the partition key to spread across partitions. Configured for 2500 RU/s  
// throughput and an indexing policy that supports sorting against any  
// number or string property. .
DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "coll";
myCollection.PartitionKey.Paths.Add("/deviceId");

await client.CreateDocumentCollectionAsync(
    UriFactory.CreateDatabaseUri("db"),
    myCollection,
    new RequestOptions { OfferThroughput = 2500 });
 

Этот метод выполняет вызов REST API в Azure Cosmos DB, а служба подготавливает число секций, основываясь на запрошенной пропускной способности. Пропускную способность коллекции можно изменить, когда требуется повысить ее производительность с помощью пакета SDK или портала Azure.

Создание документов JSON

Вставьте несколько документов JSON в базу данных Azure Cosmos DB. Вы можете создать документ с помощью метода CreateDocumentAsync, который относится к классу DocumentClient. Документы относятся к пользовательскому (произвольному) содержимому JSON. Этот пример класса содержит показание устройства и вызов CreateDocumentAsync для добавления нового показания устройства в коллекцию.

public class DeviceReading
{
    [JsonProperty("id")]
    public string Id;

    [JsonProperty("deviceId")]
    public string DeviceId;

    [JsonConverter(typeof(IsoDateTimeConverter))]
    [JsonProperty("readingTime")]
    public DateTime ReadingTime;

    [JsonProperty("metricType")]
    public string MetricType;

    [JsonProperty("unit")]
    public string Unit;

    [JsonProperty("metricValue")]
    public double MetricValue;
  }

// Create a document. Here the partition key is extracted 
// as "XMS-0001" based on the collection definition
await client.CreateDocumentAsync(
    UriFactory.CreateDocumentCollectionUri("db", "coll"),
    new DeviceReading
    {
        Id = "XMS-001-FE24C",
        DeviceId = "XMS-0001",
        MetricType = "Temperature",
        MetricValue = 105.00,
        Unit = "Fahrenheit",
        ReadingTime = DateTime.UtcNow
    });

Считывание данных

Давайте считаем документ по ключу секции и идентификатору с помощью метода ReadDocumentAsync. Обратите внимание, что операции чтения включают в себя значение PartitionKey (соответствующее заголовку запроса x-ms-documentdb-partitionkey в REST API).

// Read document. Needs the partition key and the Id to be specified
Document result = await client.ReadDocumentAsync(
  UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
  new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") });

DeviceReading reading = (DeviceReading)(dynamic)result;
Обновление данных
Теперь давайте обновим некоторые данные с помощью метода ReplaceDocumentAsync.
C#

Копировать
// Update the document. Partition key is not required, again extracted from the document
reading.MetricValue = 104;
reading.ReadingTime = DateTime.UtcNow;

await client.ReplaceDocumentAsync(
  UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
  reading);
>

Удаление данных

Теперь удалите документ с помощью ключа секции и идентификатора, используя метод DeleteDocumentAsync>.

// Delete a document. The partition key is required.
await client.DeleteDocumentAsync(
  UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
  new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") });

Запрос секционированных коллекций

При запросе данных из секционированных коллекций Azure Cosmos DB автоматически направляет запрос в секции, соответствующие значению ключа секции, указанному в фильтре (если таковой имеется). Например, этот запрос направляется только в секцию, которая содержит ключ секции XMS-0001.

// Query using partition key
IQueryable<DeviceReading> query = client.CreateDocumentQuery<DeviceReading>(
    UriFactory.CreateDocumentCollectionUri("db", "coll"))
    .Where(m => m.MetricType == "Temperature" && m.DeviceId == "XMS-0001");

Следующий запрос не имеет фильтра ключа секции (DeviceId) и "прочесывает" все секции, где он выполняется с использованием индекса секции. Обратите внимание, что требуется указать EnableCrossPartitionQuery (x-ms-documentdb-query-enablecrosspartition в REST API), чтобы пакет SDK выполнил запрос в секциях.

// Query across partition keys
IQueryable<DeviceReading> crossPartitionQuery = client.CreateDocumentQuery<DeviceReading>(
    UriFactory.CreateDocumentCollectionUri("db", "coll"), 
    new FeedOptions { EnableCrossPartitionQuery = true })
    .Where(m => m.MetricType == "Temperature" && m.MetricValue > 100);
 

Параллельное выполнение запросов

Пакеты SDK для SQL в Azure Cosmos DB версии 1.9.0 и более поздних версий поддерживают параллельное выполнение запросов, что позволяет выполнять запросы с низким уровнем задержки к секционированным коллекциям, даже если число секций в них очень велико. Например, следующий запрос настроен на выполнение параллельно по секциям.

// Cross-partition Order By queries
IQueryable<DeviceReading> crossPartitionQuery = client.CreateDocumentQuery<DeviceReading>(
    UriFactory.CreateDocumentCollectionUri("db", "coll"), 
    new FeedOptions { EnableCrossPartitionQuery = true, MaxDegreeOfParallelism = 10, MaxBufferedItemCount = 100})
    .Where(m => m.MetricType == "Temperature" && m.MetricValue > 100)
    .OrderBy(m => m.MetricValue);

Вы можете управлять параллельным выполнением запросов, регулируя следующие параметры. Параметр MaxDegreeOfParallelism позволяет управлять степенью параллелизма, т. е. устанавливать максимальное число одновременных сетевых подключений к секциям коллекции. Если установить значение -1, то степень параллелизма будет регулироваться пакетом SDK. Если параметр MaxDegreeOfParallelism не указан или имеет значение 0 (значение по умолчанию), к секциям коллекции будет установлено одно сетевое подключение. Параметр MaxBufferedItemCount обеспечивает баланс между задержкой запросов и использованием памяти на стороне клиента. Если пропустить этот параметр или задать значение -1, то число буферизованных элементов при параллельном выполнении запросов будет регулироваться пакетом SDK. При неизменном состоянии коллекции параллельный запрос будет возвращать результаты в том же порядке, что и при последовательном выполнении. При выполнении межсекционного запроса, включающего в себя сортировку (ORDER BY и/или TOP), пакет SDK для SQL параллельно выполняет запрос между секциями и объединяет частично отсортированные результаты на стороне клиента для получения глобально упорядоченных результатов. Выполнение хранимых процедур Наконец, можно выполнять атомарные транзакции с документами с одинаковым идентификатором устройства, т. е. если вы храните статистические выражения или последнее состояние устройства в одном документе, добавив следующий код в проект.

await client.ExecuteStoredProcedureAsync<DeviceReading>(
    UriFactory.CreateStoredProcedureUri("db", "coll", "SetLatestStateAcrossReadings"),
    new RequestOptions { PartitionKey = new PartitionKey("XMS-001") }, 
    "XMS-001-FE24C");

Это основные компоненты приложения базы данных Azure Cosmos DB, использующего ключ секции для эффективного масштабирования распределения данных по секциям[Источник 3].

Источники

  1. Cosmos DB // Wikipedia [2017-2018]. Дата обновления 07.04.2018. URL: https://en.wikipedia.org/wiki/Cosmos_DB (дата обращения: 15.04.2018).
  2. Microsoft представила Cosmos DB // Microsoft Azure [1995–2018]. Дата обновления: 12.12.2018. URL: https://tproger.ru/news/azure-cosmos-db/ (дата обращения 26.12.2018).
  3. Знакомство с Azure Cosmos DB // Microsoft Azure [1995–2018]. Дата обновления: 10.10.2018. URL: https://docs.microsoft.com/ru-ru/azure/cosmos-db/introduction (Дата обращения 15.04.2018).