mongo归档到PG流程分析

129 阅读1分钟

可以有多个思路

方案一:

执行一个job,定时每天凌晨「业务低峰期」开始执行,从mongo查询,写入的PG,最后从mongo删除。

方案二:

业务上双写,mongo和PG双写,启动定时任务清理mongo数据即可,数据准确性高。

方案三:

可以通过ETL工具实时采集openlog同步到PG,启动定时任务删除mongo

给mongodb 时间字段加索引 每次查询10w条数据,按时间升序排,limit 100000 等于走索引查询第一页(查询三个月之前的条件不赘述,忽略) 一次性查10w条 ,partion 2000转List<List<>>, 放redis ,先进先出,RPUSH

  while(true){
  1.查询redis  pageList
	  if(pageList数组不为空){
		查询数据是否在pg存在 (因为 pg库插入成功了,那么就一定删除成功了, 可以查询mongo不存在,  或者pg库直接查询报DuplicateKeyException )
		if(已存在){
		删除redis
		continue;
		}
		执行 handle(pageList)
		continue;
	  }
 2.走索引查询mongo第一页  pageList
	if(pageList数组不为空){
		执行 handle(pageList)
		continue;
	}
   break;
  }
 
  public void handle(pageList){
  
	1.数据保存redis

	2.开启事务   
				插入pg  
			   (子线程删除mongodb  且返回成功与否, 失败结束)  不用子线程可以保存事务点   
	  提交事务          (tip: 当插入 和 删除 都执行成功时, 事务即将提交的时候,提交失败了,会导致数据丢失)
	  
	3.删除redis       (tip: 上面执行都成功了, 删除redis可能失败)
  }