paint-brush
使用 Elasticsearch 卸载 DynamoDB 的搜索和分析:优点和缺点经过@rocksetcloud
231 讀數

使用 Elasticsearch 卸载 DynamoDB 的搜索和分析:优点和缺点

经过 Rockset8m2024/05/10
Read on Terminal Reader

太長; 讀書

虽然 Elasticsearch 以灵活性和高度可定制性而闻名,但它是一个复杂的分布式系统,需要集群和索引操作和管理才能保持性能。
featured image - 使用 Elasticsearch 卸载 DynamoDB 的搜索和分析:优点和缺点
Rockset HackerNoon profile picture


DynamoDB 上的分析

工程团队经常需要对 DynamoDB 中的数据运行复杂的筛选器、聚合和文本搜索。但是,DynamoDB 是一个针对事务处理而非实时分析进行优化的操作数据库。因此,许多工程团队在 DynamoDB 上的分析能力受到限制,并开始寻求替代方案。


这是因为操作工作负载的访问模式与复杂的分析工作负载截然不同。DynamoDB 仅支持有限的操作,这使得分析变得具有挑战性,在某些情况下甚至无法进行。即使是 DynamoDB 背后的公司AWS也建议公司考虑将分析转移到其他专用解决方案上。一个常被提及的解决方案是 Elasticsearch,我们今天将深入探讨它。


DynamoDB是最流行的 NoSQL 数据库之一,被游戏、社交媒体、物联网和金融服务领域的许多网络规模公司使用。DynamoDB 因其可扩展性和简单性而成为首选数据库,可在每秒 20M 个请求的规模下实现个位数毫秒的性能。为了实现这种大规模速度,DynamoDB 专注于提高操作工作负载的性能 - 对单个数据记录进行高频率、低延迟操作。


Elasticsearch是一个基于 Lucene 构建的开源分布式搜索引擎,用于文本搜索和日志分析用例。Elasticsearch 是更大的 ELK 堆栈的一部分,其中包括用于分析仪表板的可视化工具 Kibana。虽然 Elasticsearch 以灵活和高度可定制而闻名,但它是一个复杂的分布式系统,需要集群和索引操作和管理才能保持高性能。Elastic 和 AWS 提供 Elasticsearch 的托管产品,因此您无需在 EC2 实例上自行运行它。


无耻的广告: Rockset是为云构建的实时分析数据库。它有一个内置的 DynamoDB 连接器,可以提取和索引数据以进行亚秒级搜索、聚合和连接。但这篇文章重点介绍了 DynamoDB 和 Elasticsearch 的用例,以防您想探索该选项。

使用 AWS Lambda 将 DynamoDB 连接到 Elasticsearch

您可以使用 AWS Lambda 将 DynamoDB 数据持续加载到 Elasticsearch 中进行分析。其工作原理如下:


  • 创建一个 lambda 函数,将DynamoDB 流中的每个更新同步到 Elasticsearch
  • 创建一个 lambda 函数来拍摄现有 DynamoDB 表的快照并将其发送到 Elasticsearch。您可以使用EC2 脚本Amazon Kinesis 流来读取 DynamoDB 表内容。



还有一种将数据同步到 Elasticsearch 的替代方法,涉及 DynamoDB 的Logstash 插件,但目前不受支持并且配置起来很复杂。

使用 Elasticsearch 对 DynamoDB 数据进行文本搜索

文本搜索是指在文档中搜索文本以找到最相关的结果。通常,您需要搜索单词的一部分、单词的同义词或反义词或一串单词以找到最佳结果。某些应用程序甚至会根据搜索词的重要性对其赋予不同的权重。


DynamoDB 仅通过使用分区来帮助过滤数据,就可以支持一些有限的文本搜索用例。例如,如果您是一个电子商务网站,您可以根据产品类别对 DynamoDB 中的数据进行分区,然后在内存中运行搜索。显然,这就是Amazon.com 零售部门处理大量文本搜索用例的方式。DynamoDB 还支持包含函数,使您能够找到包含特定数据子字符串的字符串。



电子商务网站可能会根据产品类别划分数据。搜索数据中可能会显示其他属性,例如品牌和颜色。


在全文搜索是应用程序核心的情况下,您需要使用具有相关性排名的搜索引擎(如 Elasticsearch)。以下是 Elasticsearch 中文本搜索的高级工作原理:


  • 相关性排名:Elasticsearch 具有相关性排名,它可立即为搜索结果提供该排名,或者您可以根据特定的应用程序用例自定义排名。默认情况下,Elasticsearch 将根据术语频率、逆文档频率和字段长度规范创建排名分数。


  • 文本分析:Elasticsearch 将文本分解为标记以索引数据,这称为标记化。然后,将分析器应用于规范化的术语以增强搜索结果。默认标准分析器根据 Unicode 联盟对文本进行拆分,以提供通用的多语言支持。


Elasticsearch 还具有模糊搜索、自动完成搜索等概念,甚至可以配置更高级的相关性以满足您的应用程序的具体要求。

使用 Elasticsearch 对 DynamoDB 数据进行复杂过滤

复杂过滤器用于缩小结果集,从而更快、更高效地检索数据。在许多搜索场景中,您需要组合多个过滤器或过滤一定范围内的数据,例如一段时间内的数据。


DynamoDB 对数据进行分区,选择合适的分区键有助于更高效地筛选数据。DynamoDB 还支持二级索引,因此您可以复制数据并使用不同的主键来支持其他筛选器。当您的数据有多种访问模式时,二级索引会很有帮助。


例如,可以设计一个物流应用程序来根据物品的交付状态进行筛选。为了在 DynamoDB 中模拟此场景,我们将为物流创建一个基表,其分区键为Item_ID ,排序键为Status ,属性为 Buyer、 ETASLA


当交付延迟超过 SLA 时,我们还需要在 DynamoDB 中支持额外的访问模式。可以利用 DynamoDB 中的二级索引来筛选出超过 SLA 的交付。


将在字段ETADelayedBeyondSLA上创建索引,该字段是基表中已有的 ETA 属性的副本。仅当 ETA 超过 SLA 时,此数据才包含在ETADelayedBeyondSLA中。二级索引是稀疏索引,减少了查询中需要扫描的数据量。 buyer是分区键,排序键是ETADelayedBeyondSLA




二级索引可用于支持应用程序中的多种访问模式,包括涉及复杂过滤器的访问模式。


DynamoDB 在其查询和扫描 API 中确实有一个filterexpression操作filterexpression用于过滤与表达式不匹配的结果。filterexpression 仅在查询或扫描表操作之后应用,因此您仍然受查询 1MB 数据限制的限制。也就是说, filterexpression有助于简化应用程序逻辑、减少响应负载大小和验证生存时间到期。总之,您仍然需要根据应用程序的访问模式对数据进行分区,或者使用二级索引来过滤 DynamoDB 中的数据。


DynamoDB 按键和值组织数据,以便快速检索数据,但并不适合进行复杂的筛选。当您需要复杂的筛选时,您可能需要使用 Elasticsearch 等搜索引擎,因为这些系统非常适合大海捞针式查询。


在 Elasticsearch 中,数据存储在搜索索引中,即以发布列表形式存储列值的文档列表。任何具有谓词的查询(即WHERE user=A)都可以快速获取满足谓词的文档列表。由于发布列表已排序,因此可以在查询时快速合并它们,以便满足所有过滤条件。Elasticsearch 还使用简单的缓存来加快频繁访问的复杂过滤查询的检索过程。


过滤查询(通常称为 Elasticsearch 中的非评分查询)可以比文本搜索查询更快、更高效地检索数据。这是因为这些查询不需要相关性。此外,Elasticsearch 还支持范围查询,从而可以在上限和下限之间快速检索数据(即: age在 0-5 岁之间)。

使用 Elasticsearch 对 DynamoDB 数据进行聚合

聚合是指将数据收集起来并以摘要形式表达,用于商业智能或趋势分析。例如,您可能希望实时显示应用程序的使用情况指标。


DynamoDB 不支持聚合函数。AWS 推荐的解决方法是使用DynamoDB 和 Lambda来维护 DynamoDB 表中数据的聚合视图。


让我们以在 Twitter 等社交媒体网站上聚合点赞为例。我们将tweet_ID设为主键,然后将排序键设为聚合点赞的时间窗口。在本例中,我们将启用 DynamoDB 流并附加 Lambda 函数,这样当推文被点赞(或不喜欢)时,它们就会在like_count中以时间戳(即last_ updated )进行制表。



在这种情况下,DynamoDB 流和 Lambda 函数用于将 like_count 制表为表上的属性。


另一个选择是将聚合卸载到另一个数据库,例如 Elasticsearch。Elasticsearch 的核心是搜索索引,并添加了扩展以支持聚合函数。其中一个扩展是doc values ,这是一种在索引时构建的结构,用于以列为导向的方式存储文档值。该结构默认应用于支持 doc values 的字段,doc values 会带来一些存储膨胀。如果您只需要支持 DynamoDB 数据的聚合,那么使用可以有效压缩数据的数据仓库来对广泛数据集进行分析查询可能更具成本效益。


以下是Elasticsearch 聚合框架的高级概述:


  • 桶聚合:您可以将桶视为类似于 SQL 数据库世界中的GROUP BY 。您可以根据字段值或范围对文档进行分组。Elasticsearch 桶聚合还包括嵌套聚合和父子聚合,它们是解决缺乏连接支持的常见解决方案。

  • 指标聚合:指标允许您对一组文档执行SUMCOUNTAVGMINMAX等计算。指标还可用于计算存储桶聚合的值。

  • 管道聚合:管道聚合的输入是其他聚合,而不是文档。常见用途包括平均值和基于指标的排序。


使用聚合时可能会对性能产生影响,尤其是在扩展 Elasticsearch时。

DynamoDB 上用于搜索、聚合和连接的 Elasticsearch 替代方案

虽然 Elasticsearch 是针对 DynamoDB 数据进行复杂搜索和聚合的一种解决方案,但许多无服务器支持者对这一选择表示担忧。工程团队之所以选择 DynamoDB,是因为它无需服务器,可以大规模使用,而且运营开销很小。我们在另一篇博客中评估了其他一些DynamoDB 分析选项,包括 Athena、Spark 和 Rockset,以了解其设置、维护、查询能力和延迟的简易性。


Rockset 是 Elasticsearch 的替代品,Alex DeBrie 已经介绍了如何使用 Rockset 上的 SQL筛选和聚合查询。Rockset 是一个云原生数据库,内置 DynamoDB 连接器,可轻松上手并扩展分析用例,包括涉及复杂连接的用例。您可以在我们的免费试用版中探索 Rockset 作为 Elasticsearch 的替代品,并享受 300 美元的信用额度。