前言
随着微服务化的进行,大系统被拆分成一个个小而自治的微服务。就必然会涉及到业务系统的垂直拆分,例如:订单管理,商品管理等,无论是从数据存储上,代码及部署等方面都需要相互隔离开来。总之,不拆分存储的服务都是伪服务,本篇介绍线上数据的垂直拆分步骤及回退方案。
环境说明
目前线上服务器,全部采用域名访问数据库,走的是自建的内部DNS解析服务。从而解除与具体IP的强耦合。
内网域名:db.book.system:3306 <——> 10.201.21.110:3306
现分配了一个新的数据库实例,作为垂直拆分的账本库。
新的内网IP是10.201.21.112:3306
切库步骤
考虑到会影响线上部分业务的使用,选在用户使用最少的凌晨进行操作。
- 关闭线上数据库监控及相关业务系统的监控,防止报错触发大量无意义的报警;
- DBA 锁住需要迁移的相关业务表,只允许读,不允许写,防止继续产生新的数据进来,影响后续的迁移结果;
- 将旧数据库里面需要迁移的相关表数据拷贝至新的数据库实例,并赋予账户读写权限;
- 修改内网DNS域名db.book.system的解析规则,解析至新实例IP:10.201.21.112上;
- DBA kill掉所有连接旧数据库实例相关业务表的session,以便数据库连接池重新建立对新实例的数据库连接(这里需要考虑自身应用程序对域名解析的结果有缓存,java是有缓存的,也可以禁用应用层面的DNS缓存);
- 测试人员进行回归测试,验证相关业务的正确性;
- 开启对线上数据库的监控及相关业务系统的监控,开发人员查看监控日志,确保程序的正确运行;
回退方案
任何线上的操作都不是百分之百的可靠,我们需要考虑最坏的情况,如果切库失败,如何回退,还原业务功能。
- 关闭线上新数据库实例监控及相关业务系统的监控;
- DBA 锁住需要回退的相关业务表,只允许读,不允许写,防止继续产生新的数据进来,影响后续的回退结果;
- DBA 将新数据库实例相关业务表数据,拷贝至以前旧的数据库实例;
- 修改内网DNS域名db.book.system的解析规则,解析至旧实例IP:10.201.21.110上;
- DBA kill掉所有连接新数据库实例相关业务表的session,以便数据库连接池连接到旧的实例上;
- 测试人员进行回归测试,验证功能是否恢复正常;
- 开启对线上数据库的监控及相关业务系统的监控,开发人员查看监控日志,确保程序的正确运行;
回退方案和迁移方案刚好是一个相反的过程。不过整个过程都需要开发人员,DBA,测试人员进行高度的配合及信息的同步。
总结
对于这种切库比较大的动作,往往需要发出申请邮件,主要涵盖以下几点:
- 切库的时间
- 切库的步骤
- 影响时间
- 影响范围
- 以及失败后的回退方案
DBA 可以做的事情:
- 统计有哪些业务系统IP还在访问哪张业务表,进行了多少次读和写等操作;
- 手动kill掉相关业务表的session,这样数据库连接池会自动重连;
- 锁定指定表,只读,不可读且不可写等;