在 DynamoDB Shell 中使用亚马逊 DynamoDB 全局表

全球表建立在全球 Amazon DynamoDB 足迹之上,为您提供完全托管的、多区域、多活跃的数据库,为大规模的全球应用程序提供快速、本地的读写性能。全球表会在您选择的 亚马逊云科技 区域中自动复制您的 DynamoDB 表。

DynamoDB Shell 是 DynamoDB 的交互式命令行界面。您可以通过 DynamoDB Shell 执行数据定义语言 (DDL) 和数据操作语言 (DML) 操作,它现在支持全局表操作。有关使用 DynamoDB Shell 查询数据的简介,请参阅使用 DynamoDB Shell 查询数据,这是亚马逊 DynamoDB 的命令行界面

这篇文章简要回顾了 DynamoDB Shell 的一些功能,并介绍了对全局表的支持。它简要说明了 DynamoDB 的新用户如何开始使用全局表。

DynamoDB 全局表

全球应用程序受益于其数据靠近客户。由于客户群分布在全球各地,这意味着应用程序设计人员需要一个能够以全球分布和一致的方式维护其客户数据的数据库。使用 DynamoDB 全局表,您可以创建可在许多地区运行、完全托管且具有多功能功能的表。DynamoDB 会自动将任何区域中数据的更新复制到所有其他区域。可以保证数据最终保持一致,如果同一项目几乎在同一时刻在多个地区更新,则以后的更新将占上风。有关 DynamoDB 全局表的更多详细信息,请参阅 亚马逊 Dynamo DB 全局表。

DynamoDB 全局表有两个版本。DynamoDB Shell 仅支持当前版本 2019.11.21 的 DDL,与早期版本相比,该版本提供了更高的灵活性、更高的效率和更节约的写入容量。

DynamoDB 外壳用例

为了说明如何使用带有全球表的 DynamoDB Shell,可以考虑一个跟踪航空公司航班的应用程序。在以下示例中,您在 DynamoDB Shell 中为应用程序创建了一个表。回想一下,在 DynamoDB Shell 中,提示符包含连接区域的名称。在任何时候,一个会话都只连接到一个区域。你可以使用 c onnect 命令切换区域。您开始连接到 us-east-2 (美国、俄亥俄州):

us-east-2> create table flights ( fltno string, route string ) primary key ( fltno hash, route range );
CREATE
us-east-2>

然后将一些数据填充到表中:

us-east-2> insert into flights ( fltno, route, status ) values ( "QR573", "BLR-DOH", "SCHEDULED" ), ("QR743", "DOH-BOS", "SCHEDULED");
INSERT
INSERT
us-east-2> select * from flights;
{fltno: QR743, route: DOH-BOS, status: SCHEDULED}
{fltno: QR573, route: BLR-DOH, status: SCHEDULED}
us-east-2>

此表位于 美国东部 2 区域 。任何想要访问这些数据的应用程序都必须连接到 us-east-2

现在,让我们将其转换为全局表,在 eu-west-3 (巴黎(法国))和 ap- south-1 (孟买(印度))中有一个副本:

us-east-2> alter table flights add replica ap-south-1;
ALTER
us-east-2> alter table flights add replica eu-west-3;
ALTER
us-east-2>

如果您立即运行以下 des c ribe 命令,则可以看到正在创建的副本:

us-east-2> describe flights;
Name: flights (ACTIVE)
Key: HASH fltno, RANGE route
[...]
Replica Region: eu-west-3 (Status: CREATING)
Replica Region: ap-south-1 (Status: CREATING)
Replica Region: us-east-2 (Status: ACTIVE)
us-east-2>

等待几分钟,DynamoDB 全局表将在所有三个位置设置表并在这些位置之间建立多活复制。如果添加副本时表中有大量数据,则建立副本可能需要更长时间。在创建和填充新副本时,现有副本(在本例中为 us-east-2 )仍然可用。

几分钟后,你会看到以下代码:

us-east-2> describe flights;
Name: flights (ACTIVE)
Key: HASH fltno, RANGE route
[...]
Replica Region: eu-west-3 (Status: ACTIVE)
Replica Region: ap-south-1 (Status: ACTIVE)
Replica Region: us-east-2 (Status: ACTIVE)
us-east-2>

现在让我们来看看 ap-south-1 区域 的数据:

us-east-2> connect ap-south-1;
CONNECT
ap-south-1> select * from flights;
{fltno: QR743, route: DOH-BOS, status: SCHEDULED}
{fltno: QR573, route: BLR-DOH, status: SCHEDULED}
ap-south-1>

DynamoDB 成功将数据从 us-east-2 复制到 ap-south-1

现在,假设有一架航班从 BLR 起飞前往卫生部(印度班加罗尔飞往卡塔尔多哈)。应用程序现在需要将 QR573 航班的状态切换为 DEPAR TED。 该组件(可能位于印度)将在逻辑上连接到 ap-south-1 中的数据库 并执行更新:

ap-south-1> update flights set status = "DEPARTED" where fltno = "QR573" and route = "BLR-DOH";
UPDATE (0 read, 1 modified, 0 ccf)
ap-south-1>

乘坐这架航班的乘客的家庭成员恰好在波士顿,想看看航班的状态,因此他们访问了一个网页(在 us-east-2 中运行), 并查看 QR573 航班的状态。该网页以 us-east-2 为例:

ap-south-1> connect us-east-2;
CONNECT
us-east-2> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: DEPARTED}
us-east-2>

DynamoDB 全局表在没有应用程序参与的情况下将写入操作从 ap-south-1 复制 到 us-east -2!

当航班降落在卫生部时,那里的应用程序会更新表格。该应用程序托管在欧洲,知道使用本地区域 eu-west-3

eu-west-3> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: DEPARTED}
eu-west-3> update flights set status = "ARRIVED" where fltno = "QR573" and route = "BLR-DOH";
UPDATE (0 read, 1 modified, 0 ccf)
eu-west-3> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: ARRIVED}
eu-west-3>

这个更新几乎是即时的,反映在 us-east-2 中, 供那里的家庭成员查看(他们当时是否碰巧醒着!):

eu-west-3> connect us-east-2;
CONNECT
us-east-2> select * from flights where fltno = "QR573";
{fltno: QR573, route: BLR-DOH, status: ARRIVED}
us-east-2>

如您所见,具有多个区域数据的全球分布式应用程序可以以完全主动的方式运行。所有这些复制都由 DynamoDB 全局表自动处理。冲突解决是在 最后一个作家获胜 的基础上处理的。数据以异步方式传播并最终保持一致。

假设你想在 us-west- 2 中添加另一个副本。DynamoDB Shell 可以做到这一点(另一次调用 ALTER TABLE)。但是,DynamoDB Shell 还支持 EXP L AIN 命令,该命令会告诉你执行的 API 调用:

us-east-2> explain alter table flights add replica us-west-2;
UpdateTable({
   "TableName":   "flights",
   "ReplicaUpdates":   [{
         "Create":   {
            "RegionName":   "us-west-2",
            "TableClassOverride":   "STANDARD"
         }
      }]
})

解释 命令是新 DynamoDB 用户学习 DynamoDB API 的有用方法。

最后,让我们在 us-west-2 中添加一个副本, 但将副本上的表类设置为 DynamoDB 标准低频访问(DynamoDB Standard-IA):

us-east-2> alter table flights add replica us-west-2 table class standard infrequent access;
ALTER
us-east-2>

命令完成后,在 us-west-2 中有一个使用标准 IA 表类 的表:

us-west-2> describe flights;
Name: flights (ACTIVE)
[…]
Table Class: STANDARD_INFREQUENT_ACCESS
[…]
Replica Region: eu-west-3 (Status: ACTIVE)
Replica Region: ap-south-1 (Status: ACTIVE)
Replica Region: us-east-2 (Status: ACTIVE)
Replica Region: us-west-2 (Status: ACTIVE)
us-west-2>

在此示例中,您在 us-east- 2 中创建了一个表(即按需表或按请求付费表),并使用 DynamoDB Shell 在 ap-south-1 和 eu-west - 3 中创建了两个全局表副本。

你看到在 us-east-2 中插入的数据会自动传播到 另外两个副本。对任何区域的数据所做的更新都会复制到所有区域。

DynamoDB shell 对区域表和全局表上的 “选择”、“插入”、“更新”、“UPSERT”、“替换” 和 “删除” 的支持与对本地表的支持相同。所有更改都由 DynamoDB 全局表自动传播到所有副本。

结论

DynamoDB 全局表是一种强大的结构,允许您构建全球分布式应用程序。数据复制完全由 DynamoDB 管理,冲突解决以 “最后写入者胜” 的方式处理。数据以异步方式传播并最终保持一致。

DynamoDB Shell 可以帮助您开始使用 DynamoDB 和 DynamoDB 全局表,并探索在完全托管的数据库服务中为您提供的特性和功能。

你试过 DynamoDB Shell 吗?请告诉我们您希望我们在 shell 中支持哪些功能。 要开始使用 DynamoDB Shell,请参阅使用 DynamoDB Shel l(亚马逊 DynamoDB 的命令行界面) 查询数据, 或按照 GitHub 存储库中 readme. md 文件中的说明进行操作。

Macintosh 用户,你可以从自制软件中获得 DynamoDB Shell。

brew tap aws/tap
brew install aws-ddbsh

作者简介

Amrith Kumar 是亚马逊网络服务的高级首席工程师,在亚马逊 DynamoDB 上工作。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。