23.09.26用户切库流程记录
阿昌 Java小菜鸡

23.09.26用户切库流程记录

hello,我是阿昌,今天记录一下最近切库的流程,内容如下:

一、切库的原因

因为db_A用户数据量超过预期,磁盘空间逐渐不足,需要换成db_A库的压力,所以将部分db_A用户切至db_B中。

二、切库的时机

  1. 非高峰期时间(这里选择凌晨3点左右)
  2. 通知用户停服切库公告,让用户有心里预期

三、用户切库是什么?

将A库的用户,切到B库中,db分片为单独存储到话,如db_config.db_no,则切后用户需要更新分片信息db_no对应到值,以确保切库后表路由的正确性
image

四、整体流程图

先整理出想要切库到db_B和保留在db_A的用户名单;
先将db_A中的数据全量复制到db_B中;
db_A删除切出用户,db_B删除未迁移的用户;
image

五、操作整体流程

  1. 开始切库流程
  2. dba:购买db_B数据库
  3. 开发:对项目进行新分库配置
  4. 整理出想要db_B切库的用户名单
  5. dba:启动dts服务全量克隆db_A到db_B中
  6. 测试:通过后台进用户截取对应部分数据用户名单
  7. 开发:伸缩服务停服
  8. dba:将对应数据库表设置为只读模式,避免第6步出现项目漏停做ddl操作
  9. dba:备份user表数据到user_bak表
  10. 开发:项目git打tag
  11. 开发:deploy基础依赖core包
  12. 开发:自测,修改部分要切用户的db_config,切1-2个用户到db_B进行自测
  13. 开发:启动pre环境,进入验证第11步用户数据是否准确
  14. 开发:执行任务,将名单用户全量修改db_config,切到db_B库中
  15. 开发:启动gray/prod环境服务器
  16. 测试:进入prod环境对比测试数据用户是否准确
  17. dba:恢复对应数据库表的操作权限
  18. 开发:主动出发定时任务业务
  19. 完成切库流程

六、遇到的问题

  1. 开发配置新库时,不同项目可能有不同的配置方式,这里可能会出现配置错误,导致线上服务启动不了,出现报错
  2. 当还没进行差值删除时,但迁移B库单用户db_config已调整至B库时,A/B两库会同时存在两份一模一样的用部分业务会for循环扫库,并拿到用户db_config数据去执行业务逻辑
    • 此时如果先扫描到A库,拿到db_config会去B库操作
    • 扫描到B库,获取拿到db_config会去A库进行操作
 请作者喝咖啡