23.09.26用户切库流程记录
hello,我是阿昌
,今天记录一下最近切库的流程,内容如下:
一、切库的原因
因为db_A用户数据量超过预期,磁盘空间逐渐不足,需要换成db_A库的压力,所以将部分db_A用户切至db_B中。
二、切库的时机
- 非高峰期时间(这里选择凌晨3点左右)
- 通知用户停服切库公告,让用户有心里预期
三、用户切库是什么?
将A库的用户,切到B库中,db分片为单独存储到话,如db_config.db_no
,则切后用户需要更新分片信息db_no
对应到值,以确保切库后表路由的正确性
。
四、整体流程图
先整理出想要切库到db_B和保留在db_A的用户名单;
先将db_A中的数据全量复制到db_B中;
db_A删除切出用户,db_B删除未迁移的用户;
五、操作整体流程
- 开始切库流程
- dba:购买db_B数据库
- 开发:对项目进行新分库配置
- 整理出想要db_B切库的用户名单
- dba:启动dts服务全量克隆db_A到db_B中
- 测试:通过后台进用户截取对应部分数据用户名单
- 开发:伸缩服务停服
- dba:将对应数据库表设置为只读模式,避免第6步出现项目漏停做ddl操作
- dba:备份user表数据到user_bak表
- 开发:项目git打tag
- 开发:deploy基础依赖core包
- 开发:自测,修改部分要切用户的db_config,切1-2个用户到db_B进行自测
- 开发:启动pre环境,进入验证第11步用户数据是否准确
- 开发:执行任务,将名单用户全量修改db_config,切到db_B库中
- 开发:启动gray/prod环境服务器
- 测试:进入prod环境对比测试数据用户是否准确
- dba:恢复对应数据库表的操作权限
- 开发:主动出发定时任务业务
- 完成切库流程
六、遇到的问题
- 开发配置新库时,不同项目可能有不同的配置方式,这里可能会出现配置错误,导致线上服务启动不了,出现报错
- 当还没进行差值删除时,但迁移B库单用户db_config已调整至B库时,A/B两库会同时存在两份一模一样的用部分业务会for循环扫库,并拿到用户db_config数据去执行业务逻辑
- 此时如果先扫描到A库,拿到db_config会去B库操作
- 扫描到B库,获取拿到db_config会去A库进行操作