什么时候需要进行数据库迁移
1、业务数据增长,原数据库不足以支持业务需求
2、底层存储架构遇见瓶颈,需升级改造
3、老系统升级过度新系统
迁移过程中会面临哪些挑战或问题
1、数据库表完全异构、旧库和新库表结构完全不同
2、业务方,需要能进行数据灵活迁移,按照租户商家迁移,按照数据百分比迁移
3、数据量巨大,上百万商家数据,几百亿条数据,几TB数据
4、线上业务,迁移时间窗口固定,晚上几点到几点,只能有几个小时时间
如何提升迁移效率
1、大任务拆分成小任务
按照不同租户或商家,假设没500个一批次,分成多批次
2、多线程处理
增加并发线程方式处理,效率提升,但是面对巨大的数据量,单机很快也会面临 瓶颈
3、分布式处理
增加机器节点,任务进行水平扩展,把大任务拆分为独立的子任务,所有子任务执行结果等价于各个子任务结果,手动根据不同租户或商家平摊到不同机器节点上执行
迁移数据过程中遇见问题
线程池参数配置错误
在测试阶段,并发上不去,线程配置如下:核心线程池配置了16个,最大线程配置了750,然后配置了5000的缓冲队列,主要是当提交任务大于核心线程数时,后续任务会首先提交到缓冲队列。缓冲队列满后才会创建线程数据
ThreadPoolExecutor executor = new ThreadPoolExecutor(
16, // corePoolSize
750, // maximumPoolSize
1, // keepAliveTime
TimeUnit.SECONDS, // unit
new ArrayBlockingQueue<5000>(), // workQueue
Executors.defaultThreadFactory(), // threadFactory
new ThreadPoolExecutor.AbortPolicy() // handler`在这里插入代码片`
数据库压力大
并发上去后,后端数据库压力增大,CPU使用率居高不下。当CPU使用率急速上升,后发现是执行任务未命中素颜9in,导致全表扫描CPU资源被大量占用,慢SQL问题通过优化创建索引解决,通过时间换时间
待优化改进点
手动分配任务
分布式和并行化的方式都是自己手写代码实现,其实可以用ScheduleX和MapReduce实现,框架已经实现任务分发,并行处理,充实,reduce等功能
数据一致性校验
打标记,抽样检查的