使用亚马逊 Neptune 作为目标Amazon Database Migration Service - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用亚马逊 Neptune 作为目标Amazon Database Migration Service

Amazon Neptune 是一项快速、可靠且完全托管式的图数据库服务,可帮助您轻松构建和运行适用于高度互连数据集的应用程序。Neptune 的核心是专门构建的高性能图形数据库引擎。该引擎经过优化,可存储数十亿个关系并以毫秒延迟查询图形。Neptune 支持流行的图形查询语言 ApacheTinkerPopGremlin 和 W3C 的 SPARQL。有关亚马逊 Neptune 的更多信息,请参阅什么是亚马逊海王星?亚马逊 Neptune 用户指南

如果没有像 Neptune 这样的图形数据库,你可能会在关系数据库中对高度连接的数据进行建模。由于数据具有潜在的动态关联,因此使用此类数据源的应用程序必须在 SQL 中为关联的数据查询建模。此方法要求您编写额外的层以将图形查询转换为 SQL。此外,关系数据库附带了架构刚度。为对更改连接建模而在架构中进行任何更改都需要停机时间以及对查询转换的额外维护,以支持新架构。查询性能也是设计应用程序时需要考虑的另一大约束。

图形数据库可大大简化此类情况。丰富的图形查询层(Gremlin 或 SPARQL)和针对图形查询优化的索引提高了灵活性和性能,可将您从架构中解放出来。Amazon Neptune 图形数据库还具有企业级功能,例如静态加密、安全授权层、默认备份、多可用区支持、只读副本支持等。

使用Amazon DMS,对于任何支持的 SQL 数据库,您可以将建模高度连接图的关系数据从 DMS 源端点迁移到 Neptune 目标端点。

有关更多详细信息,请参阅以下内容。

作为目标迁移到亚马逊 Neptune 的概述

在开始迁移到 Neptune 目标之前,请在您的中创建以下资源Amazon账户:

  • 目标终端节点的 Neptune 集群。

  • 支持的 SQL 关系数据库Amazon DMS用于源端点。

  • 目标终端节点的 Amazon S3 存储桶。在同一个存储桶中创建这个 S3 存储桶Amazon区域作为您的海王星集群。Amazon DMS使用此 S3 存储桶作为批量加载到 Neptune 数据库的目标数据的中间文件存储。有关创建 S3 存储桶的更多信息,请参阅创建存储桶亚马逊简单存储服务用户指南。

  • 与 Neptune 集群位于同一 VPC 中的 S3 虚拟私有云 (VPC) 终端节点。

  • 包含 IAM 策略的 Amazon Identity and Access Management (IAM) 角色。此策略将指定目标终端节点的 S3 存储桶的 GetObjectPutObjectDeleteObjectListObject 权限。双方都扮演了这个角色Amazon DMS还有 Neptune 可以通过 IAM 访问目标 S3 存储桶和 Neptune 数据库。有关更多信息,请参阅创建 IAM 服务角色以访问作为目标的亚马逊 Neptune

获得这些资源后,设置和开始迁移到 Neptune 目标与使用控制台或 DMS API 进行任何满负载迁移类似。但是,迁移到海王星目标需要一些独特的步骤。

要迁移Amazon DMS海王星的关系数据库
  1. 创建复制实例,如创建复制实例中所述。

  2. 创建和测试源终端节点的 Amazon DMS 支持的 SQL 关系数据库。

  3. 创建并测试您的 Neptune 数据库的目标端点。

    要将目标端点连接到 Neptune 数据库,请为 Neptune 集群终端节点或 Neptune 写入器实例终端节点指定服务器名称。此外,请为指定 S3 存储桶文件夹Amazon DMS存储其中间文件以便批量加载到 Neptune 数据库。

    迁移过程中,Amazon DMS 将所有已迁移的目标数据存储在此 S3 存储桶文件夹中,直至达到您指定的最大文件大小。当此文件存储达到该最大大小时,Amazon DMS 会将存储的 S3 数据批量加载到目标数据库中。它将清空此文件夹来支持存储任何其他目标数据,以便随后将该数据加载到目标数据库。有关指定这些设置的更多信息,请参阅将亚马逊 Neptune 的终端节点设置指定为目标

  4. 使用步骤 1—3 中创建的资源创建满载复制任务,然后执行以下操作:

    1. 像往常一样使用任务表映射来标识特定的源架构、表和视图,以便使用适当的选择和转换规则从关系数据库中迁移。有关更多信息,请参阅使用表映射指定任务设置

    2. 通过选择以下选项之一来指定目标映射来指定从源表和视图到 Neptune 目标数据库图形的映射规则:

      • Gremlin JSON — 有关使用 Gremlin JSON 加载 Neptune 数据库的信息,请参阅Gremlin 加载数据格式亚马逊 Neptune 用户指南

      • SPARQL RDB 到资源描述框架映射语言 (R2RML) — 有关使用 SPARQL R2RML 的信息,请参阅 W3C 规范R2RML:RDB 到 RDF 的映射语言

    3. 请执行下列操作之一:

      • 使用Amazon DMS控制台,使用指定图形映射选项图形映射规则创建数据库迁移任务页面。

      • 借助 Amazon DMS API,使用 CreateReplicationTask API 调用的 TaskData 请求参数指定这些选项。

      有关使用 Gremlin JSON 和 SPARQL R2RML 指定图形映射规则的更多信息和示例,请参阅使用亚马逊 Neptune 的 Gremlin 和 R2RML 作为目标指定图形映射规则

  5. 开始复制迁移任务。

将亚马逊 Neptune 的终端节点设置指定为目标

要创建或修改目标终端节点,您可以使用控制台,也可以使用 CreateEndpointModifyEndpoint API 操作。

对于海王星中的目标Amazon DMS控制台,指定终端节点特定设置创建终端节点要么修改终端节点控制台页面。对于 CreateEndpointModifyEndpoint,指定 NeptuneSettings 选项的请求参数。以下示例显示了如何使用 CLI 执行此操作。

dms create-endpoint --endpoint-identifier my-neptune-target-endpoint --endpoint-type target --engine-name neptune --server-name my-neptune-db.cluster-cspckvklbvgf.us-east-1.neptune.amazonaws.com --port 8192 --neptune-settings '{"ServiceAccessRoleArn":"arn:aws:iam::123456789012:role/myNeptuneRole", "S3BucketName":"my-bucket", "S3BucketFolder":"my-bucket-folder", "ErrorRetryDuration":57, "MaxFileSize":100, "MaxRetryCount": 10, "IAMAuthEnabled":false}‘

这里是 CLI--server-name选项指定 Neptune 集群写入器端点的服务器名称。或者你可以为 Neptune 写入器实例端点指定服务器名称。

--neptune-settings 选项请求参数如下所示:

  • ServiceAccessRoleArn—(必填)您为 Neptune 目标终端节点创建的服务角色的亚马逊资源名称 (ARN)。有关更多信息,请参阅创建 IAM 服务角色以访问作为目标的亚马逊 Neptune

  • S3BucketName—(必需)S3 存储桶的名称,DMS 可以在将迁移的图形数据批量加载到 Neptune 目标数据库之前,将其临时存储在.csv 文件中。DMS 先将 SQL 源数据映射到图形数据,然后再将其存储在这些 .csv 文件中。

  • S3BucketFolder—(必选)您希望 DMS 将迁移的图形数据存储在由指定的 S3 存储桶中的文件夹路径S3BucketName

  • ErrorRetryDuration—(可选)DMS 在引发错误之前等待将迁移的图形数据批量加载到 Neptune 目标数据库的毫秒数。默认值为 250。

  • MaxFileSize—(可选)在 DMS 将数据批量加载到 Neptune 目标数据库之前,存储在.csv 文件中的迁移图形数据的最大大小(以 KB 为单位)。默认值为 1048576 KB (1 GB)。如果成功,DMS 会清除存储桶,准备存储下一批迁移的图形数据。

  • MaxRetryCount—(可选)DMS 在引发错误之前重试将迁移的图形数据批量加载到 Neptune 目标数据库的次数。默认 为 5。

  • IAMAuthEnabled—(可选)如果您想为此终端节点启用 IAM 授权,请将此参数设置为true并将相应的 IAM 策略文档附加到您指定的服务角色ServiceAccessRoleArn。默认为 false

创建 IAM 服务角色以访问作为目标的亚马逊 Neptune

要将 Neptune 作为目标进行访问,请使用 IAM 创建服务角色。根据您的 Neptune 终端节点配置,将以下部分或全部 IAM 策略和信任文档附加到该角色。创建 Neptune 终端节点时,您需要提供此服务角色的 ARN。这样做会启用Amazon DMS并且 Amazon Neptune 将获得访问 Neptune 及其关联的 Amazon S3 存储桶的权限。

如果你设置了IAMAuthEnabled参数输入NeptuneSettingstrue在您的 Neptune 终端节点配置中,将如下所示的 IAM 策略附加到您的服务角色。如果将 IAMAuthEnabled 设置为 false,则可忽略此策略。

// Policy to access Neptune { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "neptune-db:*", "Resource": "arn:aws:neptune-db:us-east-1:123456789012:cluster-CLG7H7FHK54AZGHEH6MNS55JKM/*" } ] }

前面的 IAM 策略允许完全访问由指定的 Neptune 目标集群Resource

将如下所示的 IAM 策略附加到服务角色。此策略允许 DMS 将迁移的图形数据临时存储在您为批量加载到 Neptune 目标数据库而创建的 S3 存储桶中。

//Policy to access S3 bucket { "Version": "2012-10-17", "Statement": [{ "Sid": "ListObjectsInBucket0", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::my-bucket" ] }, { "Sid": "AllObjectActions", "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::my-bucket/" ] }, { "Sid": "ListObjectsInBucket1", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/" ] } ] }

前面的 IAM 策略允许您的账户查询 S3 存储桶的内容 (arn:aws:s3:::my-bucket) 为你的海王星目标创建。它还允许您的账户完全操作所有存储桶文件和文件夹的内容 (arn:aws:s3:::my-bucket/)。

编辑信任关系并将以下 IAM 角色附加到您的服务角色以允许这两者兼而有之Amazon DMS并且 Amazon Neptune 数据库服务担任该角色。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "dms.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Sid": "neptune", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

有关为您的 Neptune 目标端点指定此服务角色的信息,请参阅将亚马逊 Neptune 的终端节点设置指定为目标

使用亚马逊 Neptune 的 Gremlin 和 R2RML 作为目标指定图形映射规则

您创建的图形映射规则指定如何将从 SQL 关系数据库源提取的数据加载到 Neptune 数据库集群目标中。这些映射规则的格式会有所不同,具体取决于这些规则是否用于使用 Apache 加载属性图数据TinkerPop使用 R2RML 的 Gremlin 或资源描述框架 (RDF) 数据。在下文中,您可以找到有关这些格式的信息并查明可从何处了解更多信息。

在使用控制台或 DMS API 创建迁移任务时,可以指定这些映射规则。

使用控制台,使用以下命令指定这些映射规则图形映射规则创建数据库迁移任务页面。在图形映射规则中,可以使用提供的编辑器直接输入和编辑映射规则。或者,可以浏览找到包含采用适当的图形映射格式的映射规则的文件。

借助 API,使用 CreateReplicationTask API 调用的 TaskData 请求参数指定这些选项。将 TaskData 设置为包含采用适当图形映射格式的映射规则的文件的路径。

用于通过 Gremlin 生成属性图形数据的图形映射规则

使用 Gremlin 生成属性图形数据,为要从源数据生成的每个图形实体指定一个具有映射规则的 JSON 对象。此 JSON 的格式是专门为批量加载亚马逊 Neptune 而定义的。以下模板显示了该对象中的每条规则的样子。

{ "rules": [ { "rule_id": "(an identifier for this rule)", "rule_name": "(a name for this rule)", "table_name": "(the name of the table or view being loaded)", "vertex_definitions": [ { "vertex_id_template": "{col1}", "vertex_label": "(the vertex to create)", "vertex_definition_id": "(an identifier for this vertex)", "vertex_properties": [ { "property_name": "(name of the property)", "property_value_template": "{col2} or text", "property_value_type": "(data type of the property)" } ] } ] }, { "rule_id": "(an identifier for this rule)", "rule_name": "(a name for this rule)", "table_name": "(the name of the table or view being loaded)", "edge_definitions": [ { "from_vertex": { "vertex_id_template": "{col1}", "vertex_definition_id": "(an identifier for the vertex referenced above)" }, "to_vertex": { "vertex_id_template": "{col3}", "vertex_definition_id": "(an identifier for the vertex referenced above)" }, "edge_id_template": { "label": "(the edge label to add)", "template": "{col1}_{col3}" }, "edge_properties":[ { "property_name": "(the property to add)", "property_value_template": "{col4} or text", "property_value_type": "(data type like String, int, double)" } ] } ] } ] }

存在顶点标签意味着在此处创建了顶点。没有顶点标签意味着顶点是由其他源创建的,并且此定义仅添加顶点属性。指定所需数量的顶点和边定义,以便指定整个关系数据库源的映射。

employee 表的示例规则如下所示。

{ "rules": [ { "rule_id": "1", "rule_name": "vertex_mapping_rule_from_nodes", "table_name": "nodes", "vertex_definitions": [ { "vertex_id_template": "{emp_id}", "vertex_label": "employee", "vertex_definition_id": "1", "vertex_properties": [ { "property_name": "name", "property_value_template": "{emp_name}", "property_value_type": "String" } ] } ] }, { "rule_id": "2", "rule_name": "edge_mapping_rule_from_emp", "table_name": "nodes", "edge_definitions": [ { "from_vertex": { "vertex_id_template": "{emp_id}", "vertex_definition_id": "1" }, "to_vertex": { "vertex_id_template": "{mgr_id}", "vertex_definition_id": "1" }, "edge_id_template": { "label": "reportsTo", "template": "{emp_id}_{mgr_id}" }, "edge_properties":[ { "property_name": "team", "property_value_template": "{team}", "property_value_type": "String" } ] } ] } ] }

在此处,顶点和边定义映射来自具有员工 ID (EmpID) 的 employee 节点和具有经理 ID (managerId) 的 employee 节点的报告关系。

有关使用 Gremlin JSON 创建图形映射规则的更多信息,请参阅Gremlin 加载数据格式亚马逊 Neptune 用户指南

用于生成 RDF/SPARQL 数据的图形映射规则

如果要加载将使用 SPARQL 查询的 RDF 数据,请使用 R2RML 编写图形映射规则。R2RML 是用于将关系数据映射到 RDF 的标准 W3C 语言。在 R2RML 文件中,三重映射(例如,下面的 <#TriplesMap1>)指定用于将逻辑表的每个行转换为零个或更多 RDF 三元组的规则。主题映射(例如,下面的任意 rr:subjectMap)指定了一个规则,用于生成由三元组映射生成的 RDF 三元组的主题。谓词-对象映射(例如,下面的任意 rr:predicateObjectMap)是一个函数,用于为逻辑表的每个逻辑表行创建一个或多个谓词-对象对。

下面是 nodes 表的简单示例。

@prefix rr: <http://www.w3.org/ns/r2rml#>. @prefix ex: <http://example.com/ns#>. <#TriplesMap1> rr:logicalTable [ rr:tableName "nodes" ]; rr:subjectMap [ rr:template "http://data.example.com/employee/{id}"; rr:class ex:Employee; ]; rr:predicateObjectMap [ rr:predicate ex:name; rr:objectMap [ rr:column "label" ]; ]

在上一个示例中,映射定义了从员工表映射的图形节点。

下面是 Student 表的另一个简单示例。

@prefix rr: <http://www.w3.org/ns/r2rml#>. @prefix ex: <http://example.com/#>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix xsd: <http://www.w3.org/2001/XMLSchema#>. <#TriplesMap2> rr:logicalTable [ rr:tableName "Student" ]; rr:subjectMap [ rr:template "http://example.com/{ID}{Name}"; rr:class foaf:Person ]; rr:predicateObjectMap [ rr:predicate ex:id ; rr:objectMap [ rr:column "ID"; rr:datatype xsd:integer ] ]; rr:predicateObjectMap [ rr:predicate foaf:name ; rr:objectMap [ rr:column "Name" ] ].

在前面的示例中,映射定义了图形节点映射friend-of-a-friend人与人之间的关系Student桌子。

有关使用 SPARQL R2RML 创建图形映射规则的更多信息,请参阅 W3C 规范 R2RML:RDB 到 RDF 映射语言

Gremlin 和 R2RML 迁移到亚马逊 Neptune 作为目标的数据类型

Amazon DMS通过以下两种方式之一执行从 SQL 源端点到 Neptune 目标的数据类型映射。你使用哪种方式取决于你用来加载 Neptune 数据库的图形映射格式:

  • 阿帕奇TinkerPopGremlin,使用迁移数据的 JSON 表示形式。

  • W3C 的 SPARQL,使用迁移数据的 R2RML 表示形式。

有关这两种图形映射格式的更多信息,请参阅使用亚马逊 Neptune 的 Gremlin 和 R2RML 作为目标指定图形映射规则

在下文中,您可以找到每种格式的数据类型映射的描述。

SQL 源到 Gremlin 目标数据类型映射

下表显示了从 SQL 源到 Gremlin 格式化目标的数据类型映射。

Amazon DMS 将任何未列出的 SQL 源数据类型映射到 Gremlin String

SQL 源数据类型

Gremlin 目标数据类型

NUMERIC(和变体) Double
DECIMAL
TINYINT Byte
SMALLINT Short
INT, INTEGER Int
BIGINT Long
FLOAT Float
DOUBLE PRECISION
REAL Double
BIT Boolean
BOOLEAN
DATE Date
TIME
TIMESTAMP
CHARACTER(和变体) String

有关用于加载 Neptune 的 Gremlin 数据类型的更多信息,请参见Gremlin 数据类型海王星用户指南。

SQL 源到 R2RML (RDF) 目标数据类型映射

下表显示了从 SQL 源到 R2RML 格式化目标的数据类型映射。

所有列出的 RDF 数据类型都区分大小写,但 RDF 文本除外。Amazon DMS 将任何未列出的 SQL 源数据类型映射到 RDF 文本。

RDF 文本 是多种文本词汇形式和数据类型之一。有关更多信息,请参见RDF 文字在 W3C 规范中资源描述框架 (RDF):概念和抽象语法

SQL 源数据类型

R2RML (RDF) 目标数据类型

BINARY(和变体) xsd:hexBinary
NUMERIC(和变体) xsd:decimal
DECIMAL
TINYINT xsd:integer
SMALLINT
INT, INTEGER
BIGINT
FLOAT xsd:double
DOUBLE PRECISION
REAL
BIT xsd:boolean
BOOLEAN
DATE xsd:date
TIME xsd:time
TIMESTAMP xsd:dateTime
CHARACTER(和变体) RDF 文本

有关用于加载 Neptune 的 RDF 数据类型及其与 SQL 源数据类型的映射的更多信息,请参见数据类型转换在 W3C 规范中R2RML:RDB 到 RDF 的映射语言

使用亚马逊 Neptune 作为目标的局限性

使用 Neptune 作为目标时存在以下限制:

  • Amazon DMS目前仅支持迁移到 Neptune 目标的满载任务。不支持将更改数据捕获 (CDC) 迁移到 Neptune 目标。

  • 在开始迁移任务之前,请确保手动清除目标 Neptune 数据库中的所有数据,如以下示例所示。

    要删除图表中的所有数据(顶点和边),请运行以下 Gremlin 命令。

    gremlin> g.V().drop().iterate()

    删除带有标签的顶点'customer',运行以下 Gremlin 命令。

    gremlin> g.V().hasLabel('customer').drop()
    注意

    删除大型数据集可能需要花费一些时间。您可能需要对 drop() 进行迭代并施加一个限制,例如 limit(1000)

    删除带有标签的边缘'rated',运行以下 Gremlin 命令。

    gremlin> g.E().hasLabel('rated').drop()
    注意

    删除大型数据集可能需要花费一些时间。您可能需要对 drop() 进行迭代并施加一个限制,例如 limit(1000)

  • DMS API 操作DescribeTableStatistics由于 Neptune 图形数据结构的性质,可能会返回有关给定表的不准确结果。

    在迁移期间,Amazon DMS扫描每个源表并使用图形映射将源数据转换为 Neptune 图。转换后的数据首先会存储在为目标终端节点指定的 S3 存储桶文件夹中。如果扫描了源代码并且成功生成了这个 S3 中间数据,DescribeTableStatistics假设数据已成功加载到 Neptune 目标数据库中。但情况并非总是如此。要是否已为给定表正确加载数据,请比较该表的迁移两端的 count() 返回值。

    在以下示例中,Amazon DMS已加载了customer源数据库中的表,该表被分配了标签'customer'在目标海王星数据库图中。您可以确保此标签已写入到目标数据库中。为此,请比较以下的数量customer源数据库中可用的行,其数量为'customer'任务完成后,在 Neptune 目标数据库中加载带标签的行。

    要使用 SQL 获取源数据库中可用的客户行的数量,请运行以下命令。

    select count(*) from customer;

    要使用 Gremlin 获取加载到目标数据库图形中的带 'customer' 标签的行数,请运行以下命令。

    gremlin> g.V().hasLabel('customer').count()
  • 目前,如果任一表无法加载,则整个任务将失败。与关系数据库目标不同,Neptune 中的数据是高度关联的,这使得在许多情况下无法恢复任务。如果因无法加载此类型的数据而导致无法成功恢复任务,请创建一个新任务来加载未能加载的表。在运行此新任务之前,请手动从 Neptune 目标中清除部分加载的表。

    注意

    如果迁移到 Neptune 目标失败的任务可以恢复(例如,网络传输错误),则可以继续执行迁移到 Neptune 目标失败的任务。

  • Amazon DMS 支持大多数适用于 R2RML 的标准。但是,Amazon DMS 不支持某些 R2RML 标准,包括反向表达式、联接和视图。R2RML 视图的解决方法是,在源数据库中创建相应的自定义 SQL 视图。在迁移任务中,使用表映射选择视图作为输入。然后将视图映射到一个表,R2RML 随后会使用该表来生成图形数据。

  • 在使用不受支持的 SQL 数据类型迁移源数据时,生成的目标数据可能会丢失精确性。有关更多信息,请参阅Gremlin 和 R2RML 迁移到亚马逊 Neptune 作为目标的数据类型

  • Amazon DMS不支持将 LOB 数据迁移到 Neptune 目标。