教程:创建全局表 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:创建全局表

DynamoDB 全局表有两种版本:版本 2019.11.21(当前)版本 2017.11.29。要了解正在使用的版本,请参阅 确定版本

本节介绍如何使用 Amazon DynamoDB 控制台或 Amazon Command Line Interface (Amazon CLI) 创建全局表。

创建全局表 (控制台)

按照以下步骤,使用控制台创建全局表。以下示例创建一个全局表,其副本表位于美国和欧洲。

  1. 打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/home。对于本示例,请选择美国东部(俄亥俄)区域。

  2. 在控制台左侧的导航窗格中,选择 Tables (表)

  3. 选择 Create Table (创建表)

    1. 对于 Table name(表名称),输入 Music

    2. Partition key (分区键) 中,输入 Artist。对于 Sort key (排序键),输入 SongTitle。(ArtistSongTitle 均应为字符串。)

    选择 Create table (创建表) 以创建表。此表在新全局表中用作第一个副本表。这是您稍后添加的其他副本表的原型。

  4. 选择 Global Tables (全局表) 选项卡,然后选择 Create replica (创建副本)

  5. Available replication Regions (可用复制区域) 下拉菜单,选择 US West (Oregon) (美国西部(俄勒冈))

    控制台将进行检查,以确保所选区域中不存在同名的表。如果有同名的表,则必须删除现有表,然后才能在该区域创建新的副本表。

  6. 选择 Create Replica (创建副本)。这将启动美国西部(俄勒冈)的表创建过程。

    选定表(以及任何其他副本表)的全局表选项卡将显示该表已在多个区域中复制。

  7. 现在,添加另一个区域,以便您跨美国和欧洲复制并同步您的全局表。为此,请重复步骤 5,不过这次指定 Europe (Frankfurt) (欧洲(法兰克福)) 而非 US West (Oregon) (美国西部(俄勒冈))

  8. 在美国东部(俄亥俄)区域,您应仍使用 Amazon Web Services Management Console。选择左侧导航菜单中的 Items (项目),选择 Music 表,然后选择 Create Item (创建项目)

    1. 对于 Artist,输入 item_1

    2. 对于 SongTitle,输入 Song Value 1

    3. 要写入该项目,请选择 Create item (创建项目)

  9. 稍后,该项目将跨您的全局表的所有三个区域复制。要验证这一点,请在控制台中,转到右上角的区域选择器,并选择欧洲(法兰克福)。欧洲(法兰克福)的 Music 表应包含新的项目。

  10. 重复步骤 9,然后选择 US West (Oregon) [美国西部(俄勒冈)] 以验证该区域中的复制。

创建全局表 (Amazon CLI)

按照以下步骤,使用 Amazon CLI 创建全局表 Music。以下示例创建一个全局表,其副本表位于美国和欧洲。

  1. 创建新表 (Music),并启用 DynamoDB Streams (NEW_AND_OLD_IMAGES)。

    aws dynamodb create-table \ --table-name Music \ --attribute-definitions \ AttributeName=Artist,AttributeType=S \ AttributeName=SongTitle,AttributeType=S \ --key-schema \ AttributeName=Artist,KeyType=HASH \ AttributeName=SongTitle,KeyType=RANGE \ --billing-mode PAY_PER_REQUEST \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region us-east-2
  2. 在美国东部(弗吉尼亚北部)创建相同的 Music 表。

    aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Create": { "RegionName": "us-east-1" } } ] }' --region=us-east-2
  3. 重复步骤 2,以在欧洲(爱尔兰)(eu-west-1) 中创建一个表。

  4. 您可以使用 describe-table 查看创建的副本的列表。

    aws dynamodb describe-table --table-name Music --region us-east-2
  5. 要验证复制是否正常工作,请将一个新项目添加到美国东部(俄亥俄)中的 Music 表。

    aws dynamodb put-item \ --table-name Music \ --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-2
  6. 等待几秒钟,然后检查该项目是否已成功复制到美国东部(弗吉尼亚北部)和欧洲(爱尔兰)。

    aws dynamodb get-item \ --table-name Music \ --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-1
    aws dynamodb get-item \ --table-name Music \ --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region eu-west-1
  7. 删除欧洲(爱尔兰)区域中的副本表。

    aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Delete": { "RegionName": "eu-west-1" } } ] }'

创建全局表 (Java)

以下 Java 代码示例在欧洲(爱尔兰)区域中创建一个 Music 表,然后在亚太地区(首尔)区域创建一个副本。

package com.amazonaws.codesamples.gtv2 import java.util.logging.Logger; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException; import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; import com.amazonaws.services.dynamodbv2.model.BillingMode; import com.amazonaws.services.dynamodbv2.model.CreateReplicationGroupMemberAction; import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest; import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex; import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.Projection; import com.amazonaws.services.dynamodbv2.model.ProjectionType; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputOverride; import com.amazonaws.services.dynamodbv2.model.ReplicaGlobalSecondaryIndex; import com.amazonaws.services.dynamodbv2.model.ReplicationGroupUpdate; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; import com.amazonaws.services.dynamodbv2.model.StreamSpecification; import com.amazonaws.services.dynamodbv2.model.StreamViewType; import com.amazonaws.services.dynamodbv2.model.UpdateTableRequest; import com.amazonaws.waiters.WaiterParameters; public class App { private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public static void main( String[] args ) { String tableName = "Music"; String indexName = "index1"; Regions calledRegion = Regions.EU_WEST_1; Regions destRegion = Regions.AP_NORTHEAST_2; AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider("default")) .withRegion(calledRegion) .build(); LOGGER.info("Creating a regional table - TableName: " + tableName +", IndexName: " + indexName + " ....."); ddbClient.createTable(new CreateTableRequest() .withTableName(tableName) .withAttributeDefinitions( new AttributeDefinition() .withAttributeName("Artist").withAttributeType(ScalarAttributeType.S), new AttributeDefinition() .withAttributeName("SongTitle").withAttributeType(ScalarAttributeType.S)) .withKeySchema( new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH), new KeySchemaElement().withAttributeName("SongTitle").withKeyType(KeyType.RANGE)) .withBillingMode(BillingMode.PAY_PER_REQUEST) .withGlobalSecondaryIndexes(new GlobalSecondaryIndex() .withIndexName(indexName) .withKeySchema(new KeySchemaElement() .withAttributeName("SongTitle") .withKeyType(KeyType.HASH)) .withProjection(new Projection().withProjectionType(ProjectionType.ALL))) .withStreamSpecification(new StreamSpecification() .withStreamEnabled(true) .withStreamViewType(StreamViewType.NEW_AND_OLD_IMAGES))); LOGGER.info("Waiting for ACTIVE table status ....."); ddbClient.waiters().tableExists().run(new WaiterParameters<>(new DescribeTableRequest(tableName))); LOGGER.info("Testing parameters for adding a new Replica in " + destRegion + " ....."); CreateReplicationGroupMemberAction createReplicaAction = new CreateReplicationGroupMemberAction() .withRegionName(destRegion.getName()) .withGlobalSecondaryIndexes(new ReplicaGlobalSecondaryIndex() .withIndexName(indexName) .withProvisionedThroughputOverride(new ProvisionedThroughputOverride() .withReadCapacityUnits(15L))); ddbClient.updateTable(new UpdateTableRequest() .withTableName(tableName) .withReplicaUpdates(new ReplicationGroupUpdate() .withCreate(createReplicaAction.withKMSMasterKeyId(null)))); } }