首页 > 数据库 > > 如何将DynamoDB的数据增量迁移到表格存储
Amazon DynamoDB是一个完全托管的NoSQL数据库服务,可以提供快速的、可预期的性能,并且可以实现无缝扩展。由于DynamoDB并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对外服务,也不会降低服务性能,一经推出就收到了广大AWS用户的欢迎。
同样,表格存储是构建在阿里云飞天分布式系统之上的分布式NoSQL数据库服务。作为同 DynamoDB 非常相似的 __云NoSQL数据库服务__,表格存储的自动负载均衡机制可以自动对表进行扩展,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。
表格存储可以使用户把操作和扩展分布式数据库的沉重负担,交给阿里云来处理,这样,用户就不需要担心硬件配置、磁盘故障、机器故障、软件安装和升级等工作,可以更专注到业务逻辑中去。
今天,就给大家介绍如何将DynamoDB的数据增量迁移到表格存储。
表格存储支持的数据格式有:
目前 DynamoDB 支持多种数据格式:
由于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'字段来判别数据的增删改操作:
PutRow "MODIFY" : 修改数据
Update Delete DeleteRow 需要特别注意的是:
我们以表Source为例,主键为user_id(字符串类型),排序键为action_time(数字)。由于DynamoDB的预留设置会影响读写的并发,故需要注意预留的设置。
Stream模式需要为: 新旧映像 - 新旧项目的映像
实例函数名称为:data-to-table, 运行语言选择为 Python 2.7,使用 lambda-dynamodb-execution-role的角色。
点击事件源的DynamoDB图标,进行事件源配置,选择 source 数据表批处理大小先选择为10进行小批量验证,在实际运行过程中建议为100,由于表格存储的Batch操作最大为200条数据,故不能超过200。
点击 Lambda的函数图标,进行函数相关的配置。
由于tablestore需要依赖SDK及 protocolbuf等依赖包,我们按照创建部署程序包 (Python)的方式进行 SDK依赖安装及打包。
使用的函数zip包为:lambda_function.zip 点击下载 可以直接本地上传,也可以先上传到S3。
处理程序入口为默认的 lambda_function.lambda_handler
基本设置中需要将超时事件设置在1分钟以上(考虑到批量提交的延时及网络传输时间)。
在数据导入时,需要 TableStore 实例名、AK等相关信息,我们可以使用一下两种方式:
参考:Lambda环境变量说明
配置说明:
| 环境变量 | 必选 | 意义 |
|---|---|---|
| OTS_ID | 是 | 访问表格存储的AccessKeyId信息 |
| OTS_SECRET | 是 | 访问表格存储的AccessKeySecret信息 |
| OTS_INSTANCE | 是 | 导入的表格存储的实例名称 |
| OTS_ENDPOINT | 否 | 导入的表格存储的域名,如果不存在,则使用默认的实例公网域名 |
| TABLE_NAME | 是 | 导入的表格存储的表名 |
| PRIMARY_KEY | 是 | 导入的表格存储的表的主键信息,需要保证主键顺序,主键名称需要同源表保持一致 |
特别注意:
在表格存储控制台上创建数据表:__target__,主键为 user_id(字符串)和action_time(整型)。
在lambda控制台上编辑事件源进行调试。
点击右上角的 配置测试事件,输入示例事件的json内容。
我们准备了两个示例的 Stream示例事件:
我们将上述三个事件的内容依次保存为putdata、updatedata、deletedata。
保存之后,选择需要使用的事件,点击测试:
执行结果提示成功的话,则在表格存储的 target表中就可以读到如下的测试数据。
依次选择putdata、updatedata和deletedata,会发现表格存储中的数据也会随之更新和删除。
测试通过之后,我们在DynamoDB中新写入一条数据,在表格存储中马上就可以读到这条数据,如下图。
Lambda 运行的日志都会写入到 CloudWatch 中,在 CloudWatch 选择对应的函数名,则可以实时查询到 Lambda 的运行状态。
Lambda函数中,主要的代码逻辑为lambda_function.py 查看代码,其他则为表格存储SDK的依赖。lambda_function.py中主要包含了一下几个function:
如果有更复杂的同步逻辑,也可以基于 lambda_function.py 进行修改。
lambda_function.py 中打印的状态日志没有区分 INFO 或者 ERROR,为了保证数据同步的一致性,还需要对日志进行处理,并监控运行状态或者使用 lambda 的错误处理机制保证对异常情况的容错处理。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000523/viewspace-3150262/ ,如需转载,请注明出处,否则将追究法律责任。