亚马逊AWS官方博客

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

1. 前言

AWS最近刚刚宣布了一项关于数据库迁移的新feature,支持Mongodb数据库作为源端,迁移到目标端Dynamodb中,这样可以使MongoDB的用户充分利用DynamoDB数据库提供的技术优势,譬如完全托管服务,高性能低延迟(毫秒级),精细化粒度控制等等。由于最近项目中涉及很多数据库迁移的事情,同时也对NOSQL数据库异构平台迁移非常感兴趣,写了这篇文档供大家参考。

2. DMS服务介绍

DMS作为数据迁移服务支持下面三种迁移类型:

  • 迁移源库中存在的数据到目标库
  • 迁移源库中存在的数据并且复制新增加的数据到目标库
  • 只复制新增加的数据库

数据迁移时源端和目标端设置

  • MongoDB作为源端

AWS DMS支持Mongodb作为源端的版本为2.6.x和3.0.x,MongoDB 作为一个基于文档存储的数据库,数据模式非常灵活,支持JSON和BJSON格式进行存储。当前AWS DMS 支持MongoDB作为源端以两种模式进行迁移,它们分别是文档模式和表模式。在文档模式中,需要设置参数extractDocID=true和nestingLevel=none,在复制时不支持collection的重命名。在表模式中需要启用表模式需要设置nestingLevel=one,另外在选择CDC时它不支持添加新的collection和重名collection。

  • DynamoDB作为目标端

使用Dynamodb作为目标端时需要配置partion key和Object mapping。

具体注意事项请参考官方文档链接:

http://docs.thinkwithwp.com/dms/latest/userguide/CHAP_Source.MongoDB.html

3. 配置步骤

3.1 安装Mongodb

安装Mongodb的方式有多种方法,可以选择Marketplace或者AWS提供的cloudformation以及手动下载Mongodb软件进行安装,我选择手动安装Mongodb2.6.12版本。

A、登录EC2,获取如下软件:

ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org_2.6.12_amd64.deb

ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-mongos_2.6.12_amd64.deb

ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-tools_2.6.12_amd64.deb

ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-server_2.6.12_amd64.deb

ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-shell_2.6.12_amd64.deb

B、安装软件包:

ubuntu@ip-172-31-60-214:~$ sudo dpkg -i mongodb-org*

C、创建数据目录和日志目录:

ubuntu@ip-172-31-60-214:~$ sudo mkdir /data /log

D、启动mongodb数据库服务:

ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –logpath /log/mongodb.log –smallfiles –oplogSize 50 –fork

打开mongodb的shell, 验证服务启动成功。

ubuntu@ip-172-31-60-214:~$ mongo

MongoDB shell version: 2.6.12

connecting to: test

如下图所示:

3.2 通过脚本生成数据

for (var i = 1; i <= 793308; i++) {

               db.testData.insert( { x : i , name: "MACLEAN" , name1:"MACLEAN", name2:"MACLEAN", name3:"MACLEAN"} )

db.contacts.insert( { name: "Amanda", status:

"Updated" } )

db.contacts.insert( { name: "tom", status: "Updated" } )

db.contacts.insert( { name: "jack", status: "Updated" } )

db.contacts.insert( { name: "jack1", status:    "Updated" } )

db.contacts.insert( { name: "steph", status:    "Updated" } )

3.3 验证数据生成

运行如下命令:

3.4配置mongodb的副本集

A、启动mongodb数据库

ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –replSet rs0 –logpath /log/mongodb.log –smallfiles –oplogSize 50 -fork

如下图:

B、登录到mongodb中,进行副本的初始化,如下图所示:

ubuntu@ip-172-31-60-214:~$ mongo localhost

MongoDB shell version: 2.6.12

connecting to: localhost

>

rs.initiate()

C、验证部署配置

> rs.conf()

D、创建管理员角色

rs0:PRIMARY> use admin

switched to db admin

rs0:PRIMARY> db.createUser(

…   {

…     user: “root”,

…     pwd: “rootpass”,

…     roles: [ { role: “root”, db: “admin” } ]

…   }

… )

如下图所示:

E、停止mongodb,然后重启mongodb:

ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –replSet rs0 –logpath /log/mongodb.log –smallfiles –oplogSize 50 -fork –auth

如下图所示:

至此,Mongodb的数据库准备工作完成。

3.5 使用global账号登录到DMS服务,如下图所示:

A、创建复制实例:

指定Name,Instance class,Allocated storage,VPC选择创建,如下图所示:

创建mongodb源端的Endpoint,输入Endpoint identifier,Source engine指定为mongodb,Servername为Mongodb数据库主机IP,Port,Authentication mode,username等信息,如下所示:

注意在高级设置中指定extraDocID=true;nestingLevel=none

点击test connection验证连接成功。

点击创建完成。

B、创建目标端DynamoDB的endpoint

在endpoint console中选择create endpoint,并输入信息:Endpoint identifier,Endpoint type为Target,Target engine为dynamodb,指定Service Aceess Role ARN,并在advanced中设置:extractDOcID=true;nestingLevel=none

如下图所示:

点击test connection,验证成功,选择create 完成创建。

此处主要角色的设置需要指定:dms-vpc-role,同时attached 3个policy,如下图所示:

endpoint创建完成,如下所示:

C、创建task

点击create task,输入如下信息:task name,source endpoint,target endpoint,migrate type,Enable loging,同时根据实际需求进行相应的任务设置。

创建table mappings,点击json tab,进行手动输入设置:

注意,json文件内容需要根据各自创建的表进行手动创建。

点击创建任务,任务创建完成。

D、验证数据导入成功

返回任务列表,选择table statistics,查看表的导入是否成功,如下图所示:

MongoDb记录成功导入到dynamodb中,选择log可以通过cloudwatch查看DMS导入过程的记录。

登录到DynamoDb中,发现表成功创建,并且导入成功,如下图:

至此整个利用DMS进行Mongodb到Dynamodb的数据库迁移完成。

关于如何设置Table mapping 请参阅官方文档:

http://docs.thinkwithwp.com/dms/latest/userguide/CHAP_Target.DynamoDB.html

附录

测试中我使用的Table Mapping json内容如下:

{

            "rules": [

                        {

                                    "rule-type": "selection",

                                    "rule-id": "1",

                                    "rule-name": "1",

                                    "object-locator": {

                                                "schema-name": "test",

                                                "table-name": "%"

                                    },

                                    "rule-action": "include"

                        },

            {

          "rule-type": "object-mapping",

          "rule-id": "2",

          "rule-name": "TransformToDDB",

          "rule-action": "map-record-to-record",

          "object-locator": {

            "schema-name": "test",

            "table-name": "contacts"

        },

        "target-table-name": "contacts",

        "mapping-parameters": {

        "partition-key-name": "id",

        "exclude-columns": [

        "_id"

        ],

        "attribute-mappings":[

          {

            "target-attribute-name": "id",

            "attribute-type":"scalar",

            "attribute-sub-type":"string",

            "value": "${_id}"

          }

        ]

        }

            },

            {

          "rule-type": "object-mapping",

          "rule-id": "3",

          "rule-name": "TransformToinventory",

          "rule-action": "map-record-to-record",

          "object-locator": {

            "schema-name": "test",

            "table-name": "inventory"

        },

        "target-table-name": "inventory",

        "mapping-parameters": {

        "partition-key-name": "id",

        "exclude-columns": [

        "_id"

        ],

        "attribute-mappings":[

          {

            "target-attribute-name": "id",

            "attribute-type":"scalar",

            "attribute-sub-type":"string",

            "value": "${_id}"

          }

        ]

        }

            },

            {

          "rule-type": "object-mapping",

          "rule-id": "2",

          "rule-name": "TransformToEC2test",

          "rule-action": "map-record-to-record",

          "object-locator": {

            "schema-name": "test",

            "table-name": "ec2Test"

        },

        "target-table-name": "ec2Test",

        "mapping-parameters": {

        "partition-key-name": "id",

        "exclude-columns": [

        "_id"

        ],

        "attribute-mappings":[

          {

            "target-attribute-name": "id",

            "attribute-type":"scalar",

            "attribute-sub-type":"string",

            "value": "${_id}"

          }

        ]

        }

            },

            {

          "rule-type": "object-mapping",

          "rule-id": "2",

          "rule-name": "TransformToDDB",

          "rule-action": "map-record-to-record",

          "object-locator": {

            "schema-name": "test",

            "table-name": "testData"

        },

        "target-table-name": "testData",

        "mapping-parameters": {

        "partition-key-name": "id",

        "exclude-columns": [

        "_id"

        ],

        "attribute-mappings":[

          {

            "target-attribute-name": "id",

            "attribute-type":"scalar",

            "attribute-sub-type":"string",

            "value": "${_id}"

          }

        ]

        }

            }

  ]

}

 

作者介绍

王友升

AWS解决方案架构师,拥有超过13年的IT从业经验,负责基于AWS的云计算方案架构咨询和设计,推广AWS云平台技术和各种解决方案。在加入AWS之前,曾在中地数码,浪潮,惠普等公司担任软件开发工程师,DBA和解决方案架构师。在服务器,存储,数据库优化方面拥有多年的经验,同时对大数据,Openstack及AI方面也进行一定的研究和积累。