本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:创建全局表
DynamoDB 全局表有两种版本:版本 2019.11.21(当前) 和 版本 2017.11.29。要了解您正在使用的版本,请参阅确定版本。 |
本节介绍如何使用 Amazon DynamoDB 控制台或 AWS Command Line Interface (AWS CLI)创建全局表。
创建全局表 (控制台)
按照以下步骤,使用控制台创建全局表。以下示例创建一个全局表,其副本表位于美国和欧洲。
-
通过以下网址打开 DynamoDB 控制台:https://console.amazonaws.cn/dynamodb/home
。对于本示例,请 us-east-2(美国东部俄亥俄州)区域。 -
在控制台左侧的导航窗格中,选择 Tables (表)。
-
选择 Create Table (创建表)。
对于表名称,输入
Music
。对于 Primary key (主键),输入
Artist
。 选择 Add sort key (添加排序键),然后输入SongTitle
。(Artist
和SongTitle
均应为字符串。)要创建表,请选择创建。此表在新全局表中用作第一个副本表。这是您稍后添加的其他副本表的原型。
-
选择全局表选项卡,然后选择启用流。保留视图类型的默认值(新旧映像)。
-
选择添加区域。
-
在 Region (区域) 中,选择 美国西部(俄勒冈)。
控制台将进行检查,以确保所选区域中不存在同名的表。如果有同名的表,则必须删除现有表,然后才能在该区域创建新的副本表。
选择 Create Replica (创建副本),这将在 美国西部(俄勒冈) 中启动表创建过程。
选定表(以及任何其他副本表)的全局表选项卡将显示该表已在多个区域中复制。
-
现在,添加另一个区域,以便您跨美国和欧洲复制并同步您的全局表。为此,请重复步骤 5,不过这次指定欧洲(法兰克福)而非美国西部(俄勒冈)。
-
在 us-east-2(美国东部俄亥俄州)区域,您应仍使用 AWS 管理控制台。对于音乐表,选择项目选项卡,然后选择创建项目。 对于 Artist,输入
item_1
。 对于 SongTitle,输入Song Value 1
。 要写入项目,请选择 Save (保存)。稍后,该项目将跨您的全局表的所有三个区域复制。要验证这一点,请在控制台中,转到右上角的区域选择器,并选择 欧洲(法兰克福)。欧洲(法兰克福)中的
Music
表应包含新的项目。对 美国西部(俄勒冈) 重复此操作。
创建全局表 (AWS CLI)
按照以下步骤,使用 AWS CLI 创建全局表 Music
。以下示例创建一个全局表,其副本表位于美国和欧洲。
-
在美国东部(俄亥俄州)中创建新表(
Music
),同时启用 DynamoDB 流 (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
-
在美国东部(弗吉尼亚北部)中创建相同的
Music
表。aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Create": { "RegionName": "us-east-1" } } ] }'
-
重复步骤 2,以在 欧洲(爱尔兰) (eu-west-1) 中创建一个表。
-
您可以使用
describe-table
查看创建的副本的列表。aws dynamodb describe-table --table-name Music --region us-east-2
-
要验证复制是否正常工作,请将一个新项添加到
Music
中的 美国东部(俄亥俄州) 表。aws dynamodb put-item \ --table-name Music \ --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-2
-
等待几秒钟,然后检查该项目是否已成功复制到美国东部(弗吉尼亚北部)和欧洲(爱尔兰)。
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
-
删除 欧洲(爱尔兰) 区域中的副本表。
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)))); } }