本节介绍如何使用 Amazon DynamoDB 控制台或 AWS Command Line Interface (AWS CLI) 创建全局表。
主题
按照以下步骤,使用 AWS Management Console创建全局表。以下示例创建一个全局表,其副本表位于美国和欧洲。
-
打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/home
。对于本示例,请选择美国东部(俄亥俄州)区域。 -
在控制台左侧的导航窗格中,选择表。
-
选择创建表。
-
在创建 DynamoDB 表页面,执行以下操作:
-
对于表名称,输入
Music
。 -
对于分区键,输入
Artist
。 -
对于排序键,输入
SongTitle
。 -
保留分区键和排序键的默认字符串选择。
-
保留页面上的所有默认选项,然后选择创建表。
此新表在新的全局表中用作第一个副本表。这是您稍后添加的其他副本表的原型。
-
-
在表页面上,选择新创建的音乐表,然后执行以下操作:
-
选择全局表选项卡,然后选择创建副本。
-
从可用的复制区域下拉菜单,选择美国西部(俄勒冈州)us-west-2。
控制台将进行检查,以确保所选区域不存在同名的表。如果有同名的表,则必须删除现有表,然后才能在该区域创建新的副本表。
-
选择创建副本。这将在美国西部(俄勒冈州)us-west-2 区域启动表创建过程。
音乐表(以及任何其他副本表)的全局表选项卡将显示该表已在多个区域中复制。
-
添加另一个区域,以便跨美国和欧洲复制并同步您的全局表。为此,请重复步骤 5.b,不过这次指定欧洲地区(法兰克福)eu-central-1,而非美国西部(俄勒冈州)us-west-2。
-
-
在美国东部(俄亥俄州)区域,确保仍使用 AWS Management Console。然后执行以下操作:
-
选择 Explore table items(浏览表项目)。
-
选择创建项目。
-
对于 Artist,输入
item_1
。 -
对于 SongTitle,输入
Song Value 1
。 -
要保存该项目,请选择创建项目。
-
-
稍后,该项目将跨您的全局表的所有三个区域复制。要验证这一点,请在控制台中,转到右上角的区域选择器,并选择欧洲地区(法兰克福)。欧洲地区(法兰克福)的音乐表应包含该新项目。
-
重复步骤 7,然后选择美国西部(俄勒冈州)以验证该区域中的复制。
按照以下步骤,使用 AWS CLI 创建全局表 Music
。以下示例创建一个全局表,其副本表位于美国和欧洲。
-
创建新表 (
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
-
在美国东部(弗吉尼亚北部)创建相同的
Music
表。aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Create": { "RegionName": "us-east-1" } } ] }' \ --region=us-east-2
-
重复步骤 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 代码示例在欧洲(爱尔兰)区域中创建一个 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))));
}
}