在亚马逊海王星中实现生存时间TTL,第一部分:属性图 数据库博客
在 Amazon Neptune 中实现生存时间TTL:属性图
关键要点
在这篇文章中,我们将探讨如何在 Amazon Neptune 图数据库中实现生存时间TTL。TTL 是一种机制,用于确定数据、文件或基础设施的寿命。我们将提供两种方法来自动和有效地实现 TTL,利用 AWS Lambda 和 Amazon DynamoDB 的特性,确保数据在设定的时间后自动过期和删除。
介绍 TTL
生存时间TTL是一项机制,用于确定数据、文件和基础设施等的有效期。例如,数据在内存中存在多久,或者文件在出于合规原因删除前必须保存多长时间。TTL 通常是应用于需要过期的对象的计数器或时间戳。时间戳通常由 Unix 纪元决定,即从 1970 年 1 月 1 日午夜以来经过的毫秒数。
本文介绍如何将 TTL 概念应用于存储在 Amazon Neptune 图数据库中的数据。Neptune 是一项完全托管的图数据库服务,专为云端设计,旨在简化与高度连接的数据集的图应用程序的构建和运行。我们将展示如何使用自动化的事件驱动架构在 Neptune 图数据库中创建高效的 TTL 实现机制。
以下是未来文章系列中将讨论的用例:
为 Amazon Neptune 的超级节点和属性实现生存时间为 Amazon Neptune 的 RDF 图实现生存时间本文假设读者对 Gremlin 和 openCypher 图查询语言有一定了解。要了解更多信息,可以参考这些语言的示例笔记本:借助 Gremlin 访问图形 和 openCypher 教程。
TTL 的设计选择
在第一种方案中,客户端应用程序负责向 Neptune 和 DynamoDB 添加图对象和 TTL 属性;而在第二种选项中,这一职责转移给了自动化服务。我们将 Neptune Streams用于您的 Neptune 数据库的变更数据日志与 Lambda 结合,以将带有 TTL 属性的图对象的详细信息写入 DynamoDB。两种选项中,图对象都存储在 DynamoDB 中,并使用 DynamoDB 的原生 TTL 功能,在记录过期时自动调用 Lambda 函数。
我们首先讨论的实现方法是在您 Neptune 集群内的有标签的属性图中给每个节点和边分配一个属性,代表删除对象的时间。例如,您可以添加属性键值对 TTL 1673620444,然后定期发出读取查询以收集需要删除的节点和边的 ID。以下是一个示例 Gremlin 查询:
gremlingV()has(TTL lte(1673620444))id()
接下来,您需要发出一个查询以删除这些节点和边,例如,在 Gremlin 中:
gremlingV(ID1 ID2 IDX)drop()
虽然这种方法有效,但可能会引入一些低效,例如: 分配计算资源给删除查询 查询 gV()has(TTL lte(1673620444)) 可能导致缓存颠簸,从而影响其他同时进行的读取查询的性能。此外,这种查询可能会导致更高的 ConcurrentModificationExceptions,因为突发的变更查询数量增加。为了解决这个问题,您需要分配特定的读取副本来处理寻找过期物品的查询。 额外的删除查询周期,确保物品在其定义的 TTL 过期之后的恰当时间内过期 由于过期过程采用轮询方式而非推送,您需要管理查询运行,以确保在允许的清理窗口内发现和清理过期的物品。
实现 Neptune 数据库 TTL 的另一种方法是使用原生服务,例如 DynamoDB,来自动跟踪数据库的更改并管理 TTL 过程。利用 DynamoDB,您可以使用其现有的 生存时间功能,在记录过期时提醒您,并随后从图中删除该对象。借助这些服务,还可以将 TTL 扩展到过期单独的属性,而不仅仅是节点或边的粒度因为 Neptune 不支持元属性。

重要提示:DynamoDB 的 TTL 是一项后台过程,无法保证项目何时删除。如 文档所述,DynamoDB 通常会在过期后的几天内移除相应的项目,这取决于表的大小和活动水平。
解决方案概述
我们将更详细地探讨每种选项。
选项 1 同步更新 DynamoDB 中的 TTL
在第一种方案中,客户端应用程序的责任是首先将对象写入 Neptune 图中,然后将这些对象的结果 ID 及其所需的 TTL 值写入 DynamoDB。我们在 DynamoDB 中使用一个特别的追踪表 启用 TTL,以对包含 TTL 过期值的字段进行监控。当 DynamoDB 从我们的追踪表中过期项目时,我们使用 DynamoDB Streams 检测到过期,并运行 Lambda 函数,删除 Neptune 数据库中的指定对象。
以下图示说明了这一架构。
建议在访问数据存储的应用程序部分建立回退和重试机制。例如,如果应用程序无法写入 Neptune,您可以使用这种方法 重试请求,直到成功为止,然后继续将数据写入 DynamoDB。如果写入 DynamoDB 失败,也可以使用相同的方式重试请求,直到成功。
选项 2 异步更新 DynamoDB 中的 TTL
在第二种方案中,客户端应用程序不再负责将数据写入 DynamoDB 表,而是开启 Neptune Streams。在这种架构中,我们部署一个 Lambda 函数,它从 Neptune Streams 中轮询包含 TTL 属性的对象的插入或更新。当它发现这些变化时,该函数会将该项目添加到 DynamoDB 表中。
对于本文,我们建议使用第二种选项,因为这提供了更可扩展的事件驱动方式来实现 TTL,可能减少客户端应用的开发工作量。
我们通过以下步骤实现解决方案:
创建一个 DynamoDB 表,包含四个属性:图对象 ID,一个对象类型,一个包含记录来源的字段例如neptunestreams,以及一个 TTL 值仅数字类型。启用 DynamoDB Streams 以支持对区块表进行流处理。创建两个 Lambda 函数:一个轮询 Neptune 流以查找 TTL 对象并写入 DynamoDB,另一个在 DynamoDB Streams 中捕获删除事件时调用。创建带有启用 Neptune Streams 的 Neptune 数据库集群。创建连接到 Neptune 数据库的 Amazon SageMaker 笔记本,以编写测试查询。遵循本文最佳方式的简单方法是使用提供的 AWS CloudFormation 模板。该模板创建所需的 Neptune 集群、Lambda 函数、DynamoDB 的 VPC 端点、DynamoDB 表,以及构成解决方案基础的 AWS 身份与访问管理 (IAM) 角色和策略。此外,它会创建一个 Neptune 笔记本 来测试该过程,并建立支持 Neptune Streams 轮询机制的架构如 使用 Neptune Streams 捕获图更改 中所述。
以下图示展示了该堆栈的架构。
前提条件
在此环节中,您应具备以下前提条件:
一个具有在 Neptune、DynamoDB 和相关服务中创建资源权限的 AWS 账户。如果需要,伴随的 CloudFormation 模板可以为您准备这些资源。部署到新的 Neptune 集群
我们提供 CloudFormation 模板堆栈,您可以启动它以创建资源。要部署 CloudFormation 模板,请完成以下步骤:
从 GitHub 下载 CloudFormation 模板。从 CloudFormation 控制台选择 Create stack,然后选择 With new resources (standard)。在 Specify template 下上传 GitHub 仓库中的 neptunettlmainyaml 文件。
指定 Stack name 和 ApplicationID 的值,以标识所启动的资源。如果需要,可以更新 NeptuneTTLPropertyName 的值,以自定义表示 TTL 值的属性名称。
选择 Next。
继续通过其余部分。在 Capabilities 部分中阅读并选择复选框。选择 Create stack。该堆栈大约需要 30 分钟才能完成。在继续下一步之前,请确保堆栈显示为 Create Complete。
部署到现有的支持 TTL 的环境或预先存在的 Neptune 集群
由于 TTL 是一项常见需求,您可能已经有一个图模型来存储节点和边的 TTL 值,或者您已经有一个部署的 Neptune 集群。要使用本文中概述的解决方案,请完成以下步骤:
飞鸟加速器使用方法在现有数据库上启用 Neptune Streams。请注意,这需要您重启集群以使更改生效。部署 CloudFormation 模板,输入指定的参数。 NeptuneTTLPropertyName:用于存储图中节点和边的 TTL 值的属性名称。VPC:您 Neptune 集群的 VPC ID。SubnetIds:属于您 Neptune 集群 DB 子网组的子网 IDs。SecurityGroupIds:属于您 Neptune 集群的安全组 IDs。RouteTableIds:用于上述指定子网的路由表的以逗号分隔的 ID 列表。CreateDDBVPCEndpoint:如果您已在 Neptune 集群 VPC 中拥有 DynamoDB VPC 端点,则设置为 false。否则,将默认值保留为 true。CreateMonitoringEndPoint:如果您已在 Neptune 集群 VPC 中拥有监控 VPC 端点,则设置为 false。否则,将默认值保留为 true。请注意,如果您在现有 TTL 启用环境的基础上启用此解决方案,则该解决方案仅会自动使在解决方案部署时已存在于 Neptune Streams 中的记录过期。此解决方案 无法为在 Streams 记录不可用时填充 TTL 对象。
测试创建带 TTL 属性的图对象
作为 CloudFormation 部署的一部分,将创建一个 Neptune 笔记本,这提供了一种简单的方法来测试 TTL 部署是否有效。请完成以下步骤:
在 Neptune 控制台上,选择导航窗格中的 Notebooks。选择以 awsneptunettl 为前缀的笔记本,并在 Actions 菜单中选择 Open Jupyter 选项。
在 Jupyter 笔记本窗口中,选择 Neptune 文件夹并选中 TTLNotebookipynb。
按顺序运行笔记本中的代码。默认情况下,它会创建 300 个节点及随机数量的边,所有这些节点和边都包含 TTL 属性及数字值。要检查对象是否已成功写入 Neptune,您可以运行提供的 Gremlin 查询。
对于顶点,请使用以下查询:
gremlingremlingV()hasLabel({LABEL})has(testBatch {objectbatch})elementMap()
对于边,使用以下查询:
gremlingremlingE()hasLabel({EDGELABEL})has(testBatch {objectbatch})elementMap()
要检查对象是否已成功写入 Neptune 流,请在笔记本中运行 streamviewer 命令。
检查 DynamoDB 中的 TTL 跟踪
在确认对象已成功创建于图数据库后,我们需要检查它们是否也已在 DynamoDB 表中创建。请完成以下步骤:
在 DynamoDB 控制台 中,选择导航窗格中的 Tables。选择以 NeptuneObject2TTL 为前缀的表,然后选择 Explore table items。您将被重定向到一个新页面,该页面显示表中存储的前 50 项目的列表。
选择 View table details 返回表信息页面。在这里,我们将检查表的流和 TTL 设置。
在 Exports and streams 选项卡中,向下滚动到 DynamoDB stream details 部分。在这里,我们可以启用或禁用表的流,检查 写入流的值类型,并查看每当发生更改时触发的 Lambda 函数。
现在我们需要检查表的 TTL 设置。在 Additional settings 选项卡中,向下滚动到 Time to Live (TTL) 部分。在这里,我们可以检查结构中是否启用 TTL,DynamoDB 在监控哪个记录属性,以及在过去 24 小时内有多少项目已过期。
检查已过期的对象是否从 Neptune 中移除
此时,使用 Neptune 笔记本创建的一些或全部对象可能已过期,并已从 Neptune 和 DynamoDB 数据库中自动删除。有
使用生成式人工智能通过自动化通话摘要来提升代理商生产力 机器学习博客
利用生成式AI通过自动通话总结提升代理生产力by Chris Lott 和 Smriti Ranjan 于2023年11月6日在 Amazon Bedrock Amazon Transcribe 人工...
网络安全行业悼念亚米特约兰,独具远见的Tenable首席执行官
网络安全领袖阿米特尤兰去世文章重点阿米特尤兰,网络安全业界的先驱,于1月3日去世,享年54岁。他曾担任Tenable Holdings的董事长和CEO,对公司文化和行业发展影响深远。专注于网络安全的战...