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

2018 年 5 月 19 日 云栖社区

云栖君导读: 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的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,再打包上传,或者上传之后在控制台上进行修改。



配置说明:



特别注意:


  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 的错误处理机制保证对异常情况的容错处理。


end


阿里研究员、饿了么CTO等10位技术大咖倾囊相授:全方位解读研发效能提升之道!

吴恩达(Andrew Ng)新书给出的七点建议!附新书下载链接

阿里技术专家带你使用Spring框架快速搭建Web工程项目

叮!您收到一份超值Java基础入门资料!

还在找什么,JavaScript的异步编程解决方案全在这里了

更多精彩


登录查看更多
0

相关内容

表格存储(Table Store)是构建在阿里云飞天分布式系统之上的NoSQL数据存储服务,提供海量结构化数据的存储和实时访问。 表格存储以实例和表的形式组织数据,通过数据分片和负载均衡技术,实现规模上的无缝扩展。

应用通过调用 表格存储 API / SDK 或者操作管理控制台来使用 表格存储服务。

地址: 表格存储_海量数据存储-阿里云
【干货书】现代数据平台架构,636页pdf
专知会员服务
257+阅读 · 2020年6月15日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
118+阅读 · 2020年5月10日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
108+阅读 · 2020年5月3日
轻量级神经网络架构综述
专知会员服务
97+阅读 · 2020年4月29日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
70+阅读 · 2020年1月17日
【大规模数据系统,552页ppt】Large-scale Data Systems
专知会员服务
61+阅读 · 2019年12月21日
社区分享|如何让模型在生产环境上推理得更快
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
如何做数据治理?
智能交通技术
18+阅读 · 2019年4月20日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
五步帮你实现用户画像的数据加工
云栖社区
6+阅读 · 2018年2月4日
【知识图谱】如何构建知识图谱
产业智能官
134+阅读 · 2017年9月19日
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Arxiv
10+阅读 · 2020年4月5日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
4+阅读 · 2018年4月29日
Arxiv
12+阅读 · 2018年1月11日
VIP会员
相关VIP内容
相关资讯
社区分享|如何让模型在生产环境上推理得更快
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
如何做数据治理?
智能交通技术
18+阅读 · 2019年4月20日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
五步帮你实现用户画像的数据加工
云栖社区
6+阅读 · 2018年2月4日
【知识图谱】如何构建知识图谱
产业智能官
134+阅读 · 2017年9月19日
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Top
微信扫码咨询专知VIP会员