亚马逊AWS官方博客

新增功能 – 将单区域 Amazon DynamoDB 表转换为全局表

成千上万的 AWS 客户正在使用 Amazon DynamoDB。2017 年,我们推出了 DynamoDB 全局表 – 一个完全托管的解决方案,可以部署多区域、多主 DynamoDB 表,无需构建和维护您自己的复制解决方案。在创建全局表时,请指定您希望表可用的 AWS 区域。DynamoDB 执行所有必要的任务,在这些区域中创建相同的表,并将正在进行的数据更改传播到所有的表。

AWS 客户之所以使用 DynamoDB 全局表,主要出于两个原因:为客户提供低延迟体验,并加快其备份或灾难恢复过程。延迟是指一条信息在网络中传播和返回所需的时间。低延迟应用程序可提高客户参与度并带来更多收入。将后端部署到客户附近的多个区域,可以减少应用程序的延迟。如果在另一区域拥有完整的数据副本,便可轻松地将流量切换到另一区域,以防破坏区域设置或发生极为罕见的区域故障。正如我们的 CTOWerner Vogels 博士所写的那样:“失败是必然的,随着时间的推移,一切最终都会失败。”

从今天开始,您只需在 AWS 管理控制台中点击几次,或使用 AWS 命令行界面 (CLI)Amazon DynamoDB API,便可将您的现有 DynamoDB 表转换为全局表。以前,只能将空表转换为全局表。您必须在创建表时猜测表的区域使用情况。现在,您可以转到全局,也可以随时将现有全局表扩展到其他区域。

当我们设置复制时,您的应用程序可继续使用该表。当您向表中添加区域时,DynamoDB 开始使用现有表的快照来填充新副本。当 DynamoDB 构建新副本时,您的应用程序可以继续写入现有区域,并且所有正在进行的更新最终都将复制到新副本中。

要使用 AWS 命令行界面 (CLI) 创建 DynamoDB 全局表,我先在美国西部(俄勒冈)区域 (us-west-2) 创建一个本地表:

aws dynamodb create-table --region us-west-2 \
                          --table-name demo-global-table \
                          --key-schema AttributeName=id,KeyType=HASH \
                          --attribute-definitions AttributeName=id,AttributeType=S \
                          --billing-mode PAY_PER_REQUEST

该命令返回:

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "id",
                "AttributeType": "S"
            }
        ],
        "TableName": "demo-global-table",
        "KeySchema": [
            {
                "AttributeName": "id",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1570278914.419,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 0,
            "WriteCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:us-west-2:400000000003:table/demo-global-table",
        "TableId": "0a04bd34-bbff-42dd-ae18-78d05ce641fd",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST"
        }
    }
}

创建表后,我插入了几个项目:

aws dynamodb batch-write-item --region us-west-2 --request-items file://./batch-write-items.json

(此 json 文件可作为 gist 提供)

然后,我更新了表,添加了其他区域,即美国东部(弗吉尼亚北部)区域 (us-east-1):

aws dynamodb update-table --region us-west-2 --table-name demo-global-table --add-region us-east-1 (TBD??)

该命令返回一个长 JSON,您需要注意的属性是:

{
...
        "TableStatus": "UPDATING",
        "TableSizeBytes": 124,
        "ItemCount": 3,
        "StreamSpecification": {
            "StreamEnabled": true,
            "StreamViewType": "NEW_AND_OLD_IMAGES"
        },
        "LatestStreamLabel": "2019-10-22T19:33:37.819",
        "LatestStreamArn": "arn:aws:dynamodb:us-west-2:400000000003:table/demo-global-table/stream/2019-10-22T19:33:37.819"
    }
...
}

我可以在 AWS 管理控制台中进行相同的更新,选择要更新的表,然后单击 Global Tables(全局表)

全局表要求启用流。我先单击 Enable stream(启用流),然后单击 Add region(添加区域)

我选择要复制到的区域,例如(欧洲西部(爱尔兰)),然后单击 Create replica(创建副本)

DynamoDB 将表异步复制到新区域。我在 AWS 管理控制台中监控复制的进度。表的状态最终从Creating(正在创建)变更为Active(活动)。我还可以通过调用 DescribeTable API 来检查状态,验证 TableStatus = Active

一会儿我便可以查询新区域中的表:

aws dynamodb get-item --region eu-east-1 --table-name demo-global-table --key '{"id" : {"S" : "0123456789"}}'

{
    "Item": {
        "firstname": {
            "S": "Jeff"
        },
        "id": {
            "S": "0123456789"
        },
        "lastname": {
            "S": "Barr"
        }
    }
}

从今天开始,您可以将现有本地表更新为全局表。 几周后,我们将发布一款工具,使您可以更新现有全局表以利用这一新功能。更新最多需要几分钟时间。在更新过程中,表可用于您的应用程序。

其他改进功能
我们还将简化用于数据同步的内部机制。以前,DynamoDB 全局表利用 DynamoDB 流,并在架构中添加三个属性 (aws:rep:*),以使数据保持同步。DynamoDB 现在本机管理复制。它不会向数据公开同步属性,也不会消耗额外的写容量:

  • 在全局表的每个区域只发生一次写操作,这减少了表中所需的已消耗的复制写容量。
  • 因此,不再发布第二条 DynamoDB 流记录。
  • 先前填充的三个 aws:rep:* 属性不再插入到项目记录中。

这些更改会对您的应用程序产生两种后果。首先,使用全局表可降低 DynamoDB 成本,因为不需要额外的写容量来管理同步。其次,当应用程序依赖于三个技术项目 (aws:rep:*) 时,您的应用程序需要稍作代码更改。尤其是,DynamoDB Mapper 不要求项目记录中存在 aws:rep:* 属性。

鉴于此更改,我们还将更新 UpdateTable API。修改全局二级索引 (GSI)、计费模式服务器端加密或全局表中写容量单位的任何操作都将异步应用于所有其他副本。

可用性
改进的 Amazon DynamoDB 全局表当前在 Amazon DynamoDB 全局表可用的 13 个区域可用,未来计划在更多区域可用。截止今天,AWS 区域列表为 us-east-1(弗吉尼亚北部)、us-west-2(俄勒冈)、us-east-2(俄亥俄)、us-west-1(加利福尼亚北部)、ap-northeast-2(首尔)、ap-southeast-1(新加坡)、ap-southeast-2(悉尼)、ap-northeast-1(东京)、eu-central-1(法兰克福)、eu-west-1(爱尔兰)、eu-west-2(伦敦)、GovCloud(美国东部)和 GovCloud(美国西部)。

定价没有变化。您只需为在其他区域使用的资源以及区域间的数据传输付费。

此更新解决了我们从您那里收到的最常见的反馈,并将作为我们将来构建附加功能的平台。请继续提供反馈,告知我们您如何使用全局表以及哪些功能对您的应用程序很重要。

— seb