亿级数据库迁移、分库分表、实践

什么时候需要进行数据库迁移

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等功能
数据一致性校验
打标记,抽样检查的

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值