一、为什么要迁移至 MongoDB¶
1.1 MongoDB数据库定位¶
- OLTP /OLAP 数据库
- 原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)
- 优点:横向扩展能力,数据量或并发量增加时候架构可以自动扩展
- 优点:灵活模型,适合迭代开发,数据模型多变场景
- 优点:JSON 数据结构,适合微服务/REST API
1.2 基于功能选择 MongoDB¶
| MonogDB | 关系型数据库 | |
|---|---|---|
| 亿级以上数据量 | 轻松支持 | 分库分表 |
| 灵活表结构 | 轻松支持 | Entity Key/Value表,关联查询比较痛苦 |
| 高并发读 | 轻松支持 | 需要优化 |
| 高并发写 | 轻松支持 | 需要优化 |
| 跨地区集群 | 轻松支持 | 需要定制方案 |
| 分片集群 | 轻松支持 | 需要中间件 |
| 地理位置查询 | 比较完整的地理位置 | pg还可以,其他数据库略麻烦 |
| 聚合计算 | 轻松支持 | 使用group by等,能力受限 |
| 异构数据 | 轻松支持 | 使用EKV属性表 |
| 大宽表 | 轻松支持 | 性能受限 |
1.3 基于场景选择 MongoDB¶

二、迁移痛点¶
关系型到关系型 – 相对简单
- Oracle -> MySQL, Oracle – PostgreSQL
关系型到文档型 – 相对复杂
- Oracle -> MongoDB
需要考虑:
- 总体架构(从单体式到分布式)
- 模式转换(从关系模型到文档模型)
- SQL 语句 /存储过程 /JDBC /ORM
- 数据迁移(如何处理已有数据?)
2.1 单点到分布式¶

2.2 模式转换¶

2.3 迁移主流程¶

RDBMS:
- 存储过程
- 运维工具、脚本
- 权限设置
- 数据库监控备份及恢复
Storage:
- 典型的关系型数据库部署在 SAN 上
- MongoDB支持 SAN, 但是使用本地存储
- 可以最大化的提高性能
JDBC:
MongoDB 没有原生态 JDBC, 而是采用自带的驱动程序:
- 自带连接池管理
- 事务支持
SQL/RS:
MongoDB 不支持SQL的增删改,结果集也不是 ResultSet
等..
三、DBA主要关注 数据迁移¶
3.1 迁移方式¶
- 数据库导出+导入
- 批量同步工具
- 实时同步工具
- 应用主导迁移
3.2 各种迁移方式的特点¶
1、数据库导出导入
步骤:
- 停止现有的基于 RDBMS 的应用
- 使用 RDBMS 的数据库导出工具,将数据库表导出到 CSV 或者 JSON(如 mysqldump)
- 使用 mongoimport 将 CSV 或者 JSON 文件导入 MongoDB 数据库
- 启动新的 MongoDB 应用
备注:
- 适用于一次性数据迁移
- 需要应用/数据库下线,较⻓的下线时间
2、批量同步
步骤:
- 安装同步工具(如 Kettle /Talend) //它们都是开源的elk工具。Talend:有 GUI 图形界面但是以 Eclipse 的插件方式提供。Kettle:有非常容易使用的 GUI,出现问题可以到社区咨询。
- 创建输入源(关系型数据库)
- 创建输出源(MongoDB)
- 编辑数据同步任务
- 执行
备注:
- 适用批量同步,定期更新, 特别是每晚跑批的场景
- 支持基于时间戳的增量同步,需要源表有合适的时间戳支持
- 对源库有较明显的性能影响,不宜频繁查询
- 不支持实时同步
3、实时同步
步骤:
- 安装实时同步工具(如Informatica /Tapdata) //Tapdata 是一款基于DaaS架构,专注于面向 OLTP 业务提供数据服务的企业级实时数据服务平台,通过对异构数据库实时同步,打通企业数据孤岛,统一管理企业数据
- 创建输入源(关系型数据库)
- 创建输出源(MongoDB)
- 编辑实时数据同步任务
- 执行
备注:
- 基于源库的日志文件解析机制,可以实现秒级数据的同步
- 对源库性能影响较小
- 可以支持应用的无缝迁移
4、应用主导迁移
步骤:
(1)升级已有应用支持 MongoDB (2)数据插入请求直接进入 MongoDB (3)数据查询和更新请求首先定向到 MongoDB (4)如果记录不存在,从 RDBMS 读出来并写入到 MongoDB (5)重复步骤3 (6)当步骤4在限定时间段(一星期、一个月)没有被调用,认为迁移完成
备注:
- 需要研发团队配合 ,有一定开发和测试量
- 为保证不遗漏数据,仍然先要执行一次批量同步