亿级mongodb数据迁移
1. 预先准备有效数据单号池,通过单号拉取数据处理
单号表默认为1
01 使用findAndModify 更新单号表状态为 2 读取单号 循环读取100 条
02 通过运单号批量查询 Aladin_WayBillStatus 表 获取数据
03 拼接 新增 SQL语句
04 批量提交给 Hbase
05 批量更新 单号表 状态 为 3
方式优点
简单粗暴,开发简单 不超过200行代码,应为findAndModify 的原子性可以部署N个节点。
方式缺点
执行效率不高,并且提升优化空间几乎没有,使用多线程获取单号反而会更加耗时。
执行效率得看获取数据的表的承受能力。
对现有数据库照成压力
2.预支时间段表,通过时间段刷数据。
01 使用findAndModify 随机获取一个时段
02 通过时间段拉取一批数据
03 拼接 新增 SQL语句
04 批量提交给 Hbase
05 批量更新 时间段表 状态 为 3
方式优点
效率会比方式01 提高不少。
由于findAndModify 可以多节点部署。
方式缺点
每次时间段获取的数据量都是不可控的,业务高峰期时间段数据量可能非常大,业务低峰期数据量非常小,时间段生成规则会非常麻烦
对现有数据库照成压力
3.通过mongodb查询游标扫描数据。
find查询默认是从最旧数据开始。
_id 可以使用 $gt 查询 _id是有序的。
public void test_2(ObjectId o) { DBCursor s; if (o == null) { s = mt.getCollection("orderid").find(); } else { DBObject lisi = new BasicDBObject(); lisi.put("_id", new BasicDBObject("$gt", o)); s = mt.getCollection("orderid").find(lisi); } try { while (s.hasNext()) { DBObject item = s.next(); o = (ObjectId) item.get("_id"); String me = ((BasicDBObject) item).toJson(); mq.send(new Message("mgtomq", me.getBytes(RemotingHelper.DEFAULT_CHARSET))); System.out.println(o); } } catch (Exception e) { test_2(o); } }
方式优点:
不会对数据库照成太大压力。
读取的数据也是从老到新的数据。
方式缺点:
无法部署多个节点,获取数据和处理数据一起处理效率不高。
解决方式: 通过消息中间件解耦,读取数据,生产消息,处理数据设置每次100条消费消息。
这种读取数据方式也是 datex 使用的,处理方式不通,但是想法差不多。
如果不需要对数据进行处理,可以直接使用 datex