如何从 Microsoft SQL Server 迁移至 Amazon DynamoDB

简介

在本课程中,您将学习如何使用 DynamoDB 将旧有 Microsoft SQL Server 数据库迁移至云原生的 NoSQL(非关系型)数据库。首先,创建一个 SQL Server 数据库并为其加载样本数据。之后创建一个 DynamoDB 数据库,为数据做好迁移准备。最后,使用 Amazon Database Migration Service (AWS DMS)将数据迁移至 DynamoDB。学习完本课程后,您将掌握相关能力,并能自信地使用 DynamoDB 将数据从旧有数据库迁移至云原生的 NoSQL 数据库。

摆脱旧有数据库的束缚 - 如何从 SQL Server 迁移至 Amazon DynamoDB (29:47)

完成时间:30-45分钟

为何使用 DynamoDB ?

DynamoDB 是一种云原生的 NoSQL(非关系型)数据库,无论规模大小均可提供快速,一致的性能。DynamoDB 因其灵活的收费模式和无服务器友好的连接模式,被 Amazon.com 、 Lyft 和三星等公司用于其大规模应用程序和无服务器应用程序。

DynamoDB 是一种完全托管服务,因此所有数据库操作均由亚马逊云科技托管。您直接为数据读写单元付费,亚马逊云科技会确保您的应用程序具有必要的容量。您无需再为实例故障、软件升级、备份或是其他数据库维护工作所累,您的团队也能将更多精力投入到为用户进行创新之中。

DynamoDB 属于非关系型数据库,其数据建模原则与关系型数据库不同。从旧有的关系型数据库向 DynamoDB 进行平台迁移时,您需要对数据模型进行调整。在本课程中,您将学习如何将现有的关系型数据模型迁移至 DynamoDB 的非关系型数据模型。

课程内容

您将通过本课程了解如何使用 DynamoDB 将旧有 SQL Server 数据库迁移至云原生的 NoSQL 数据库。本课程共包含7个模块。

  • 在本模块中,您将在 Amazon Relational Database Service (RDS)中创建一个 SQL Server 数据库实例,并为其加载样本数据。在您将自己的旧有数据库迁移至 DynamoDB 时,可以将该数据库作为示例用于参考比较。


    首先,前往 Amazon RDS 控制面板。在主页点击“创建数据库”,创建一个新的数据库。

    (点击放大)

    这将启动数据库创建向导。在“引擎选项”部分的“引擎类型”一栏里,选择 Microsoft SQL Server。然后,选择 SQL Server Standard Edition 并使用默认版本。

    (点击放大)

    数据库创建向导中包含模版,以便您更轻松地配置 Amazon RDS 数据库。由于本次创建的是示例数据库,您可以选择模版中的“开发/测试”选项。

    (点击放大)

    “设置”部分,为您的数据库命名并设置主用户名及密码。请务必将这些内容记录下来,因为您在连接到数据库和创建其他用户时都需要它们。

    (点击放大)

    接下来,选择数据库实例大小。选择实例类中的 db.m5.large

    (点击放大)

    然后,为您的 Amazon RDS 数据库设置存储选项。您可以选择默认的“通用型(SSD)”并将大小设置为 20 GiB

    (点击放大)

    Amazon RDS 数据库创建向导的下一个步骤是设置连接。您必须指定数据库所在的 Amazon Virtual Private Cloud (Amazon VPC)以及数据库实例的子网和安全组。

    您可以选择亚马逊云科技账户中的默认 VPC 。在“其他连接配置”部分,在“公开访问”选项里选择“是”,这样您就可以从自己的计算机连接数据库。接下来选择创建新的 VPC 安全组并为其命名。

    (点击放大)

    您还可以调整其他配置,包括备份、监控、维护和自动升级设置。本课程的示例只使用默认设置。

    点击“创建数据库”完成数据库创建。

    注意:创建数据库后,务必按照本课程最后一个模块中的说明清理 Amazon RDS 数据库实例。Amazon RDS 数据库运行期间,每小时都会向您收取 1 美元费用。

    (点击放大)

    在 Amazon RDS 为您准备基础设施及初始化您的数据库期间,您的数据库“状态”会显示为“正在创建”

    数据库准备完成后,“状态”会变更为“可用”

    (点击放大)
    (点击放大)

    “数据库标识符”栏中点击您的数据库名称即可查看数据库详细信息。此处详细信息中显示了“端点”属性。将该值保存下来,以便在之后的模块中连接至您的数据库时使用。

    (点击放大)

    在本模块中,您创建了一个 SQL Server 数据库,借助 DynamoDB,您可以将示例数据迁移至云原生的 NoSQL 数据库。在下一模块中,您将为 SQL Server 数据库加载样本数据,并为数据做好迁移至 DynamoDB 的准备。

  • 在本模块中,您将为 SQL Server 数据库加载样本数据,并使数据做好向 DynamoDB 迁移的准备。


    在 DynamoDB 等 NoSQL (非关系型)数据库中对数据进行建模与在 SQL Server 等关系数据库中建模不同。在使用 DynamoDB 时,您需要对数据进行反规范化处理并为访问模式设计表,而不是像在关系型数据库中那样为访问模式编写查询(Query)。

    使用 DynamoDB 进行数据建模的内容过于宽泛,因此本课程不会过多涉及。想了解更多相关信息,请参阅 DynamoDB 文档,包括最佳实践部分的关系型数据设计与 NoSQL (非关系型)数据设计的区别。此外,您还可以参阅使用 DynamoDB 进行数据建模教程

    此处将使用另一项教程中的示例作为数据模型。使用 Amazon DynamoDB 对游戏玩家数据建模介绍了如何对多人大逃杀游戏进行建模。在本课程中,您会将该模型作为关系型数据库实例,学习如何将其迁移至 DynamoDB 数据模型。在本示例中,我们不会深入介绍多人游戏模式。如果想更深入地了解 DynamoDB 数据模型,请先查看该教程。

    首先,为本次课程做好准备,请下载这份 .zip 压缩文件,文件中包含的 SQL 语句能使您的 SQL Server 做好迁移准备。.zip压缩文件中包含三个本课程中将会使用到的文件。

    下载 Azure Data Studio 客户端,以便与您的 SQL Server 数据库实例进行交互。您可以通过该客户端访问数据库并执行查询(Query)。

    启动 Azure Data Studio 并选择“创建连接”。输入上一模块中保存的 SQL Server 数据库端点以及创建数据库时设置的用户名及密码。点击“连接”

    (点击放大)

    连接后,选择“新查询”,在数据库中执行查询(Query)。

    (点击放大)

    此时会弹出查询窗口。在下载的.zip 压缩文件中找到 create_tables.sql 并复制粘贴其内容。文件中包含用于为多人大逃杀游戏创建数据库和表的 SQL 语句。

    将内容粘贴至查询窗口后,点击“运行”执行查询。

    (点击放大)

    接下来,将查询窗口中的内容替换为 insert_data.sql 文件中的内容。这些内容包含游戏样本数据,包括地图、用户、游戏以及用户-游戏映射。

    将内容粘贴至窗口后,点击“运行”执行查询(Query)并插入数据。

    (点击放大)

    读一读其中的数据,确保所有内容都已正确插入。

    在查询窗口中输入以下查询语句。

    SELECT games.game_id, maps.map_name as map, games.create_time, creator.username as creator, users.username FROM games JOIN maps ON games.map_id = maps.map_id JOIN users creator ON games.creator_id = creator.user_id JOIN user_games ON games.game_id = user_games.game_id JOIN users ON user_games.user_id = users.user_id WHERE games.game_id = '0ab37cf1-fc60-4d93-b72b-89335f759581'

    这将获取所有已加入特定游戏的用户。执行查询,结果应有34行。

    (点击放大)

    最后,请注意该查询使用的 SQL JOIN 数量。在 DynamoDB 等 NoSQL 数据库中,没有 JOIN 操作。随着您的 SQL Server 数据库不断扩展, JOIN 操作的性能会不断下降。

    DynamoDB 不使用 JOIN 操作,而是采用了不同的数据建模策略。在 DynamoDB 中为数据建模有许多不同之处,其中三个最主要的区别是:

    • 使用 DynamoDB 时,您需要对数据进行反规范化处理并为访问模式设计表,而不是像在关系型数据库中那样为访问模式编写查询。在本示例中,您将储存游戏记录中已加入的玩家数量。
    • 多个不同实体会被存放在一个表中,因此您能够使用单个请求检索多个异构类型,而无需使用 JOIN 操作。
    • 使用通用名称(如 PKSK )作为您的主键。这是因为您的单个表中包含多个不同实体类型,因此不同类型之间没有共有属性。

    有关 DynamoDB 数据建模的更多详细信息,请参阅教程使用 Amazon DynamoDB 对游戏玩家数据建模

    为使迁移更加简便,在您的 SQL Server 数据库中创建一些表。这些表能将数据重塑为 DynamoDB 所需的格式。您将使用这些表和 AWS DMS 将数据迁移至 DynamoDB。

    create_migration_tables.sql 文件中的内容粘贴到查询窗口中。此文件会创建四个不同的表,以便用于数据迁移。点击“运行”执行查询(Query)并创建表。

    (点击放大)

    为确认表已创建成功,在查询窗口中输入以下查询语句并点击“运行”

          SELECT * FROM dynamodb_open_games

    结果应如下所示。

    请注意,结果集中有 PK SK 列。这些值映射到多人游戏的 DynamoDB 数据模型的主键值。此外,请注意结果中包含地图名称,而非数据库中原始 Games 表中的地图 ID。这便是向 NoSQL 数据库迁移时的反规范化处理。您为迁移创建的四张表都与此类似。

    (点击放大)

    在本模块中,您已向 SQL Server 数据库加载样本数据并做好了将数据迁移至 DynamoDB 的准备。您使用根据其他 DynamoDB 教程创建的数据,了解了如何从关系型数据库向 DynamoDB 进行平台迁移。之后,您在数据库中创建了几张表,完成了将数据迁移至 DynamoDB 的准备工作。

    在下一个模块中,您将在 DynamoDB 中创建表,作为迁移的目标。

  • 在本模块中,您将创建一个 DynamoDB 表。该表将作为您从旧有的关系型数据库迁移时的目标。您还将创建一个 IAM 角色,以便 AWS DMS 访问您的 DynamoDB 表。


    首先,前往 Amazon RDS 控制面板。点击“创建表”创建一个新的表。

    (点击放大)

    您首先需要为表填写名称并设置主键。

    您正在参阅的教程使用的表名为 battle-royale 。这里的主键是 复合主键,其中有一个名为 PK 的分区键(partition key)和名为 SK 的排序键(sort key)。将这些值输入表创建向导。

    (click to zoom)

    表创建向导预置了一系列默认设置,本次学习使用默认设置即可。点击“创建表”完成创建。

    (点击放大)

    在创建表的过程中,“概述”标签页会显示表正在创建中。

    (点击放大)

    表创建完成后, DynamoDB 控制面板会显示表的详细信息,同时“表状态”显示为“活跃”

    (点击放大)

    控制面板中还显示了 DynamoDB 表的 Amazon Resource Name (ARN)。您需要将这个 ARN 保存下来,在创建 IAM 角色时使用。

    要创建 IAM 角色,请导航至 IAM 控制面板的角色页面。点击“创建角色”启动角色创建向导。

    (点击放大)

    选择可信实体类型。创建一个 AWS DMS 能够使用的服务角色。选择 “DMS” ,并点击“下一步”添加权限

    (点击放大)

    接下来,为您的角色添加权限。点击“创建策略”创建新的策略。

    (点击放大)

    点击 JSON 选项卡并将下列内容粘贴到编辑器中。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:CreateTable", "dynamodb:DescribeTable", "dynamodb:DeleteTable", "dynamodb:DeleteItem", "dynamodb:UpdateItem" ], "Resource": [ "<yourDynamoDBTableArn>", "arn:aws:dynamodb:*:*:table/awsdms_apply_exceptions", "arn:aws:dynamodb:*:*:table/awsdms_full_load_exceptions" ] }, { "Effect": "Allow", "Action": [ "dynamodb:ListTables" ], "Resource": "*" } ] }

    记得将 <yourDynamoDBTableArn> 替换为 DynamoDB 表中的 ARN 值。

    结果应如下所示。在“策略详细信息”中可以查看您的策略。

    (点击放大)

    为您的策略添加名称和描述,之后点击“创建策略”创建您的策略。

    (点击放大)

    回到 IAM 角色创建标签页。点击“刷新”按钮刷新账户中的 IAM 策略。找到您刚才设置的策略名并点选旁边的选框。

    点击“下一步”进入创建向导的下一个步骤。

    (点击放大)

    您可以跳过为 IAM 角色添加标签的步骤。点击“下一步”来到角色详细信息。

    为您的 IAM 角色填写名称和描述,之后点击“创建角色”

    (点击放大)

    IAM 角色创建完成后,就会出现在 IAM 控制面板的角色列表中。点击您的 IAM 角色即可查看角色详情。

    (点击放大)

    IAM 角色摘要中显示了角色的 ARN。将其保存下来,在之后的模块中配置 AWS DMS 端点时会用到。

    (点击放大)

    在本模块中,您创建了一个 DynamoDB 表,作为从旧有关系型数据库进行数据迁移的目标。您还创建了一个 IAM 角色,以便 AWS DMS 访问您的 DynamoDB 表。

    在下一模块中,您将在 AWS DMS 中创建一个复制实例。

  • 在本模块中,您将在 AWS DMS 中创建一个复制实例。

    AWS DMS 是一项服务,能够从现有数据库向完全托管的 AWS 数据库复制数据。复制实例是能在 AWS DMS 中托管复制任务的 Amazon EC2 实例。您将在之后的模块中设置复制任务。


    要创建复制实例,请前往 AWS DMS 控制面板的复制实例页面。点击“创建复制实例”启动复制实例创建向导。

    (点击放大)

    “复制实例设置”部分中填写复制实例名称和描述。之后选择您的实例类。本课程使用的示例数据较小,因此在实例类中选择“dms.t2.micro”

    然后为 AWS DMS 选择一个引擎版本。最后,为复制实例分配存储空间。

    (点击放大)

    继续在“复制实例设置”部分为您的复制实例选择一个 VPC。选择和 SQL Server 数据库相同的 VPC,以简化复制实例的网络访问。

    之后还可选择“可用区”和设置是否允许公开访问您的复制实例。保留这两个设置的默认选项。

    (点击放大)

    接下来,打开连接和安全性中的“高级设置”部分。在 “VPC 安全组”中,选择附加到 SQL Server 数据库的同一个安全组。这将允许复制实例访问您的 SQL Server 数据库实例。

    (点击放大)

    准备完毕后,点击“创建复制实例”,在AWS DMS 中创建您的复制实例。

    (点击放大)

    点击“创建复制实例”后,亚马逊云科技会为您准备复制实例。在亚马逊云科技准备和初始化您的实例期间,实例的“状态”显示为“正在创建”

    复制实例准备完成后,“状态”会变更为“可用”

    (点击放大)
    (点击放大)

    在等待复制实例准备完成的时候,前往 Amazon EC2 控制面板的安全组页面。您需要向安全组添加新规则,以允许复制实例访问您的数据库。

    安全组页面中,找到您附加在 SQL Server 数据库实例和复制实例的安全组,将其选中。

    (点击放大)

    点击安全组详细信息中的“编辑入站规则”

    (点击放大)

    您的安全组已有一条规则,允许您使用创建数据库时使用的 IP 地址访问您的 SQL Server 实例。点击“添加规则”,添加一条新规则。在“类型”一栏中选择 “MSSQL”。在“源”一栏中输入附加给 SQL 数据库和复制实例的安全组。

    结果应如下所示。

    点击“保存规则”以保存并更新您的安全组规则。

    复制实例显示可用、安全组规则更新完毕后,即可进入下一模块。

    (点击放大)

    在本模块中,您在 AWS DMS 中创建了一个复制实例。复制实例用于托管复制任务,将数据从旧有数据库复制到 DynamoDB 的云原生数据库。您还更新了安全组规则,以允许复制实例访问您的 SQL Server 数据库实例。

    在下一模块中,您将为源数据库和 AWS DMS 中的目标数据库创建端点。

  • 在本模块中,您将为 AWS DMS 中的复制任务创建源端点和目标端点。

    复制任务指使用 AWS DMS 将数据从一个数据库迁移至另一个数据库的任务。在创建复制任务之前,您必须为源数据库和目标数据库创建端点。端点描述了连接到数据库所需的连接地址、凭证和其他信息。


    首先,为您的源数据库创建端点。这是您在 Amazon RDS 中创建的 SQL Server 数据库。

    导航至 AWS DMS 控制面板中的端点页面。点击“创建端点”创建一个新的端点。

    (点击放大)

    在端点创建向导中,选择创建“源端点”。点选“选择 RDS 数据库实例”并在下拉菜单中选中您刚刚创建的 Amazon RDS 数据库。

    (点击放大)

    程序会自动为您填写大部分“端点配置”内容。您需要在页面底部的栏位中输入密码和数据库名称。

    (点击放大)

    在完成创建前,您应当测试连接以确保配置正确。点开“测试端点连接”,对连接进行测试。

    选中您想要使用的复制实例,之后点击“运行测试”。几秒钟后,您应当看到状态栏显示“连接成功”。这表明您已正确配置安全组和端点。点击“创建端点”保存端点信息。

    (点击放大)

    接下来,您需要为 DynamoDB 表创建目标端点。再次回到“端点”页面,点击“创建端点”

    (点击放大)

    “端点类型”一栏中选择“目标端点”

    (点击放大)

    “端点配置”下为您的端点填写名称。在“目标引擎”一栏中选择 “DynamoDB”。填入您在之前模块中创建的 IAM 角色的 ARN。

    (点击放大)

    请务必像创建源端点时一样测试端点连接。如果您正确配置了 IAM 角色,您应该会看到状态显示为“成功”。

    点击“创建端点”保存端点信息。

    (点击放大)

    在进入下一个模块前,您应该已经配置好两个端点:您的源 SQL Server 数据库端点和目标 DynamoDB 表端点。请务必测试端点连接,确保能成功连接两个端点。之后进入下一模块。


    在这一模块中,您创建了连接至数据库的端点。在下一模块中,您将使用这些端点创建复制任务,将数据从源数据库拷贝至目标数据库。

  • 在本模块中,您将在 AWS DMS 中创建一个复制任务。

    复制任务会将数据从源数据库迁移至目标数据库。在这里,您要将数据从旧有的关系型数据库转移至 DynamoDB 中的云原生 NoSQL 数据库。


    首先,导航至 AWS DMS 控制面板中的数据库迁移任务页面。点击“创建任务”创建一个新的复制任务。

    (点击放大)

    “任务配置”部分,为复制任务设置参数。首先为您的任务命名,并选择在之前的模块中创建的复制实例。之后选择现有数据库的源端点和 DynamoDB 表的目标端点。

    您还需要选择迁移类型。共有两种类型可选:

    1. “迁移现有数据”会一次性将数据从您的源数据库复制到目标数据库。
    2. “仅复制数据更改”会将源数据库中所有正在进行的操作复制到目标数据库。

    本教程的内容是将现有数据迁移至新的 DynamoDB 表,因此在迁移类型一栏中选择“迁移现有数据”

    (点击放大)

    跳过“任务设置”部分,将所有设置保留为默认值。

    “表映射”部分,向 AWS DMS 声明您想复制哪些表以及如何将它们映射到目标数据库。

    您需要将多个 SQL Server 表中的记录合并到单个 DynamoDB 表中。为此,请使用 JSON 配置文件进行表映射。在编辑模式中点击 “JSON 编辑器”,打开之前下载的.zip压缩文件中的 table_mappings.json 文件并将内容粘贴至其中。

    粘贴表映射后,点击“创建任务”,启动您的迁移任务。

    (点击放大)

    创建任务后,您的任务会显示在“数据库迁移任务”页面中,任务“状态”显示为“正在创建”

    创建任务并加载完成后,“状态”变更为“加载完成”

    (点击放大)
    (点击放大)

    返回您的 DynamoDB 表页面并将其选中。点击“项目”标签查看 DynamoDB 表的记录。

    (点击放大)

    您在之前的模块中运行 SQL 查询,在数据库中查看一局游戏中的用户。您可以在 DynamoDB 中进行同样的操作,验证是否能获得相同的结果。

    在 DynamoDB 数据模型中, Game 项目和所有 UserGameMapping 项目都有同样的分区键 GAME#<GameId>。您可以使用 DynamoDB 查询(DynamoDB Query)提取表示已加入游戏的用户的 Game 项目和 UserGameMapping 项目。

    点击下拉菜单,将“扫描(Scan)”改为“查询(Query)”。之后在分区键栏位中填入 GAME#0ab37cf1-fc60-4d93-b72b-89335f759581 并点击“开始搜索”

    结果应该返回35条记录: Game 项目和游戏中每个用户的 UserGameMapping 项目。

    (点击放大)

    查询是用来验证数据迁移是否成功的方法之一。在切换到新数据库前,请进行更多数据验证查询,比如前文所述的示例查询和对比记录数量,以确保所有数据均已传输。

    要对关系型数据库中的记录进行计数(COUNT),您可以使用以下查询来获取表中的总行数。

    SELECT count(*) FROM <table_name>;

    记得将 <table_name> 替换为表中的名称。

    在 DynamoDB 表中,您需要使用扫描(Scan)操作来读取表中的所有项目。以下 AWS CLI 命令显示了如何使用扫描并返回读取的项目的计数(COUNT)

    aws dynamodb scan \

    --table-name <table_name> \
    --select COUNT

    扫描操作是分页操作,在单个请求中只能读取 1 MB 的数据。如果迁移的表中包含的数据超过 1 MB,您需要进行多次请求才能获得准确计数。有关在 DynamoDB 中分页的更多信息,请参阅文档对结果进行分页

    您已经成功将数据迁移至 DynamoDB。表中的数据应该已经可以与使用 Amazon DynamoDB 对游戏玩家数据建模中的程序代码配合使用。


    在本模块中,您在 AWS DMS 中创建了一个复制任务,将现有数据从 SQL Server 迁移至 DynamoDB 中的 NoSQL 数据库。您验证了复制后的数据与源数据库中的数据是否匹配。

    在下一个模块中,您将完成迁移并清理之前创建的资源。

  • 如果您已按照本课程完成了所有操作,您应该已经使用 DynamoDB 创建了一个云原生的 NoSQL 数据库,一个包含样本数据的 SQL Server 数据库和一个用于将数据从源数据库迁移至新数据库的迁移任务。在最后的模块中,您将学习如何完成迁移并清理在本课程中创建的资源。

    完成初始迁移,将所有数据同步到新数据库后,即可将新数据库作为主数据库。将应用程序的代码修改为从新的数据库读取和写入。

    切换到使用主数据库并对结果有十足把握后,您需要删除 AWS DMS 基础设施。


    首先,停止并删除用于复制数据的数据库迁移任务。导航至 AWS DMS 控制面板中的数据库迁移任务页面。点击选中您想移除的任务并选择“删除”

    (点击放大)

    接下来,前往 AWS DMS 控制面板中的端点页面。选中您的源端点和目标端点,之后选择“删除”

    (点击放大)

    再前往 AWS DMS 控制面板的复制实例页面。如果您的复制实例未被用于其他复制任务,将其选中并选择“删除”

    (点击放大)

    接下来,删除作为源数据库示例的 SQL Server 数据库。前往 Amazon RDS 控制面板,选中您的 SQL Server 数据库并选择“删除”

    (点击放大)

    最后,您需要删除学习本课程时创建的 DynamoDB 表。前往 DynamoDB 控制面板,选中表,点击“删除”

    (点击放大)

    AWS DMS 还创建了一个用于跟踪异常的表,名称为awsdms_full_load_exceptions。同样删除此表。

    最后,您需要删除为 AWS DMS 进行迁移创建的 IAM 角色和策略。

    前往 IAM 控制面板中的角色页面。找到并选中您为 AWS DMS 创建的角色。点击“删除”

    (点击放大)

    之后前往 IAM 控制面板中的策略页面。点击“筛选依据”,在下拉菜单中选择“客户托管”

    (点击放大)

    在 IAM 控制面板的策略页面将 IAM 策略删除。

    (点击放大)

    在这一模块中,您学习了如何迁移应用程序,以使用新数据库,以及如何清理在本课程中创建的资源。

通过本课程,您学习了如何使用 DynamoDB 将旧有 Microsoft SQL Server 数据库迁移至云原生的 NoSQL 数据库,从关系型数据库转为 NoSQL 数据库时需要对数据模型进行修改。以及如何使用 AWS DMS 进行修改并自动执行迁移。