Инженерным командам часто приходится запускать сложные фильтры, агрегаты и текстовый поиск по данным из DynamoDB. Однако DynamoDB — это оперативная база данных, оптимизированная для обработки транзакций, а не для анализа в реальном времени. В результате многие инженерные группы столкнулись с ограничениями по аналитике DynamoDB и ищут альтернативные варианты.
Это связано с тем, что операционные рабочие нагрузки имеют совсем другие шаблоны доступа, чем сложные аналитические рабочие нагрузки. DynamoDB поддерживает только ограниченный набор операций, что усложняет аналитику, а в некоторых ситуациях делает ее невозможной. Даже AWS , компания, стоящая за DynamoDB, советует компаниям рассмотреть возможность переноса аналитики на другие специализированные решения. Одним из часто упоминаемых решений является Elasticsearch, в которое мы сегодня углубимся.
DynamoDB — одна из самых популярных баз данных NoSQL, которая используется многими веб-компаниями в сфере игр, социальных сетей, Интернета вещей и финансовых услуг. DynamoDB — это база данных, которую выбирают из-за ее масштабируемости и простоты, обеспечивающей производительность, равную однозначным миллисекундам, при масштабах 20 миллионов запросов в секунду. Чтобы достичь такой скорости в масштабе, DynamoDB уделяет большое внимание обеспечению производительности для рабочих нагрузок — высокочастотных операций с низкой задержкой над отдельными записями данных.
Elasticsearch — это распределенная поисковая система с открытым исходным кодом, построенная на Lucene и используемая для текстового поиска и анализа журналов. Elasticsearch является частью более крупного стека ELK, который включает Kibana, инструмент визуализации для аналитических информационных панелей. Хотя Elasticsearch известен своей гибкостью и широкими возможностями настройки, это сложная распределенная система, для поддержания производительности которой требуются операции с кластерами и индексами, а также управление ими. Существуют управляемые предложения Elasticsearch, доступные от Elastic и AWS, поэтому вам не нужно запускать их самостоятельно на экземплярах EC2.
Shameless Plug: Rockset — это база данных аналитики в реальном времени, созданная для облака. Он имеет встроенный коннектор к DynamoDB и принимает и индексирует данные для поиска, агрегирования и объединения за доли секунды. Но эта статья посвящена вариантам использования DynamoDB и Elasticsearch, на случай, если вы захотите изучить этот вариант.
Вы можете использовать AWS Lambda для непрерывной загрузки данных DynamoDB в Elasticsearch для аналитики. Вот как это работает:
Существует альтернативный подход к синхронизации данных с Elasticsearch с использованием плагина Logstash для DynamoDB, но он в настоящее время не поддерживается и его может быть сложно настроить.
Текстовый поиск — это поиск текста внутри документа с целью найти наиболее релевантные результаты. Часто вам нужно искать часть слова, синоним или антонимы слов или строку слов вместе, чтобы найти наилучший результат. Некоторые приложения даже оценивают условия поиска по-разному в зависимости от их важности.
DynamoDB может поддерживать некоторые ограниченные варианты использования текстового поиска, просто используя секционирование для фильтрации данных. Например, если у вас сайт электронной коммерции, вы можете разделить данные в DynamoDB на основе категории продуктов, а затем запустить поиск в памяти. Судя по всему, именно так розничное подразделение Amazon.com обрабатывает множество случаев использования текстового поиска. DynamoDB также поддерживает функцию contains , которая позволяет найти строку, содержащую определенную подстроку данных.
Сайт электронной коммерции может разделять данные по категориям продуктов. Дополнительные атрибуты могут отображаться вместе с искомыми данными, такими как марка и цвет.
В сценариях, где полнотекстовый поиск является основой вашего приложения, вам потребуется использовать поисковую систему, такую как Elasticsearch, с рейтингом релевантности. Вот как работает текстовый поиск на высоком уровне в Elasticsearch:
Рейтинг релевантности : Elasticsearch имеет рейтинг релевантности, который он автоматически присваивает результатам поиска, или вы можете настроить рейтинг для вашего конкретного случая использования приложения. По умолчанию Elasticsearch создает рейтинг ранжирования на основе частоты терминов, обратной частоты документов и нормы длины поля.
Анализ текста : Elasticsearch разбивает текст на токены для индексации данных, что называется токенизацией. Затем к нормализованным терминам применяются анализаторы для улучшения результатов поиска. Стандартный анализатор по умолчанию разделяет текст в соответствии с Консорциумом Unicode, чтобы обеспечить общую многоязычную поддержку.
В Elasticsearch также есть такие концепции, как нечеткий поиск, поиск с автозаполнением и даже более расширенная релевантность, которую можно настроить в соответствии со спецификой вашего приложения.
Сложные фильтры используются для сужения набора результатов, тем самым обеспечивая более быстрое и эффективное получение данных. Во многих сценариях поиска вам потребуется объединить несколько фильтров или фильтровать по диапазону данных, например за определенный период времени.
DynamoDB разделяет данные и выбор хорошего ключа раздела может помочь повысить эффективность фильтрации данных. DynamoDB также поддерживает вторичные индексы, что позволяет реплицировать данные и использовать другой первичный ключ для поддержки дополнительных фильтров. Вторичные индексы могут быть полезны, когда к вашим данным применяется несколько шаблонов доступа.
Например, логистическое приложение может быть разработано для фильтрации товаров по статусу их доставки. Чтобы смоделировать этот сценарий в DynamoDB, мы создадим базовую таблицу для логистики с ключом раздела Item_ID
, ключом сортировки Status
и атрибутами покупателя, ETA
и SLA
.
Нам также необходимо поддерживать дополнительный шаблон доступа в DynamoDB на случай, если задержки доставки превышают соглашение об уровне обслуживания. Вторичные индексы в DynamoDB можно использовать для фильтрации только тех поставок, которые превышают соглашение об уровне обслуживания.
В поле ETADelayedBeyondSLA
будет создан индекс, который является копией атрибута ETA, уже находящегося в базовой таблице. Эти данные включаются в ETADelayedBeyondSLA
только в том случае, если ETA превышает SLA. Вторичный индекс — это разреженный индекс, уменьшающий объем данных, которые необходимо сканировать в запросе. buyer
— это ключ раздела, а ключ сортировки — ETADelayedBeyondSLA
.
Вторичные индексы можно использовать для поддержки нескольких шаблонов доступа в приложении, включая шаблоны доступа, включающие сложные фильтры.
DynamoDB имеет операцию filterexpression в своем API запросов и сканирования для фильтрации результатов, которые не соответствуют выражению. filterexpression
применяется только после запроса или операции сканирования таблицы, поэтому вы по-прежнему привязаны к ограничению данных в 1 МБ для запроса. Тем не менее, filterexpression
полезно для упрощения логики приложения, уменьшения размера полезных данных ответа и проверки срока действия. Таким образом, вам все равно придется секционировать данные в соответствии с шаблонами доступа вашего приложения или использовать вторичные индексы для фильтрации данных в DynamoDB.
DynamoDB упорядочивает данные по ключам и значениям для быстрого поиска данных и не идеален для сложной фильтрации. Если вам нужны сложные фильтры, вы можете перейти на поисковую систему, такую как Elasticsearch, поскольку эти системы идеально подходят для запросов в стоге сена.
В Elasticsearch данные хранятся в индексе поиска, то есть в списке документов, для которых значение столбца хранится в виде списка проводок. Любой запрос, имеющий предикат (например: WHERE
user=A), может быстро получить список документов, удовлетворяющих предикату. Поскольку списки публикаций отсортированы, их можно быстро объединить во время запроса, чтобы были соблюдены все критерии фильтрации. Elasticsearch также используетпростое кэширование для ускорения процесса поиска часто используемых сложных фильтровальных запросов.
Запросы с фильтрами, обычно называемые в Elasticsearch запросами без оценки , могут извлекать данные быстрее и эффективнее, чем запросы текстового поиска. Это потому, что для этих запросов не требуется релевантность. Кроме того, Elasticsearch также поддерживает запросы диапазона, что позволяет быстро извлекать данные между верхней и нижней границей (например, age
от 0 до 5).
Агрегации — это когда данные собираются и выражаются в сводной форме для бизнес-аналитики или анализа тенденций. Например, вы можете захотеть отображать показатели использования вашего приложения в режиме реального времени.
DynamoDB не поддерживает агрегатные функции. Обходной путь, рекомендованный AWS, — использовать DynamoDB и Lambda для поддержания агрегированного представления данных в таблице DynamoDB.
Давайте в качестве примера возьмем агрегирование лайков на сайте социальной сети, например Twitter. Мы tweet_ID
первичным ключом, а ключ сортировки — временным окном, по которому мы собираем лайки. В этом случае мы включим потоки DynamoDB и подключим функцию Lambda, чтобы твиты нравились (или не нравились) и отображались в like_count
с отметкой времени (т. е.: last_ updated
).
В этом сценарии потоки DynamoDB и функции Lambda используются для табулирования Like_count в качестве атрибута таблицы.
Другой вариант — выгрузить агрегаты в другую базу данных, например Elasticsearch. Elasticsearch по своей сути представляет собой поисковый индекс, в который добавлены расширения для поддержки функций агрегирования. Одним из таких расширений являются значения документа , структура, созданная во время индексации для хранения значений документа в виде столбцов. Эта структура по умолчанию применяется к полям, которые поддерживают значения документа, и существует некоторое раздувание хранилища, связанное со значениями документа. Если вам требуется поддержка только агрегирования данных DynamoDB, возможно, будет более рентабельно использовать хранилище данных, которое может эффективно сжимать данные для аналитических запросов к широким наборам данных.
Вот общий обзор структуры агрегации Elasticsearch :
Агрегации сегментов . Вы можете думать о сегментировании как о GROUP BY
в мире баз данных SQL. Вы можете группировать документы на основе значений полей или диапазонов. Агрегации корзин Elasticsearch также включают в себя вложенную агрегацию и агрегацию родительских и дочерних элементов, которые являются распространенными обходными путями отсутствия поддержки соединений.
Агрегации метрик. Метрики позволяют выполнять такие вычисления, как SUM
, COUNT
, AVG
, MIN
, MAX
и т. д., над набором документов. Метрики также можно использовать для расчета значений для агрегирования сегментов.
Конвейерные агрегаты . Входными данными для конвейерных агрегатов являются другие агрегаты, а не документы. Обычное использование включает средние значения и сортировку на основе метрики.
Использование агрегатов может повлиять на производительность, особенно при масштабировании Elasticsearch .
Хотя Elasticsearch является одним из решений для выполнения сложного поиска и агрегирования данных из DynamoDB, многие сторонники бессерверных технологий выразили обеспокоенность по поводу этого выбора. Команды инженеров выбирают DynamoDB, поскольку она не требует разделения и может использоваться в большом масштабе с минимальными эксплуатационными расходами. В другом блоге мы оценили несколько других вариантов аналитики на DynamoDB , включая Athena, Spark и Rockset, с точки зрения простоты настройки, обслуживания, возможности выполнения запросов и задержки.
Rockset — альтернатива Elasticsearch, и Алекс ДеБри рассмотрел фильтрацию и агрегирование запросов с использованием SQL на Rockset. Rockset — это облачная база данных со встроенным коннектором к DynamoDB , упрощающая начало работы и масштабирование вариантов аналитического использования, включая варианты использования со сложными соединениями. Вы можете изучить Rockset как альтернативу Elasticsearch в нашей бесплатной пробной версии с кредитами в размере 300 долларов США.