Открыть сервис

DynamoDB

Amazon DynamoDB — это полностью управляемая NoSQL-база данных класса «ключ-значение» и документная, предоставляемая в составе облачного сервиса Amazon Web Services (AWS). Она разработана для обеспечения предсказуемой производительности с высокой отказоустойчивостью и автоматическим масштабированием, что делает её популярным выбором для веб-приложений, игр, Интернета вещей (IoT) и других систем, требующих низкой задержки доступа к данным.

История

DynamoDB была представлена Amazon в январе 2012 года. Её создание было вдохновлено внутренней разработкой Amazon — распределённой системой хранения данных Dynamo, которая использовалась для управления корзиной покупок. В отличие от Dynamo, DynamoDB была с самого начала спроектирована как управляемый сервис, избавляющий пользователей от необходимости администрирования серверов и кластеров.

Ключевой особенностью DynamoDB является использование твердотельных накопителей (SSD) для обеспечения низкой задержки и высокой пропускной способности. С момента запуска сервис постоянно развивался, добавляя такие функции, как глобальные таблицы (multi-region replication), потоковая передача изменений (DynamoDB Streams), транзакции и поддержка машинного обучения (например, интеграция с Amazon SageMaker).

Архитектура и принципы работы

DynamoDB основана на архитектуре распределённого хеширования с использованием консистентного хеширования. Данные автоматически распределяются по трём географически распределённым зонам доступности (Availability Zones) в рамках одного региона AWS. Это обеспечивает высокую надёжность и отказоустойчивость без участия пользователя.

Таблицы, элементы и атрибуты

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

Первичный ключ

Каждый элемент в таблице однозначно идентифицируется первичным ключом. DynamoDB поддерживает два типа первичных ключей:

  • Простой ключ (Partition key): Состоит из одного атрибута (например, UserID). DynamoDB использует значение этого атрибута для вычисления хеша, который определяет физическое размещение элемента (раздел).
  • Составной ключ (Partition key + Sort key): Состоит из двух атрибутов. Первый (раздел) используется для распределения данных по разделам, а второй (сортировка) — для упорядочивания элементов внутри одного раздела. Это позволяет эффективно выполнять запросы на диапазон значений.

Вторичные индексы

Для обеспечения гибкости запросов DynamoDB поддерживает два типа вторичных индексов:

  • Локальный вторичный индекс (LSI): Имеет тот же ключ раздела, что и основная таблица, но другой ключ сортировки. LSI создаётся только при создании таблицы.
  • Глобальный вторичный индекс (GSI): Имеет другой ключ раздела и/или ключ сортировки, отличный от основной таблицы. GSI можно создавать и удалять в любое время.

Ключевые характеристики

Производительность и масштабирование

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

  • Единица чтения (RCU): Одна RCU обеспечивает одно сильно согласованное чтение (до 4 КБ) или два в конечном счёте согласованных чтения в секунду.
  • Единица записи (WCU): Одна WCU обеспечивает одну запись (до 1 КБ) в секунду.

Пользователь может настроить пропускную способность вручную (режим Provisioned) или использовать автоматическое масштабирование (Auto Scaling). В 2018 году был представлен режим On-Demand, при котором плата взимается только за фактически выполненные операции, что подходит для непредсказуемых нагрузок.

Согласованность данных

DynamoDB предлагает три модели согласованности:

  • В конечном счёте согласованное чтение (Eventual Consistency): По умолчанию. После записи данные становятся доступными для всех реплик в течение короткого времени (обычно менее секунды). Обеспечивает максимальную производительность.
  • Сильно согласованное чтение (Strongly Consistent Read): Гарантирует, что чтение вернёт последние записанные данные. Может иметь более высокую задержку и не поддерживается при использовании глобальных таблиц.
  • Транзакционное чтение/запись: Обеспечивает атомарность и изоляцию для операций, выполняемых в рамках одной транзакции. Транзакции могут затрагивать до 25 элементов или 100 запросов.

Потоки DynamoDB (DynamoDB Streams)

Потоки DynamoDB фиксируют изменения данных (вставки, обновления, удаления) в хронологическом порядке. Они могут быть использованы для триггеров (например, вызов AWS Lambda), репликации данных в другие сервисы (Amazon Redshift, Elasticsearch) или для создания материализованных представлений.

Глобальные таблицы (Global Tables)

Глобальные таблицы позволяют автоматически реплицировать данные между несколькими регионами AWS. Это обеспечивает низкую задержку для пользователей по всему миру и высокую доступность в случае сбоя целого региона. Репликация является многомастерной (multi-master), то есть запись может выполняться в любой регион.

Применение

DynamoDB широко применяется в различных сценариях:

  • Веб-приложения и мобильные приложения: Управление сессиями пользователей, профилями, корзинами покупок.
  • Игры: Хранение состояния игры, инвентаря, достижений.
  • Интернет вещей (IoT): Сбор и обработка телеметрии с миллионов устройств.
  • Рекламные технологии: Хранение и быстрый поиск профилей пользователей и таргетинговой информации.
  • Финансовые услуги: Обработка транзакций, управление счетами.
  • Стриминговая аналитика: В качестве источника данных для Amazon Kinesis или Apache Spark.

Ограничения и критика

Несмотря на свои преимущества, DynamoDB имеет ряд ограничений:

  • Размер элемента: Максимальный размер одного элемента (включая все атрибуты) составляет 400 КБ.
  • Отсутствие сложных запросов: DynamoDB не поддерживает SQL-подобные запросы с JOIN, агрегатные функции (SUM, COUNT без сканирования) или произвольные фильтры. Все запросы должны быть основаны на первичном ключе или вторичных индексах.
  • Стоимость: При высоких нагрузках модель оплаты (особенно On-Demand) может оказаться дороже, чем использование традиционных реляционных баз данных или других NoSQL-решений.
  • Сложность проектирования: Для эффективного использования DynamoDB требуется глубокое понимание принципов моделирования данных в NoSQL, включая выбор правильного ключа раздела для избежания «горячих разделов» (hot partitions).

Интересные факты

  • DynamoDB является одной из самых популярных баз данных в экосистеме AWS и используется такими крупными компаниями, как Netflix, Lyft, Airbnb и Samsung.
  • В 2019 году Amazon объявила о поддержке транзакций в DynamoDB, что приблизило её функциональность к реляционным базам данных.
  • Сервис поддерживает интеграцию с AWS Lambda, что позволяет создавать архитектуры на основе событий (event-driven architecture).

Источники

  • Официальная документация Amazon DynamoDB (AWS Documentation)
  • «Dynamo: Amazon’s Highly Available Key-value Store» (Giuseppe DeCandia et al., 2007)
  • «Amazon DynamoDB: A Fully Managed NoSQL Database Service» (AWS re:Invent 2012)
  • Книга «The DynamoDB Book» (Alex DeBrie)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →