本教學課程說明如何從 Amazon DynamoDB 遷移至 Spanner。主要適用於想從 NoSQL 系統遷移至 Spanner 的應用程式擁有者。Spanner 是完全關聯、容錯、高度可擴充的 SQL 資料庫系統,支援交易。如果 Amazon DynamoDB 資料表的使用方式 (就類型和版面配置而言) 一致,對應至 Spanner 的過程就會很簡單。如果 Amazon DynamoDB 資料表包含任意資料型別和值,或許可以改用其他 NoSQL 服務,例如 Datastore 或 Firestore。
本教學課程假設您已熟悉資料庫結構定義、資料類型、NoSQL 的基本概念,以及關聯式資料庫系統。此外,本教學課程會執行預先定義的工作來示範遷移作業。完成教學課程後,您可以根據您的環境修改課程中提供的程式碼和步驟。
以下架構圖概略呈現本教學課程中用來遷移資料的元件:
目標
- 將資料從 Amazon DynamoDB 遷移至 Spanner。
- 建立 Spanner 資料庫和遷移資料表。
- 將 NoSQL 結構定義對應至關聯式結構定義。
- 建立及匯出使用 Amazon DynamoDB 的範例資料集。
- 在 Amazon S3 和 Cloud Storage 之間轉移資料。
- 使用 Dataflow 將資料載入 Spanner。
費用
本教學課程使用下列 Google Cloud計費元件:
Spanner 費用取決於執行個體的運算資源量,以及每月計費週期內儲存的資料量。在本教學課程中,您會使用這些資源的最低設定,並在最後清除。在實際情境中,請預估處理量和儲存空間需求,然後參閱 Spanner 執行個體說明文件,判斷所需的運算能力。
除了 Google Cloud 資源外,本教學課程還會使用下列 Amazon Web Services (AWS) 資源:
- AWS Lambda
- Amazon S3
- Amazon DynamoDB
這些服務只有在遷移期間需要用到。完成本教學課程後,請按照相關操作說明清除所有資源,以避免產生不必要的費用。使用 AWS Pricing Calculator 估算這些費用。
您可以使用 Pricing Calculator 根據預測用量估算費用。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」一節。
準備環境
在本教學課程中,您將使用 Cloud Shell 執行指令。Cloud Shell 可讓您存取 Google Cloud中的指令列,並內含 Google Cloud CLI 和其他開發工具。 Google Cloud Cloud Shell 初始化可能需要幾分鐘。
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
- 設定預設 Compute Engine 區域,例如:
us-central1-b。 gcloud config set compute/zone us-central1-b - 複製包含程式碼範例的 GitHub 存放區。 git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
- 前往複製的目錄。 cd dynamodb-spanner-migration
- 建立 Python 虛擬環境。pip3 install virtualenv virtualenv env
- 啟動虛擬環境。 source env/bin/activate
- 安裝必要的 Python 模組。 pip3 install -r requirements.txt
設定 AWS 存取權
在本教學課程中,您將建立及刪除 Amazon DynamoDB 資料表、Amazon S3 值區和其他資源。如要存取這些資源,您必須先建立必要的 AWS 身分與存取權管理 (IAM) 權限。您可以使用測試或沙箱 AWS 帳戶,避免影響相同帳戶中的實際工作環境資源。
為 AWS Lambda 建立 AWS IAM 角色
在本節中,您將建立 AWS IAM 角色,在本教學課程後面的步驟中供 AWS Lambda 使用。
- 在 AWS 主控台中,前往「IAM」專區按一下 [Roles],然後選取 [Create role]。
- 在「Trusted entity type」(信任的實體類型) 下方,確認已選取「AWS service」(AWS 服務)。
- 在「用途」下方選取「Lambda」,然後點選「下一步」。
- 在「權限政策」篩選方塊中輸入
AWSLambdaDynamoDBExecutionRole,然後按Return搜尋。 - 選取「AWSLambdaDynamoDBExecutionRole」核取方塊,然後點選「Next」。
- 在「Role name」(角色名稱) 方塊中輸入
dynamodb-spanner-lambda-role,然後按一下「Create role」(建立角色)。
建立 AWS IAM 使用者
按照下列步驟建立可透過程式存取 AWS 資源的 AWS IAM 使用者;這些資源在整個教學課程中都會用到。
- 在 AWS 管理控制台的「IAM」部分,按一下「Users」,然後選取「Add users」。
- 在「User name」(使用者名稱) 方塊中輸入
dynamodb-spanner-migration。 在「存取類型」下方,選取「存取金鑰 - 程式輔助存取」左側的核取方塊。
點選 [Next: Permissions] (下一步:權限)。
按一下「直接附加現有政策」,然後使用「搜尋」方塊篩選,勾選下列三項政策旁邊的核取方塊:
AmazonDynamoDBFullAccessAmazonS3FullAccessAWSLambda_FullAccess
依序點選「下一步:代碼」和「下一步:檢查」,然後按一下「建立使用者」。
按一下 [Show] 查看憑證。系統會顯示新建立使用者的存取金鑰 ID 和存取密鑰。您需要在下一節使用憑證,因此請暫時將這個視窗保持開啟。這些憑證可用來變更您的帳戶和影響您的環境,因此請妥善儲存。在本教學課程結束時,您可以刪除 IAM 使用者。
設定 AWS 指令列介面
在 Cloud Shell 中設定 AWS 指令列介面 (CLI)。
aws configure
畫面會出現以下輸出結果:
AWS Access Key ID [None]: PASTE_YOUR_ACCESS_KEY_ID AWS Secret Access Key [None]: PASTE_YOUR_SECRET_ACCESS_KEY Default region name [None]: us-west-2 Default output format [None]:
- 輸入您建立的 AWS IAM 帳戶中的
ACCESS KEY ID和SECRET ACCESS KEY。 - 在「Default region name」欄位中輸入
us-west-2。並保留其他欄位的預設值。
- 輸入您建立的 AWS IAM 帳戶中的
關閉 AWS IAM 主控台視窗。
瞭解資料模型
以下各節將說明 Amazon DynamoDB 和 Spanner 的資料類型、鍵和索引的異同。
資料類型
Spanner 使用 GoogleSQL 資料型別。下表說明 Amazon DynamoDB 資料型別如何對應至 Spanner 資料型別。
| Amazon DynamoDB | Spanner |
|---|---|
| 數字 | 視精確度或預定用途而定,可對應至 INT64、FLOAT64、TIMESTAMP 或 DATE。 |
| 字串 | 字串 |
| 布林值 | BOOL |
| 空值 | 沒有明確的類型。資料欄可包含空值。 |
| 二進位檔 | 位元組 |
| 集合 | 陣列 |
| 對應和清單 | 如果結構一致並可使用資料表 DDL 語法描述,則為 Struct。 |
主鍵
Amazon DynamoDB 主鍵會產生唯一性,並可為雜湊鍵或是範圍鍵和雜湊鍵的組合。本教學課程首先會示範如何遷移主鍵為雜湊鍵的 Amazon DynamoDB 資料表。這個雜湊鍵會成為 Spanner 資料表的主鍵。在下方的交錯式資料表一節中,您將模擬 Amazon DynamoDB 資料表使用的主鍵是由雜湊鍵和範圍鍵組成的情形。
次要索引
Amazon DynamoDB 和 Spanner 都支援在非主鍵屬性上建立索引。請記下 Amazon DynamoDB 資料表中的任何次要索引,以便在 Spanner 資料表中建立這些索引,這部分會在本教學課程的後續章節中說明。
範例資料表
為方便進行本教學課程,您會將下列範例資料表從 Amazon DynamoDB 遷移至 Spanner:
| Amazon DynamoDB | Spanner | |
|---|---|---|
| 資料表名稱 |
Migration
|
Migration
|
| 主鍵 |
"Username" : String
|
"Username" : STRING(1024)
|
| 鍵類型 | 雜湊 | 不適用 |
| 其他欄位 |
Zipcode: Number
Subscribed: Boolean
ReminderDate: String
PointsEarned: Number
|
Zipcode: INT64
Subscribed: BOOL
ReminderDate: DATE
PointsEarned: INT64
|
準備 Amazon DynamoDB 資料表
在本節中,您將建立 Amazon DynamoDB 來源資料表並填入資料。
在 Cloud Shell 中,建立使用範例資料表屬性的 Amazon DynamoDB 資料表。
aws dynamodb create-table --table-name Migration \ --attribute-definitions AttributeName=Username,AttributeType=S \ --key-schema AttributeName=Username,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=75,WriteCapacityUnits=75確認資料表的狀態為
ACTIVE。aws dynamodb describe-table --table-name Migration \ --query 'Table.TableStatus'在資料表中填入範例資料。
python3 make-fake-data.py --table Migration --items 25000
可建立 Spanner 資料庫
您建立的 Spanner 執行個體,運算資源盡可能小,只有 100 個處理單元。這項運算容量足以應付本教學課程的範圍。如要部署正式環境,請參閱 Spanner 執行個體說明文件,判斷適當的運算能力,以符合資料庫效能需求。
在本範例中,您會同時建立資料表結構定義和資料庫。您也可以在建立資料庫後更新結構定義,這種做法很常見。
在設定預設 Compute Engine 可用區的相同區域中,建立 Spanner 執行個體。例如
us-central1。gcloud beta spanner instances create spanner-migration \ --config=regional-us-central1 --processing-units=100 \ --description="Migration Demo"在 Spanner 執行個體中建立資料庫和範例資料表。
gcloud spanner databases create migrationdb \ --instance=spanner-migration \ --ddl "CREATE TABLE Migration ( \ Username STRING(1024) NOT NULL, \ PointsEarned INT64, \ ReminderDate DATE, \ Subscribed BOOL, \ Zipcode INT64, \ ) PRIMARY KEY (Username)"
準備遷移作業
接下來的章節將說明如何匯出 Amazon DynamoDB 來源資料表,以及如何設定 Pub/Sub 複寫功能,以便擷取匯出資料庫時發生的任何變更。
將變更串流至 Pub/Sub
您可以使用 AWS Lambda 函式,將資料庫異動串流至 Pub/Sub。
在 Cloud Shell 中,針對來源資料表啟用 Amazon DynamoDB 串流。
aws dynamodb update-table --table-name Migration \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES設定 Pub/Sub 主題,接收變更。
gcloud pubsub topics create spanner-migration
畫面會出現以下輸出結果:
Created topic [projects/your-project/topics/spanner-migration].
建立 IAM 服務帳戶,將表格更新推送至 Pub/Sub 主題。
gcloud iam service-accounts create spanner-migration \ --display-name="Spanner Migration"畫面會出現以下輸出結果:
Created service account [spanner-migration].
建立 IAM 政策繫結,讓服務帳戶有權發布至 Pub/Sub。將
GOOGLE_CLOUD_PROJECT替換為 Google Cloud 專案名稱。gcloud projects add-iam-policy-binding GOOGLE_CLOUD_PROJECT \ --role roles/pubsub.publisher \ --member serviceAccount:spanner-migration@GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com畫面會出現以下輸出結果:
bindings: (...truncated...) - members: - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com role: roles/pubsub.publisher
建立服務帳戶的憑證。
gcloud iam service-accounts keys create credentials.json \ --iam-account spanner-migration@GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com畫面會出現以下輸出結果:
created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
準備並封裝 AWS Lambda 函式,將 Amazon DynamoDB 資料表變更推送至 Pub/Sub 主題。
pip3 install --ignore-installed --target=lambda-deps google-cloud-pubsub cd lambda-deps; zip -r9 ../pubsub-lambda.zip *; cd - zip -g pubsub-lambda.zip ddbpubsub.py
建立變數,以針對您先前建立的 Lambda 執行角色擷取其 Amazon Resource Name (ARN)。
LAMBDA_ROLE=$(aws iam list-roles \ --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \ --output text)使用
pubsub-lambda.zip套件建立 AWS Lambda 函式。aws lambda create-function --function-name dynamodb-spanner-lambda \ --runtime python3.9 --role ${LAMBDA_ROLE} \ --handler ddbpubsub.lambda_handler --zip fileb://pubsub-lambda.zip \ --environment Variables="{SVCACCT=$(base64 -w 0 credentials.json),PROJECT=GOOGLE_CLOUD_PROJECT,TOPIC=spanner-migration}"畫面會出現以下輸出結果:
{ "FunctionName": "dynamodb-spanner-lambda", "LastModified": "2022-03-17T23:45:26.445+0000", "RevisionId": "e58e8408-cd3a-4155-a184-4efc0da80bfb", "MemorySize": 128, ... truncated output... "PackageType": "Zip", "Architectures": [ "x86_64" ] }建立變數,以針對您的資料表擷取 Amazon DynamoDB 串流的 ARN。
STREAMARN=$(aws dynamodb describe-table \ --table-name Migration \ --query "Table.LatestStreamArn" \ --output text)將 Lambda 函式附加至 Amazon DynamoDB 資料表。
aws lambda create-event-source-mapping --event-source ${STREAMARN} \ --function-name dynamodb-spanner-lambda --enabled \ --starting-position TRIM_HORIZON如要在測試期間最佳化回應能力,請在先前的指令結尾新增
--batch-size 1,這樣每次建立、更新或刪除項目時,都會觸發函式。您會看到類似下方的輸出內容:
{ "UUID": "44e4c2bf-493a-4ba2-9859-cde0ae5c5e92", "StateTransitionReason": "User action", "LastModified": 1530662205.549, "BatchSize": 100, "EventSourceArn": "arn:aws:dynamodb:us-west-2:accountid:table/Migration/stream/2018-07-03T15:09:57.725", "FunctionArn": "arn:aws:lambda:us-west-2:accountid:function:dynamodb-spanner-lambda", "State": "Creating", "LastProcessingResult": "No records processed" ... truncated output...
將 Amazon DynamoDB 資料表匯出至 Amazon S3
在 Cloud Shell 中,針對您要在下方幾節中使用的值區名稱建立變數。
BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-export建立 Amazon S3 bucket,用於接收 DynamoDB 匯出內容。
aws s3 mb s3://${BUCKET}在 AWS 管理主控台中,前往 DynamoDB,然後點選「Tables」。
按一下「
Migration」資料表。在「Exports and stream」分頁中,點選「Export to S3」。
如果出現提示,請啟用
point-in-time-recovery(PITR)。按一下「Browse S3」(瀏覽 S3),選擇先前建立的 S3 bucket。
按一下 [匯出]。
按一下「重新整理」圖示,即可更新匯出作業的狀態。這項工作需要幾分鐘才能完成匯出。
程序完成後,請查看輸出內容的 bucket。
aws s3 ls --recursive s3://${BUCKET}這個步驟大約需要 5 分鐘。完成後,您會看到類似下方的輸出內容:
2022-02-17 04:41:46 0 AWSDynamoDB/01645072900758-ee1232a3/_started 2022-02-17 04:46:04 500441 AWSDynamoDB/01645072900758-ee1232a3/data/xygt7i2gje4w7jtdw5652s43pa.json.gz 2022-02-17 04:46:17 199 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.json 2022-02-17 04:46:17 24 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.md5 2022-02-17 04:46:17 639 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.json 2022-02-17 04:46:18 24 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.md5
執行遷移作業
Pub/Sub 傳送機制已就位,現在可以推送匯出後發生的任何表格變更。
將匯出的資料表複製到 Cloud Storage
在 Cloud Shell 中建立 Cloud Storage bucket,接收從 Amazon S3 匯出的檔案。
gcloud storage buckets create gs://${BUCKET}將 Amazon S3 中的檔案同步至 Cloud Storage。對於大多數複製作業,
rsync指令都有效。如果匯出檔案很大 (數 GB 以上),請使用 Cloud Storage 轉移服務在背景管理轉移作業。gcloud storage rsync s3://${BUCKET} gs://${BUCKET} --recursive --delete-unmatched-destination-objects
批次匯入資料
如要將匯出檔案中的資料寫入 Spanner 表格,請使用 Apache Beam 程式碼範例執行 Dataflow 工作。
cd dataflow mvn compile mvn exec:java \ -Dexec.mainClass=com.example.spanner_migration.SpannerBulkWrite \ -Pdataflow-runner \ -Dexec.args="--project=GOOGLE_CLOUD_PROJECT \ --instanceId=spanner-migration \ --databaseId=migrationdb \ --table=Migration \ --importBucket=$BUCKET \ --runner=DataflowRunner \ --region=us-central1"如要查看匯入工作的進度,請前往 Google Cloud 控制台的 Dataflow。
當工作正在執行時,您可以查看執行圖來檢查記錄。請按一下「Status」(狀態) 為「Running」(執行中) 的工作。
按一下各個階段可查看已處理完畢的元素數量。如果所有階段都顯示「Succeeded」(成功),表示已匯入完成。在各個階段中顯示為處理完畢的元素數量,與在 Amazon DynamoDB 資料表中建立的元素數量相同。
確認目的地 Spanner 資料表中的記錄數,與 Amazon DynamoDB 資料表中的項目數相符。
aws dynamodb describe-table --table-name Migration --query Table.ItemCount gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration --sql="select count(*) from Migration"
畫面會出現以下輸出結果:
$ aws dynamodb describe-table --table-name Migration --query Table.ItemCount 25000 $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="select count(*) from Migration" 25000
在每個資料表中取樣隨機項目,確保資料皆一致。
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="select * from Migration limit 1"畫面會出現以下輸出結果:
Username: aadams4495 PointsEarned: 5247 ReminderDate: 2022-03-14 Subscribed: True Zipcode: 58057
使用上一步中 Spanner 查詢傳回的相同
Username,查詢 Amazon DynamoDB 資料表。例如:aallen2538。這個值是資料庫中樣本資料的專屬值。aws dynamodb get-item --table-name Migration \ --key '{"Username": {"S": "aadams4495"}}'其他欄位的值應與 Spanner 輸出內容中的值相符。畫面會出現以下輸出結果:
{ "Item": { "Username": { "S": "aadams4495" }, "ReminderDate": { "S": "2018-06-18" }, "PointsEarned": { "N": "1606" }, "Zipcode": { "N": "17303" }, "Subscribed": { "BOOL": false } } }
複製新的變更
批次匯入工作完成後,請設定串流工作,將來源資料表中的持續更新寫入 Spanner。您 訂閱 Pub/Sub 中的事件,並將這些事件寫入 Spanner
您建立的 Lambda 函式已設定為擷取來源 Amazon DynamoDB 資料表的變更,並將變更發布至 Pub/Sub。
建立 Pub/Sub 主題的訂閱項目,AWS Lambda 會將事件傳送至該主題。
gcloud pubsub subscriptions create spanner-migration \ --topic spanner-migration畫面會出現以下輸出結果:
Created subscription [projects/your-project/subscriptions/spanner-migration].
如要串流傳入 Pub/Sub 的變更,並寫入 Spanner 資料表,請從 Cloud Shell 執行 Dataflow 工作。
mvn exec:java \ -Dexec.mainClass=com.example.spanner_migration.SpannerStreamingWrite \ -Pdataflow-runner \ -Dexec.args="--project=GOOGLE_CLOUD_PROJECT \ --instanceId=spanner-migration \ --databaseId=migrationdb \ --table=Migration \ --experiments=allow_non_updatable_job \ --subscription=projects/GOOGLE_CLOUD_PROJECT/subscriptions/spanner-migration \ --runner=DataflowRunner \ --region=us-central1"與批次載入步驟類似,如要監控工作進度,請前往 Google Cloud 控制台的 Dataflow。
按一下「Status」(狀態) 為「Running」(執行中) 的工作。
處理圖會顯示和之前類似的輸出內容,但每個已處理完畢的項目會計入狀態視窗中顯示的數量。系統延遲時間是粗略估計值,用來預測變更出現在 Spanner 資料表前的延遲時間。
您在批次載入階段執行的 Dataflow 工作是一組有限的輸入內容,也稱為有界資料集。這項 Dataflow 工作會將 Pub/Sub 做為串流來源,並視為無界。如要進一步瞭解這兩種來源,請參閱 Apache Beam 程式設計指南的 PCollection 一節。這個步驟中的 Dataflow 工作會保持啟用狀態,因此不會在完成後終止。串流 Dataflow 工作會維持「執行中」狀態,而非「成功」狀態。
確認複製設定
您對來源資料表進行一些變更,確認變更內容已複製到 Spanner 資料表。
在 Spanner 中查詢不存在的資料列。
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"這項作業不會傳回任何結果。
在 Amazon DynamoDB 中建立記錄,並使用與 Spanner 查詢相同的鍵。如果指令執行成功,則不會有任何輸出結果。
aws dynamodb put-item \ --table-name Migration \ --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'再次執行相同的查詢,確認資料列現在位於 Spanner 中。
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"輸出結果會顯示插入的資料列:
Username: my-test-username PointsEarned: None ReminderDate: None Subscribed: False Zipcode:
變更原始項目的部分屬性,並更新 Amazon DynamoDB 資料表。
aws dynamodb update-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}' \ --update-expression "SET PointsEarned = :pts, Subscribed = :sub" \ --expression-attribute-values '{":pts": {"N":"4500"}, ":sub": {"BOOL":true}}'\ --return-values ALL_NEW您會看到類似下方的輸出內容:
{ "Attributes": { "Username": { "S": "my-test-username" }, "PointsEarned": { "N": "4500" }, "Subscribed": { "BOOL": true } } }確認變更已傳播至 Spanner 資料表。
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"畫面會出現以下輸出結果:
Username PointsEarned ReminderDate Subscribed Zipcode my-test-username 4500 None True
刪除 Amazon DynamoDB 來源資料表中的測試項目。
aws dynamodb delete-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}'確認 Spanner 資料表中的對應資料列已刪除。如果變更已推送完畢,以下指令不會傳回任何資料列:
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
使用交錯式資料表
Spanner 支援交錯資料表的概念。這是設計模型,頂層項目包含多個與該頂層項目相關的巢狀項目,例如顧客和訂單,或是玩家和遊戲分數。如果您的 Amazon DynamoDB 來源資料表使用由雜湊鍵和範圍鍵組成的主鍵,您可以使用交錯式資料表結構定義做為模型,如下圖所示。這個結構可讓您有效率地查詢交錯式資料表,同時彙整父項資料表中的欄位。
套用次要索引
最佳做法是先載入資料,再將次要索引套用至 Spanner 資料表。現在複製作業已正常運作,請設定次要索引,加快查詢速度。與 Spanner 資料表一樣,Spanner 次要索引也完全一致。不具備最終一致性,這是許多 NoSQL 資料庫常見的特性。這個特性有助於簡化應用程式設計。
執行不使用任何索引的查詢。您要尋找特定資料欄值的前 N 個出現次數。這可提高資料庫效率,因此在 Amazon DynamoDB 中是常見的查詢。
前往 Spanner。
按一下「Spanner Studio」。
在「Query」(查詢) 欄位中輸入以下查詢,然後按一下 [Run query] (執行查詢)。
SELECT Username,PointsEarned FROM Migration WHERE Subscribed=true AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY) ORDER BY ReminderDate DESC LIMIT 10
查詢執行完畢後,按一下 [Explanation] (說明) 並記下「Rows scanned」(掃描的資料列) 數量和「Rows returned」(傳回的資料列) 數量。如果沒有索引,Spanner 會掃描整個資料表,傳回符合查詢的一小部分資料。
如果這是常用查詢,請針對 Subscribed 和 ReminderDate 資料欄建立複合式索引。在 Spanner 控制台中,選取左側導覽窗格的「索引」,然後點選「建立索引」。
在文字方塊中輸入索引定義。
CREATE INDEX SubscribedDateDesc ON Migration ( Subscribed, ReminderDate DESC )
如要開始在背景建構資料庫,請按一下 [Create] (建立)。
索引建立完畢後,請再次執行查詢並新增索引。
SELECT Username,PointsEarned FROM Migration@{FORCE_INDEX=SubscribedDateDesc} WHERE Subscribed=true AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY) ORDER BY ReminderDate DESC LIMIT 10再次查看查詢說明。您會發現「Rows scanned」(掃描的資料列) 數量減少了,每個步驟中「Rows returned」(傳回的資料列) 與查詢傳回的數量相符。
交錯式索引
您可以在 Spanner 中設定交錯索引。上一節討論的次要索引位於資料庫階層的根層級,且使用索引的方式與傳統資料庫相同。交錯式索引則與其交錯式資料列相關。如要進一步瞭解交錯索引的套用位置,請參閱索引選項。
根據資料模型調整
如要根據您自己的情況調整本教學課程的遷移設定,請修改您的 Apache Beam 來源檔案。請務必不要在實際遷移期間變更來源結構定義,否則可能會遺失資料。
如要剖析傳入的 JSON 並建構突變,請使用 GSON。調整 JSON 定義,使其與資料相符。
調整相對的 JSON 對應。
在先前的步驟中,您修改了大量匯入作業的 Apache Beam 原始碼。以類似方式修改管道串流部分的原始碼。最後,請調整 Spanner 目標資料庫的資料表建立指令碼、結構定義和索引。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除 AWS 資源
如果您會在本教學課程以外的地方使用您的 AWS 帳戶,刪除下列資源時請務必小心:
- 刪除名為「Migration」的 DynamoDB 資料表。
- 刪除您在遷移步驟中建立的 Amazon S3 bucket 和 Lambda 函式。
- 最後,刪除您在本教學課程中建立的 AWS IAM 使用者。