随着微服务架构的发展,越来越多的组织选择使用专用数据库。企业在选择合适的云服务和解决方案,以及迁移计划时,常常需要指导。在异构数据库迁移过程中,遇到的挑战之一是将自管理的 SQL Server 的传统表和列属性重构到 Amazon DynamoDB 的访问模式。
迁移到 DynamoDB 主要的动机是降低成本、简化操作并在规模上优化性能。DynamoDB的无服务器架构可以通过按需付费、零扩展及无需前期成本等能力来节省资源,从而支持企业的增长与客户价值提升。在操作层面,摆脱了资源扩展、维护窗口和重大版本升级等问题,可以节省大量的运营时间,从而消除不必要的重复劳动。
每个应用程序都有特定的需求模式以满足业务用例。不论是 NoSQL、传统 SQL (RDBMS) 还是两者结合,应用程序在与数据库服务器交互时所承担的工作负载主要分为读取或写入。在本文中,我们将讨论更强调写入的访问模式,介绍如何将传统 SQLServer 表(关系型)成功迁移至 DynamoDB(非关系型),适用于微服务应用,使用 AWS DMS 进行支持。
任何想要将小型或大型单体表迁移到 DynamoDB 的微服务应用都可以采用此方案。
我们的解决方案包括在 Amazon Elastic Compute Cloud(Amazon EC2)上创建的自管理 SQL Server上使用的参照表。该参照表通过分析数据访问模式和在 DynamoDB 中执行属性映射而构建。确定设计模式后,我们为 DynamoDB表提供合适的主键和排序键以映射参照表。然后使用 AWS DMS 从映射到 SQL Server 中此参照表的源端点迁移数据,并设置连续复制。
以下图表展示了系统架构。
删除)
解决方案工作流程包含以下步骤:
我们使用 存储 SQL 凭证在 AWS DMS 中,并利用 监控 AWSDMS 任务。
实施解决方案的步骤如下:
在跟随本文之前,您需要具备以下前提条件:
由于此文探讨了从 SQL Server (RDBMS) 到 DynamoDB (NoSQL) 的访问模式和属性映射,因此需要对 和设计模式有基础的了解。此外,还推荐了解 AWS DMS 相关的信息,例如: 和 。
完成以下步骤以配置 DynamoDB 的 IAM 策略和角色:
`json { "Version": "2012-10-17", "Statement": 创建 DynamoDB 表。我们将表命名为 DDB_StatusHistory_Logs,并将 PK 和 SK定义为分区键和排序键的属性名称。
bash Amazon DynamoDB create-table \ --table-name DDB_StatusHistory_Logs \ --attribute-definitions \ AttributeName=PK,AttributeType=S \ AttributeName=SK,AttributeType=S \ --key-schema \ AttributeName=PK,KeyType=HASH \ AttributeName=SK,KeyType=RANGE \ --provisioned-throughput \ ReadCapacityUnits=25,WriteCapacityUnits=25 \ --table-class STANDARD
运行命令后,等待表创建完成。您可以通过 AWS CLI 验证 DynamoDB 表是否已创建。
删除)
在本节中,我们将走过配置 SQL Server 表映射的步骤。我们创建源和中转 SQL 表,为测试填充源表,创建一次性加载中转表的脚本,以及创建 SQL表的 INSERT 触发器。
为了我们的参考示例,我们有两个 SQL Server 表来执行迁移。以下代码创建一个新的数据库 dmsload
。我们创建源表
tbl_StatusHistory_log
,作为 AWS DMS 加载的基础数据,并创建中转表
DDB_StatusHistory_DMSLoad
,作为 AWS DMS 映射 DynamoDB 中定义的关键属性的参照表。
USE dmsload GO CREATE TABLE NOT NULL,
\[Usr_ID\] \[int\] NOT NULL,
\[account_id\] \[varchar\]\(40\) NOT NULL,
\[silo_id\] \[int\] NOT NULL,
\[status_code\] \[varchar\]\(12\) NOT NULL,
\[status_desc\] \[varchar\]\(250\) NOT NULL,
\[status_date\] \[datetime\] NOT NULL,
\[reason_code\] \[varchar\]\(12\) NULL,
\[reason_desc\] \[varchar\]\(250\) NULL,
\[reason_date\] \[datetime\] NULL,
\[update_date\] \[datetime\] NOT NULL,
\[username\] \[varchar\]\(15\) NOT NULL
CONSTRAINT \[PK_tbl_StatusHistory_log\] PRIMARY KEY CLUSTERED
\(
\[RowID\] ASC
\)WITH \(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY =
OFF\) ON \ NOTNULL,
\[SK\] \[varchar\]\(50\) NOT NULL,
\[GSI-PK\] \[varchar\]\(50\) NOT NULL,
\[SRC\] \[varchar\]\(5\) NOT NULL,
\[account_id\] \[varchar\]\(40\) NOT NULL,
\[status_code\] \[varchar\]\(12\) NOT NULL,
\[status-desc\] \[varchar\]\(250\) NOT NULL,
\[status-date\] \[datetime\] NOT NULL,
\[reason-note\] \[varchar\]\(12\) NULL,
\[reason-desc\] \[varchar\]\(250\) NULL,
\[reason-date\] \[datetime\] NULL,
\[update-date\] \[datetime\] NOT NULL,
\[username\] \[varchar\]\(15\) NOT NULL
CONSTRAINT \[PK_DDB_StatusHistory_DMSLoad\] PRIMARY KEY CLUSTERED
\(
\[PK\] ASC,
\[SK\] ASC
\)WITH \(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY =
OFF\) ON \[PRIMARY\]) ON [PRIMARY] GO ```
因为中转表作为 DynamoDB 的数据源,正常属性从基础表复制到中转表。`PK`、`SK` 和 `GSI-PK` 是在 DynamoDB上形成大量访问模式的关键列。以下脚本演示了中转表的数据加载。
### 为测试填充源表
使用以下代码来填充源表 (`tbl_StatusHistory_log`) 的测试数据:
```sql use dmsload go Insert into dbo.[tbl_StatusHistory_log]
(Usr_ID,account_id,silo_id,status_code,status_desc,status_date,reason_code,reason_desc,reason_date,update_date,username)
values (101,'123321456','200',1,'claim initiated',getdate()-1,'RC200','claimfrom the stockbacklog',getdate()-1,getdate(),'KJ')
,(101,'123321456','300',1,'claim processed',getdate()-1,'RC300','claiminitiated
Leave a Reply