Amazon DynamoDB
Amazon DynamoDB — это полностью управляемая NoSQL база данных класса «ключ-значение» и документоориентированная база данных, предоставляемая в составе облачной платформы Amazon Web Services (AWS). DynamoDB обеспечивает предсказуемую производительность с задержками в миллисекунды при любых масштабах нагрузки, автоматическое масштабирование и высокую доступность за счёт репликации данных в нескольких зонах доступности. Сервис не требует управления серверами, установки обновлений или настройки кластеров — все административные задачи берёт на себя провайдер.
История
DynamoDB была запущена в 2012 году как ответ на внутреннюю потребность Amazon в высокопроизводительной и отказоустойчивой системе хранения. В 2007 году инженеры Amazon опубликовали статью «Dynamo: Amazon’s Highly Available Key-value Store», в которой описали архитектуру распределённой системы, лежащей в основе корзины покупок Amazon.com. Эта система, известная как Amazon Dynamo, использовала принципы децентрализованного хэширования (consistent hashing) и репликации с возможностью настройки согласованности. Однако DynamoDB не является прямым потомком Dynamo: она представляет собой полностью переработанный сервис, адаптированный для облачного использования и поддерживающий как ключ-значение, так и документные модели данных.
Первоначально DynamoDB поддерживала только первичный ключ (partition key) и вторичные индексы. В 2013 году были добавлены глобальные вторичные индексы, позволяющие выполнять запросы по любому атрибуту. В 2014 году появилась поддержка транзакций (ACID) на уровне отдельных элементов. В последующие годы сервис получил потоковую передачу изменений (DynamoDB Streams), возможность работы с таблицами из нескольких регионов (Global Tables) и интеграцию с сервисами машинного обучения AWS.
Архитектура и принципы работы
DynamoDB основана на распределённой архитектуре с автоматическим шардированием. Каждая таблица делится на партиции (шарды) на основе значения хэша от ключа партиции. Данные распределяются равномерно по партициям, что позволяет линейно масштабировать пропускную способность при увеличении числа запросов.
Ключи и индексы
Основой доступа к данным является первичный ключ, который может быть двух типов:
- Простой ключ (partition key) — состоит из одного атрибута, значение которого определяет партицию.
- Составной ключ (partition key + sort key) — позволяет хранить несколько элементов с одинаковым ключом партиции, упорядоченных по ключу сортировки.
Для гибких запросов DynamoDB поддерживает вторичные индексы:
- Локальный вторичный индекс (LSI) — использует тот же ключ партиции, что и таблица, но другой ключ сортировки. Создаётся только при создании таблицы.
- Глобальный вторичный индекс (GSI) — имеет собственный ключ партиции, отличный от табличного. Может быть добавлен в любое время.
Модель согласованности
DynamoDB предлагает два уровня согласованности чтения:
- Eventual consistent read (согласованность в конечном счёте) — возвращает данные, которые могли быть не полностью обновлены после записи. Задержка обычно составляет менее 1 секунды.
- Strongly consistent read (строгая согласованность) — гарантирует, что чтение вернёт последнюю записанную версию данных. Требует больше ресурсов и доступно не во всех конфигурациях.
Автомасштабирование
Сервис поддерживает два режима управления пропускной способностью:
- Provisioned capacity — пользователь задаёт фиксированное число единиц чтения (RCU) и записи (WCU) в секунду. При превышении лимита запросы могут получать ошибку ProvisionedThroughputExceededException.
- On-demand — плата за каждый запрос без ограничения по пропускной способности. Подходит для непредсказуемых нагрузок.
В 2018 году появилась функция Auto Scaling, автоматически корректирующая provisioned capacity на основе загрузки.
Основные возможности
DynamoDB Streams
Поток изменений таблицы, который записывает события вставки, обновления и удаления элементов. Потоки могут быть использованы для репликации данных в другие сервисы AWS (Lambda, Kinesis, SQS) или для синхронизации с Elasticsearch.
Global Tables
Функция, позволяющая автоматически реплицировать таблицы в несколько регионов AWS. Данные становятся доступными для чтения и записи из любого региона с задержкой менее секунды. Конфликты при одновременной записи в разных регионах разрешаются по принципу «последняя запись побеждает» (last-writer-wins).
Транзакции
Начиная с 2018 года DynamoDB поддерживает транзакции ACID (атомарность, согласованность, изоляция, долговечность) в рамках одной таблицы или между несколькими таблицами. Транзакции позволяют выполнять несколько операций чтения/записи как единое целое.
Time to Live (TTL)
Автоматическое удаление элементов по истечении заданного времени. Используется для управления сроком жизни данных, например, сессий пользователей или логов.
PartiQL
Совместимый с SQL язык запросов, позволяющий выполнять операции SELECT, INSERT, UPDATE, DELETE над данными DynamoDB. PartiQL не поддерживает JOIN и сложные агрегации, но упрощает работу для разработчиков, знакомых с SQL.
Модели данных
DynamoDB поддерживает две основные модели:
- Ключ-значение — каждый элемент идентифицируется уникальным ключом и содержит произвольный набор атрибутов. Подходит для кэшей, сессий, корзин покупок.
- Документная — атрибуты могут быть вложенными (JSON-подобные структуры). Позволяет хранить сложные объекты без нормализации.
Типы данных включают: строки, числа, бинарные данные, наборы (строк, чисел, бинарных), булевы значения, null, списки и отображения (maps). Максимальный размер одного элемента — 400 КБ.
Применение
DynamoDB широко используется в веб-приложениях, мобильных сервисах, игровой индустрии, Интернете вещей (IoT) и рекламных платформах. Типичные сценарии:
- Хранение сессий пользователей — быстрый доступ к данным сессии без блокировок.
- Управление игровыми профилями — миллионы одновременных игроков с низкой задержкой.
- Логирование и метрики — приём потоков событий с помощью DynamoDB Streams.
- Каталоги товаров — хранение атрибутов продуктов с произвольной структурой.
- Платформы реального времени — чаты, ленты новостей, системы уведомлений.
Производительность и ограничения
DynamoDB гарантирует задержку на чтение/запись менее 10 миллисекунд при 99,9% запросов. Максимальная пропускная способность одной таблицы в режиме provisioned — 40 000 RCU и 40 000 WCU по умолчанию (может быть увеличена по запросу). В режиме on-demand ограничений нет.
Основные ограничения:
- Максимальное количество таблиц в аккаунте — 256 (по умолчанию).
- Максимальный размер элемента — 400 КБ.
- Максимальное количество вторичных индексов на таблицу — 20 (5 LSI + 20 GSI).
- Отсутствие полноценного SQL (JOIN, агрегации, подзапросы) — все операции выполняются через API или PartiQL.
Безопасность
DynamoDB интегрирована с AWS Identity and Access Management (IAM) для управления доступом. Поддерживается шифрование данных в покое (AES-256) и при передаче (TLS). Ключи шифрования могут управляться AWS или пользователем через AWS Key Management Service (KMS). Также доступны VPC Endpoints для изоляции трафика от публичного интернета.
Стоимость
Ценообразование DynamoDB основано на следующих компонентах:
- Пропускная способность — плата за единицы чтения и записи (в режиме provisioned) или за каждый запрос (on-demand).
- Хранение данных — плата за гигабайт в месяц.
- Потоки — плата за чтение из DynamoDB Streams.
- Global Tables — плата за репликацию трафика между регионами.
Для снижения затрат рекомендуется использовать TTL для автоматического удаления устаревших данных и резервирование пропускной способности (Reserved Capacity).
Критика
Несмотря на высокую производительность, DynamoDB имеет ряд недостатков:
- Сложность моделирования — из-за отсутствия JOIN и ограничений на индексы разработчики вынуждены проектировать данные с учётом паттернов доступа (access patterns), что требует предварительного анализа.
- Стоимость при больших объёмах — для таблиц с частыми сканированиями (scan) стоимость может быть высокой.
- Ограниченная согласованность — строгая согласованность доступна не для всех операций и увеличивает задержку.
- Отсутствие встроенных аналитических функций — для сложных запросов требуется выгрузка данных в Amazon Redshift или Athena.
Источники
- Amazon Web Services. «Amazon DynamoDB Developer Guide». AWS Documentation.
- DeCandia, G., et al. «Dynamo: Amazon’s Highly Available Key-value Store». Proceedings of SOSP 2007.
- Vogels, W. «Eventually Consistent». ACM Queue, 2008.
- AWS re:Invent 2018. «Amazon DynamoDB Deep Dive».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →