数据库切库步骤及回退方案

前言

随着微服务化的进行,大系统被拆分成一个个小而自治的微服务。就必然会涉及到业务系统的垂直拆分,例如:订单管理,商品管理等,无论是从数据存储上,代码及部署等方面都需要相互隔离开来。总之,不拆分存储的服务都是伪服务,本篇介绍线上数据的垂直拆分步骤及回退方案。

环境说明

目前线上服务器,全部采用域名访问数据库,走的是自建的内部DNS解析服务。从而解除与具体IP的强耦合。

内网域名:db.book.system:3306 <——> 10.201.21.110:3306

现分配了一个新的数据库实例,作为垂直拆分的账本库。
新的内网IP是10.201.21.112:3306

切库步骤

考虑到会影响线上部分业务的使用,选在用户使用最少的凌晨进行操作。

  1. 关闭线上数据库监控及相关业务系统的监控,防止报错触发大量无意义的报警;
  2. DBA 锁住需要迁移的相关业务表,只允许读,不允许写,防止继续产生新的数据进来,影响后续的迁移结果;
  3. 将旧数据库里面需要迁移的相关表数据拷贝至新的数据库实例,并赋予账户读写权限;
  4. 修改内网DNS域名db.book.system的解析规则,解析至新实例IP:10.201.21.112上;
  5. DBA kill掉所有连接旧数据库实例相关业务表的session,以便数据库连接池重新建立对新实例的数据库连接(这里需要考虑自身应用程序对域名解析的结果有缓存,java是有缓存的,也可以禁用应用层面的DNS缓存);
  6. 测试人员进行回归测试,验证相关业务的正确性;
  7. 开启对线上数据库的监控及相关业务系统的监控,开发人员查看监控日志,确保程序的正确运行;

回退方案

任何线上的操作都不是百分之百的可靠,我们需要考虑最坏的情况,如果切库失败,如何回退,还原业务功能。

  1. 关闭线上新数据库实例监控及相关业务系统的监控;
  2. DBA 锁住需要回退的相关业务表,只允许读,不允许写,防止继续产生新的数据进来,影响后续的回退结果;
  3. DBA 将新数据库实例相关业务表数据,拷贝至以前旧的数据库实例;
  4. 修改内网DNS域名db.book.system的解析规则,解析至旧实例IP:10.201.21.110上;
  5. DBA kill掉所有连接新数据库实例相关业务表的session,以便数据库连接池连接到旧的实例上;
  6. 测试人员进行回归测试,验证功能是否恢复正常;
  7. 开启对线上数据库的监控及相关业务系统的监控,开发人员查看监控日志,确保程序的正确运行;

回退方案和迁移方案刚好是一个相反的过程。不过整个过程都需要开发人员,DBA,测试人员进行高度的配合及信息的同步。

总结

对于这种切库比较大的动作,往往需要发出申请邮件,主要涵盖以下几点:

  1. 切库的时间
  2. 切库的步骤
  3. 影响时间
  4. 影响范围
  5. 以及失败后的回退方案

DBA 可以做的事情:

  1. 统计有哪些业务系统IP还在访问哪张业务表,进行了多少次读和写等操作;
  2. 手动kill掉相关业务表的session,这样数据库连接池会自动重连;
  3. 锁定指定表,只读,不可读且不可写等;