亿级mongodb数据迁移

时间:2024-12-08 18:34:38

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