使用 Amazon Neptune 作為 AWS Database Migration Service 目標 - AWS 資料庫遷移服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon Neptune 作為 AWS Database Migration Service 目標

Amazon Neptune 是快速、可靠、全受管的圖形資料庫服務,可讓您輕鬆建置和執行搭配高度連線資料集使用的應用程式。Neptune 的核心是專門打造的高效能圖形資料庫引擎。此引擎的專屬設計可儲存數十億筆關係,且查詢圖形時只會有數毫秒的延遲。Neptune 支援熱門圖形查詢語言 Apache TinkerPop Gremlin 和 W3C 的 SPARQL。如需有關 Amazon Neptune 的詳細資訊,請參閱《Amazon Neptune 使用者指南》中的「什麼是 Amazon Neptune? 」。

如果沒有 Neptune 這種圖形資料庫,您可能會在關聯式資料庫中模擬高度連線的資料。因為資料具有潛在的動態連線,所以使用這類資料來源的應用程式必須在 SQL 中模擬連線的資料查詢。此方法要求您編寫一個額外的圖層並將圖表查詢轉換為 SQL。此外,關聯式資料庫具有結構描述的剛性。結構描述中的任何變更以模擬變更連線,都需要停機時間和查詢轉換的額外維護,以支援新的結構描述。查詢性能也是在設計應用程式時要考慮的另一大限制。

圖形資料庫可以大幅簡化此情況。不含結構描述,豐富的圖形查詢層 (Gremlin 或 SPARQL) 和針對圖形查詢最佳化的索引提高了靈活性和性能。Amazon Neptune 圖形資料庫也具有企業功能,例如,靜態加密、安全授權層、預設備份、異地同步備份支援、僅供讀取複本支援等。

透過使用 AWS DMS,您可以將模擬高度連線圖表的關聯式資料,從任何支援的 SQL 資料庫的 DMS 來源端點遷移至 Neptune 目標端點。

如需詳細資訊,請參閱下列內容。

以 Amazon Neptune 為目標的遷移概觀

在開始遷移至 Neptune 目標之前,請在您的 AWS 帳戶中建立下列資源:

  • 目標端點的 Neptune 叢集。

  • 來源端點的 AWS DMS 支援 SQL 關聯式資料庫。

  • 目標端點的 Amazon S3 儲存貯體。在與 Neptune 叢集相同的 AWS 區域中建立 S3 儲存貯體。AWS DMS 會使用此 S3 儲存貯體作為其大量載入至 Neptune 資料庫目標資料的中繼檔案儲存。如需有關建立 S3 儲存貯體的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的「建立儲存貯體」。

  • 與 Neptune 叢集位於相同 VPC 中的 S3 虛擬私有雲端 (VPC) 端點。

  • 包含 IAM 政策的 AWS Identity and Access Management (IAM) 角色。此政策應為您的目標端點指定 S3 儲存貯體的GetObjectPutObjectDeleteObjectListObject 權限。此角色由 AWS DMS 和 Neptune 所承擔,同時具有對目標 S3 儲存貯體和 Neptune 資料庫的 IAM 存取權。如需更多詳細資訊,請參閱 建立 IAM 服務角色以存取做為目標的 Amazon Neptune

擁有這些資源後,設定和啟動 Neptune 目標遷移與使用主控台或 DMS API 的任何完全載入遷移類似。不過,遷移至 Neptune 目標需要一些獨特的步驟。

若要將 AWS DMS 關聯式資料庫遷移至 Neptune
  1. 建立複寫執行個體 所述,建立複寫執行個體。

  2. 建立和測試來源端點的 AWS DMS 支援 SQL 關聯式資料庫。

  3. 為您的 Neptune 資料庫建立目標端點並進行測試。

    若要將目標端點連接至 Neptune 資料庫,請指定 Neptune 叢集端點或 Neptune 寫入器執行個體端點的伺服器名稱。此外,請指定 AWS DMS 儲存其中繼檔案的 S3 儲存貯體資料夾,以便大量載入至 Neptune 資料庫。

    在遷移期間,將所有已遷移的目標資料 AWS DMS 儲存在 S3 儲存貯體資料夾中,最多可達指定的檔案大小上限。當此檔案儲存達到此大小上限時,AWS DMS 大量將儲存的 S3 資料載入至目標資料庫。它會清除資料夾以啟用儲存任何其他目標資料,以便後續載入目標資料庫。如需指定這些設定的詳細資訊,請參閱 指定 Amazon Neptune 做為目標的端點設定

  4. 在步驟 1-3 中建立的資源建立完全載入複寫工作,並執行下列動作:

    1. 像往常一樣使用任務資料表映射,以識別使用適當的選取項目和轉換規則從關聯式資料庫遷移的特定來源結構描述、資料表和檢視表。如需更多詳細資訊,請參閱 使用資料表映射指定任務設定

    2. 透過選擇以下選項之一指定目標映射,以指定來源資料表和檢視表到 Neptune 目標資料庫圖形的映射規則:

    3. 執行下列任意一項:

      • 使用 AWS DMS 主控台,使用建立資料庫遷移任務頁面上的圖形對應規則來指定圖形對應選項。

      • 使用 AWS DMS API,並使用 CreateReplicationTask API 呼叫的 TaskData 要求參數指定此選項。

      如需有關使用 Gremlin JSON 和 SPARQL R2RML 指定圖形映射規則的詳細資訊和範例,請參閱 使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則

  5. 啟動遷移任務的複寫。

指定 Amazon Neptune 做為目標的端點設定

若要建立或修改目標端點,您可以使用主控台或 CreateEndpointModifyEndpoint API 作業。

對於 AWS DMS 主控台中的 Neptune 目標,請在建立端點修改端點主控台頁面上指定端點特定的設定。對於 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 目標端點建立的服務角色的 Amazon Resource Name (ARN)。如需更多詳細資訊,請參閱 建立 IAM 服務角色以存取做為目標的 Amazon Neptune

  • S3BucketName – (必要) S3 儲存貯體的名稱,此儲存貯體為 DMS 可以在將資料大量載入至 Neptune 目標資料庫之前,將遷移的圖形資料暫時儲存在 .csv 檔案的位置。DMS 會將 SQL 來源資料映射至圖形資料,然後再將其存放在這些 .csv 檔案中。

  • S3BucketFolder – (必要) 資料夾路徑,也就是您希望 DMS 將遷移的圖形資料存放在 S3BucketName 指定的 S3 儲存貯體位置。

  • ErrorRetryDuration – (選用) 在引發錯誤前,DMS 等待重試將遷移圖形資料大量載入到 Neptune 目標資料庫的毫秒數。預設值為 250。

  • MaxFileSize – (選用) DMS 將資料大量載入到 Neptune 目標資料庫之前,存放在 .csv 檔案中的遷移圖形資料大小上限 (以 KB 為單位)。預設值為 1,048,576 KB (1 GB)。如果成功,DMS 會清除儲存貯體,準備存放下一批遷移的圖形資料。

  • MaxRetryCount – (選用) DMS 在重試將遷移圖形資料大量載入到 Neptune 目標資料庫後發生錯誤的毫秒數。預設值為 5。

  • IAMAuthEnabled – (選用) 如果您希望為此端點啟用 IAM 授權,請將此參數設定為 true 並將適當的 IAM 政策文件附加至 ServiceAccessRoleArn 指定的服務角色。預設值為 false

建立 IAM 服務角色以存取做為目標的 Amazon Neptune

若要將 Neptune 作為目標存取,請使用 IAM 建立服務角色。根據您的 Neptune 端點組態,將下列部分或全部 IAM 政策和信任文件附加至此角色。建立 Neptune 端點時,您會提供此服務角色的 ARN。這樣做會啟用 AWS DMS 和 Amazon Neptune 並假設同時存取 Neptune 及其關聯 Amazon S3 儲存貯體的權限。

如果您在 Neptune 端點組態將 NeptuneSettings 中的 IAMAuthEnabled 參數設定為 true,請將如下所示的 IAM 政策附加到您的服務角色。如果您設定 IAMAuthEnabledfalse,則可以忽略此政策。

// 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 政策允許完整存取由 Resource 指定的 Neptune 目標叢集。

將如下所示的 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 政策允許您的帳戶查詢為 Neptune 目標建立的 S3 儲存貯體 (arn:aws:s3:::my-bucket) 內容。也允許您的帳戶完全操作所有儲存貯體檔案和文件夾(arn:aws:s3:::my-bucket/)的內容。

編輯信任關係,並將下列 IAM 角色附加至您的服務角色,以允許 AWS 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 目標端點指定此服務角色的相關資訊,請參閱 指定 Amazon Neptune 做為目標的端點設定

使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則

您建立的圖形映射規則會指定如何將從 SQL 關聯式資料庫來源擷取的資料載入至 Neptune 資料庫叢集目標。這些映射規則的格式取決於,此規則是否使用 Apache TinkerPop Gremlin 載入屬性圖形或使用 R2RML 載入資源描述框架 (RDF) 資料。接下來,您可以尋找這些格式的相關資訊,以及在何處進一步了解。

當您使用主控台或 DMS API 建立遷移任務時,可以指定這些映射規則。

使用主控台,使用建立資料庫遷移任務頁面上的圖形對應規則來指定這些對應規則。在 Graph mapping rules (圖形映射規則) 中,您可以使用提供的編輯器直接輸入和編輯映射規則。或者,您可以瀏覽以適當的圖形映射格式包含映射規則的檔案。

使用 API,並使用 CreateReplicationTask API 呼叫的 TaskData 要求參數指定此選項。將檔案路徑設定為 TaskData 並以適當的圖形映射格式包含映射規則。

使用 Gremlin 產生屬性圖形資料的圖形映射規則

使用 Gremlin 產生屬性圖形資料,為即將根據來源資料產生的每個圖形實體提供映射規則指定一個 JSON 物件。此 JSON 的格式是專門針對大量載入 Amazon 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 節點映射報告關係。

如需有關使用 Gemlin JSON 建立圖形映射規則的詳細資訊,請參閱《Amazon Neptune 使用者指南》中的「Gemlin 載入資料格式」。

用於產生 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" ] ].

在前面的例子中,映射定義圖形節點映射 Student 資料表中的人與人之間的朋友關係。

如需有關使用 SPARQL R2RML 建立圖形映射規則的詳細資訊,請參閱 W3C 規格 R2RML:RDB 至 RDF 映射語言

Amazon Neptune 做為目標遷移的 Gremlin 和 R2RML 資料類型

AWS DMS 會以兩種方式之一執行從 SQL 來源端點到 Neptune 目標的資料類型映射。您使用哪種方式取決於您用來載入 Neptune 資料庫的圖形映射格式:

  • Apache TinkerPop Gremlin,使用遷移資料的 JSON 表示形式。

  • W3C 的 SPARQL,使用遷移資料的 R2RML 表示形式。

如需這兩種圖形映射格式的詳細資訊,請參閱 使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則

接下來,您可以找到每種格式的資料類型映射的描述。

SQL 來源到 Gremlin 目標資料類型映射

以下資料表顯示從 SQL 來源到 Gremlin 格式化目標的資料類型映射。

AWS 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 的 Gemlin 資料類型的詳細資訊,請參閱《Neptune 使用者指南》中的《Gemlin 資料類型》。

SQL 來源到 R2RML (RDF) 目標資料類型映射

以下資料表顯示從 SQL 來源到 R2RML 格式化目標的資料類型映射。

所有列出的 RDF 資料類型是區分大小寫的,除了 RDF 常值。AWS DMS 將任何未列出的 SQL 來源資料類型對應到 RDF 常值。

RDF 常值是多種常值語彙形式和資料類型之一。如需詳細資訊,請參閱 W3C 規格資源描述架構 (RDF):概念和抽象語法中的「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 對應語言的「資料類型轉換」。

使用 Amazon Neptune 做為目標的限制

使用 Neptune 做為目標時,有下列限制:

  • AWS 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 圖形資料結構的性質。

    在遷移期間,AWS DMS 會掃描每個來源資料表,並使用圖形對應將來源資料轉換為 Neptune 圖形。轉換後的資料會先儲存在為目標端點指定的 S3 儲存貯體資料夾中。如果掃描來源並成功產生此中繼 S3 資料,則 DescribeTableStatistics 會假設資料已成功載入至 Neptune 目標資料庫。但這並不是都是正確的。若要驗證給予資料表的資料已正確載入,請比較該資料表遷移兩端的 count() 傳回值。

    在以下範例中,AWS DMS 已從來源資料庫載入 customer 資料表,該資料庫已在目標 Neptune 資料庫圖形中指派標籤 'customer'。您可以確認此標籤已寫入目標資料庫。若要執行此動作,請將來源資料庫中的可用 customer 列數與任務完成後載入 Neptune 目標資料庫中的 'customer' 標籤列數進行比較。

    若要使用 SQL 從來源資料庫取得可用的客戶資料列數,請執行下列動作。

    select count(*) from customer;

    使用 Gremlin 載入至目標資料庫圖形中的 'customer' 標籤列數,請運行以下命令。

    gremlin> g.V().hasLabel('customer').count()
  • 目前,如果任何單一資料表載入失敗,整個任務就會失敗。與關聯式資料庫目標不同,Neptune 中的資料是高度連線的,這使得在許多情況下無法繼續任務。如果因為這種類型的資料載入失敗而無法順利繼續任務,請建立新的任務以載入無法載入的資料表。在執行新任務之前,請從 Neptune 目標手動清除部分載入的資料表。

    注意

    如果失敗可復原 (例如,網路傳輸錯誤),您可以繼續無法遷移至 Neptune 目標的任務。

  • AWS DMS 支援 R2RML 的大多數標準。但是,AWS DMS 不支援某些 R2RML 標準,包括反向表示式、關連和檢視表。R2RML 檢視表的解決方法是在來源資料庫中建立對應的自訂 SQL 檢視表。在遷移任務中,使用資料表映射選擇檢視表做為輸入。然後將檢視表對應到 R2RML 消耗的資料表,以產生圖形資料。

  • 當您使用不支援的 SQL 資料類型遷移來源資料時,產生的目標資料可能會遺失精確度。如需更多詳細資訊,請參閱 Amazon Neptune 做為目標遷移的 Gremlin 和 R2RML 資料類型

  • AWS DMS 不支援將 LOB 資料遷移至 Neptune 目標。