简述
最近做的积分系统二期要上线了,在第一期的时候仅考虑到了mysql分表,未引入mongoDB,因而在在第二期的时候引入Mongo,除了程序中要多写(同时写mysql,Mongodb)之外,还需要考虑到历史数据的迁移(拷贝)问题。
方案制定
经查发现:线上mysql数据问题接近200W,平均每日新增3~4W条。压力和数据量都不算大,所以决定直接用脚本进行迁移。
因为线上服务不会停,所以在迁移数据时,系统仍会不断有新增数据,那么如果处理这部分的新增数据也是一个问题。 针对这个问题解决办法比较多,但是主要思想都是数据分段。比如:
以时间维度分段,以某个时间为截点timeA,先迁移这部分数据,然后系统上后再导入timeA至上线时这部分的数据,这个办法有个弊端,时间精准性很难把握,你很难记录系统上线的时间timeB. 当然有个办法就是等系统上线之后,去mongoDB中查询第一条记录插入的时间,以此做为timeB的值,但是这个做法仍不是比较好的解决办法。如果QPS很低,迟迟没有记录插入,那么你只能等,如果QPS过高,则可能同一秒的时候有些数据仍没有写进mongoDB,只写入了mysql,以此时间为timeB的值,则可能会漏掉记录。
以唯一键分段比如id,比如导出数据时记录每个表导出记录的id值。然后采用跟上面的思路一样,进行2次分批导入,缺点仍然是麻烦。
所以针对这个问题,结合我们业务访问量以及数据量制定的方案就是:先重叠数据,再去重。即让线上的数据和迁移的数据产生一部分重叠,再根据唯一