`
猫耳呀
  • 浏览: 167178 次
社区版块
存档分类
最新评论

如何将DynamoDB的数据增量迁移到表格存储

 
阅读更多

摘要: AWS 的 Amazon DynamoDB 和阿里云的表格存储 TableStore 都是完全托管的NoSQL数据库服务,提供快速的、可预期的性能,并且可以实现无缝扩展。本篇文章介绍了如何使用 Lambda 将 DynamoDB 的数据增量迁移到表格存储中。

Amazon DynamoDB是一个完全托管的NoSQL数据库服务,可以提供快速的、可预期的性能,并且可以实现无缝扩展。由于DynamoDB并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对外服务,也不会降低服务性能,一经推出就收到了广大AWS用户的欢迎。

同样,表格存储是构建在阿里云飞天分布式系统之上的分布式NoSQL数据库服务。作为同 DynamoDB 非常相似的 __云NoSQL数据库服务__,表格存储的自动负载均衡机制可以自动对表进行扩展,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。

表格存储可以使用户把操作和扩展分布式数据库的沉重负担,交给阿里云来处理,这样,用户就不需要担心硬件配置、磁盘故障、机器故障、软件安装和升级等工作,可以更专注到业务逻辑中去。

今天,就给大家介绍如何将DynamoDB的数据增量迁移到表格存储。

数据转换规则

表格存储支持的数据格式有:

  • String - 可为空,可为主键,为主键列时最大为 1 KB,为属性列时为2MB。
  • Integer - 64 bit,整型,可为主键,8 Bytes。
  • Binary - 二进制数据,可为空,可为主键,为主键列时最大为 1 KB,为属性列时为2MB。
  • Double - 64 bit,Double 类型,8 Bytes。
  • Boolean - True/False,布尔类型,1 Byte。

目前 DynamoDB 支持多种数据格式:

  • 标量类型 - 标量类型可准确地表示一个值。标量类型包括数字、字符串、二进制、布尔值和 null。
  • 文档类型 - 文档类型可表示具有嵌套属性的复杂结构 - 例如您将在 JSON 文档中找到的结构。文档类型包括列表和映射。
  • 集类型 - 集类型可表示多个标量值。集类型包括字符串集、数字集和二进制集。

由于DynamoDB支持文档型数据类型,我们需要将文档型转换为一个String类型或者Binary类型存储到表格存储中,在读取时需要反序列化成Json。

故,从DynamoDB迁移到表格存储时,我们做如下的数据转换:

DynamoDB类型 数据示例 TableStore对应类型
id (N) '123' Integer
level (N) '2.3' Double, 不能为主键
afea (NULL) TRUE String,空字符串
binary (B) 0x12315 binary
binary_set (BS) { 0x123, 0x111 } binary
bool (BOOL) TRUE boolean
list (L) [ { "S" : "a" }, { "N" : "1" }] string
map (M) { "key1" : { "S" : "value1" }} string
str (S) This is test! string
num_set (NS) { 1, 2 } string
str_set (SS) { "a", "b" } string

增量实现机制

我们使用DynamoDB的Stream数据流获取DynamoDB表中的增删改操作,将操作同步到表格存储中,为了避免环境搭建,将同步程序运行在Lambda 中,流程如下图:

使用Stream数据流中的'eventName'字段来判别数据的增删改操作:

  • "INSERT": 插入数据,对应PutRow
  • "MODIFY" : 修改数据

    • 如果OldImage 与 NewImage的key相同,则为更新数据,对应Update
    • 若OldImage的Key 数量大于 NewImage的Key数量, 则为删除数据,将两者差集的keys做删除,对应Delete
  • "REMOVE":删除数据,对应 DeleteRow

需要特别注意的是:

  1. 上述 Stream 中增删改操作转换行为符合业务的期望。
  2. 表格存储目前还不支持二级索引,故只能同步主表的数据。
  3. DynamoDB 中表的主键同TableStore中的主键保持一致,且数字类型的主键只能为整型。
  4. DynamoDB 对单个项目的大小限制为400KB,表格存储中单行虽然没有限制,但一次提交的数据量不能超过4MB。 DynamoDB限制项参考 及 TableStore 限制项参考
  5. 如果先进行全量数据迁移,则需要在全量迁移之前开启 Stream。由于 DynamoDB Stream 只能保存最近24小时数据,故全量数据需要在24小时内迁移完成,在全量迁移完成后才能开启 Lambda 的迁移任务。
  6. 数据需要保证最终一致性。增量数据在同步时,可能会有对全量数据的重复写入,比如 T0 时刻开启 Stream 并进行全量迁移,T1 时刻完成,那么 T0 到 T1 之间的时间段内的DynamoDB 数据操作会同步写入到表格存储中。

操作过程

1. 在DynamoDB中创建数据表

我们以表Source为例,主键为user_id(字符串类型),排序键为action_time(数字)。由于DynamoDB的预留设置会影响读写的并发,故需要注意预留的设置。

2. 开启source 表的Stream

Stream模式需要为: 新旧映像 - 新旧项目的映像

3. 转到Lambda的控制台,创建相关的数据同步函数

实例函数名称为:data-to-table, 运行语言选择为 Python 2.7,使用 lambda-dynamodb-execution-role的角色。

4.关联Lambda的事件源

点击事件源的DynamoDB图标,进行事件源配置,选择 source 数据表批处理大小先选择为10进行小批量验证,在实际运行过程中建议为100,由于表格存储的Batch操作最大为200条数据,故不能超过200。

5. 配置Lambda的函数。

点击 Lambda的函数图标,进行函数相关的配置。

由于tablestore需要依赖SDK及 protocolbuf等依赖包,我们按照创建部署程序包 (Python)的方式进行 SDK依赖安装及打包。

使用的函数zip包为:lambda_function.zip 点击下载 可以直接本地上传,也可以先上传到S3。

处理程序入口为默认的 lambda_function.lambda_handler

基本设置中需要将超时事件设置在1分钟以上(考虑到批量提交的延时及网络传输时间)。

6. 配置Lambda的运行变量

在数据导入时,需要 TableStore 实例名、AK等相关信息,我们可以使用一下两种方式:

  • 方案一(推荐):直接在Lambda 中配置相关的环境变量,如下图.
    使用 Lambda的环境变量将使得同一函数代码zip包能够灵活的支持不同的数据表,而不需要为每个数据源修改代码包中的配置文件。

参考:Lambda环境变量说明

  • 方案二: 也可以打开 lambda_function.zip 修改其中的example_config.py,再打包上传,或者上传之后在控制台上进行修改。

配置说明:

环境变量 必选 意义
OTS_ID 访问表格存储的AccessKeyId信息
OTS_SECRET 访问表格存储的AccessKeySecret信息
OTS_INSTANCE 导入的表格存储的实例名称
OTS_ENDPOINT 导入的表格存储的域名,如果不存在,则使用默认的实例公网域名
TABLE_NAME 导入的表格存储的表名
PRIMARY_KEY 导入的表格存储的表的主键信息,需要保证主键顺序,主键名称需要同源表保持一致

特别注意:

  1. 相同的变量名称,优先会从Lambda中变量配置中读取,如果不存在,则会从 example_config.py中读取。
  2. 由于AK信息代表这资源的访问权限,强烈建议使用只具有表格存储特定资源写权限的子账号的AK,避免AK泄露带来的风险,使用参考

7. 在表格存储中创建数据表。

表格存储控制台上创建数据表:__target__,主键为 user_id(字符串)和action_time(整型)。

8. 测试调试。

在lambda控制台上编辑事件源进行调试。

点击右上角的 配置测试事件,输入示例事件的json内容。
我们准备了两个示例的 Stream示例事件:

  1. test_data_put.json 模拟向DynamoDB中插入一条数据的事件,查看文件
  2. test_data_update.json 模拟向DynamoDB中更新一条数据的事件,查看文件
  3. test_data_update.json 模拟向DynamoDB中删除一条数据的事件,查看文件

我们将上述三个事件的内容依次保存为putdata、updatedata、deletedata。

保存之后,选择需要使用的事件,点击测试:

执行结果提示成功的话,则在表格存储的 target表中就可以读到如下的测试数据。

依次选择putdata、updatedata和deletedata,会发现表格存储中的数据也会随之更新和删除。

9.正式运行

测试通过之后,我们在DynamoDB中新写入一条数据,在表格存储中马上就可以读到这条数据,如下图。

10. 问题调查

Lambda 运行的日志都会写入到 CloudWatch 中,在 CloudWatch 选择对应的函数名,则可以实时查询到 Lambda 的运行状态。

代码解析

Lambda函数中,主要的代码逻辑为lambda_function.py 查看代码,其他则为表格存储SDK的依赖。lambda_function.py中主要包含了一下几个function:

  • def batch_write_row(client, put_row_items) - 将组合好的数据 Item (包括增删改)批量写到表格存储中
  • def get_primary_key(keys) – 根据变量PRIMARY_KEY 拿到源表和目的表的主键信息。
  • def generate_update_attribute(new_image, old_image, key_list) – 解析Stream中的Modify操作,是对部分属性列的更新还是删除了部分属性列。
  • def generate_attribute(new_image, key_list) – 获取单个Record中插入的属性列信息。
  • def get_tablestore_client() – 根据变量中的实例名、AK信息等初始化表格存储的客户端。
  • def lambda_handler(event, context) – Lambda的入口函数。

如果有更复杂的同步逻辑,也可以基于 lambda_function.py 进行修改。

lambda_function.py 中打印的状态日志没有区分 INFO 或者 ERROR,为了保证数据同步的一致性,还需要对日志进行处理,并监控运行状态或者使用 lambda 的错误处理机制保证对异常情况的容错处理。

 

原文链接

分享到:
评论

相关推荐

    DynamoDBtoCSV, 将DynamoDB数据转储为CSV文件.zip

    DynamoDBtoCSV, 将DynamoDB数据转储为CSV文件 AWS DynamoDBtoCSV 这个应用程序将把DynamoDB表的内容导出到 CSV ( 逗号分隔值) 输出中。 你需要做的就是使用AWS凭据和区域更新 config.json 。输出是逗号分隔的,每个...

    DynamoDB开发人员指南

    在从传统的关系型数据库(SQL)迁移到NoSQL数据库(如DynamoDB)时,开发者需要理解SQL和NoSQL的不同之处,并根据自己的需求和应用场景来选择合适的数据存储方案。DynamoDB提供了一种从关系型数据库迁移到NoSQL的...

    DynamoDBtoCSV:将DynamoDB数据转储到CSV文件中

    AWS DynamoDBtoCSV 此应用程序会将DynamoDB表的内容导出到CSV(逗号分隔值)输出中。 您需要做的就是使用您的AWS凭证和区域更新config.json 。 输出以逗号分隔,每个字段都用双引号(“)引起来。数据中的双引号以...

    AWS数据库服务与数据迁移概述.pdf

    同时,AWS还提供了数据迁移服务,帮助用户将数据迁移到云端,实现数据的自由和创新。 1. AWS数据库服务 AWS提供了多种数据库服务,包括: * Amazon Aurora:一种高性能的关系数据库,兼容MySQL和PostgreSQL。 * ...

    dynamodb-migration:使用DynamoDB流在表之间迁移数据的示例存储库

    sam deploy --stack-name dynamodb-migration-example --capabilities CAPABILITY_IAM填充数据将任意数量的项目添加到OriginalBooksTable 。每个项目至少应包含以下属性: { " isbn " : " some-isbn " , " author ...

    Laravel开发-dynamodb

    laravel-dynamodb库由Baopham创建并维护,它将DynamoDB的功能无缝地融入到Laravel的Eloquent ORM(对象关系映射)中。这个库允许开发者使用Eloquent模型与DynamoDB交互,就像与传统的关系型数据库如MySQL一样。这...

    AWSDynamoDB数据实时迁移TcaplusDB解决方案.docx

    本文档旨在介绍如何实现从AWS DynamoDB到TcaplusDB的实时数据迁移。TcaplusDB是由腾讯推出的NoSQL数据库服务,专为游戏场景设计,并致力于提供面向全球用户的高品质云存储解决方案。该服务不仅提供了高性能、低成本...

    dynamodb-dg.pdf

    DynamoDB官方文档,入门文档。学习dynamoDB的工具,开发人员指南,API。 Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,提供快速且...DynamoDB 还提供静态加密,这消除了在保护敏感数据时涉及的操作负担和复杂性

    Laravel开发-laravel-dynamodb-session-driver

    完成以上步骤后,Laravel将使用DynamoDB存储和检索会话数据。这使得在高并发和分布式环境中,会话数据能够被可靠且高效地管理。 总之,Laravel开发中的DynamoDB会话驱动是一个强大的工具,特别是在AWS云环境中运行...

    dynamodb-gsg

    写入项目(Write Items): 可以通过API调用将数据项写入DynamoDB表中。支持一次写入单个或多个项目。 d. 读取项目(Read Items): 使用主键读取一个项目或者读取多个项目的信息。 e. 查询和扫描(Query and Scan...

    dynamodb-migrate:dynamodb的迁移框架

    dynamodb的迁移框架 设置 为AWS_DYNAMODB_EN​​DPOINT分配DynamoDB URL。 对于本地,设置http://localhost:8000 测试 开始运行本地dynamo-db npm测试 用法 在项目根目录中创建dynamo-migrations文件夹。 放置以...

    dynamo-data-formatter:用于格式化要导入DynamoDB的数据的工具

    为了将数据导入Dynamo,AWS要求格式化数据,从而使导入过程不是最直观的。 如果要从另一个现有Dynamo表导出数据,则该数据已经采用这种奇怪的,控制字符的格式,但是通常并非如此。 您可能想将一堆新数据(例如从...

    Java_DynamoDB例子.zip

    2. **插入数据**:展示如何使用`PutItemRequest`将数据项插入到DynamoDB表中。 3. **查询数据**:通过主键或者全局二级索引获取特定数据项,可能包括`GetItemRequest`和`ScanRequest`的使用。 4. **更新数据**:...

    spark-dynamodb:[WIP] Spark-DynamoDB 数据源 API 实现

    Spark-DynamoDB是Apache Spark与Amazon DynamoDB之间的一个数据源接口实现,...了解这些知识点对于在Spark环境中有效地利用DynamoDB存储和处理大规模数据至关重要。在实际使用中,应充分考虑性能、成本和安全性等因素。

    serverless-dynamodb-local:无服务器Dynamodb本地插件-允许为无服务器本地运行dynamodb

    无服务器dynamodb本地 该插件需要 无服务器@ ^ 1 Java Runtime Engine(JRE)版本6.x或更高版本 产品特点 在本地安装DynamoDB 使用支持的所有参数(例如端口,inMemory... 启动DynamoDB Local并迁移(DynamoDB将处理

    DynamoDB基本操作

    本篇将深入讲解DynamoDB的基本操作,包括数据模型、读写操作、索引、查询与扫描、以及如何管理和优化性能。 一、DynamoDB数据模型 DynamoDB的数据模型基于键值对和文档存储,每个表都由一个主键定义,主键可以是...

    DynamoDB文件SDKDynamoDBDocumentSDK.zip

    JS 数据类型,如 string 和 number 可以直接传送到 DynamoDB 需求中;同样,数据类型不会被打包。示例代码:// Basic Client creationAWS.config.update({ /* ...your config... */ }); docClient = new...

    prometheus-dynamodb-adapter:Dynamodb远程存储适配器,用于Prometheus时间序列

    Prometheus通过HTTP POST请求将时间序列数据发送到远程存储,适配器需要解析这些请求并将数据转化为DynamoDB可接受的格式。 2. **DynamoDB数据模型**:理解DynamoDB的数据模型至关重要。由于DynamoDB是一个键值和...

    Laravel开发-dynamodb .zip.zip

    - DynamoDB 支持多种数据类型,如字符串、数字、布尔值、二进制数据、集合(Set 类型)以及嵌套的 JSON 对象(Map 类型)。 - 在 Laravel 应用中,需要将这些数据类型适配为 PHP 类型,以便在 Eloquent ORM 中使用...

    AWS官方文档:DynamoDB ElasticCache RDS RedShift SimpleDB

    在AWS(Amazon Web Services)的云服务矩阵中,DynamoDB、ElasticCache、RDS(Relational Database Service)以及RedShift和SimpleDB是五个非常关键的数据存储和管理服务,它们各自针对不同的数据处理场景和需求。...

Global site tag (gtag.js) - Google Analytics