当RDS实例负载过大时,可以将该实例的一个数据库或表垂直拆分至另外一个单独的实例中。本文介绍如何通过双写方案和简易拆分方案实现垂直拆分。

背景信息

假设一个RDS实例上有数据库A和B,随着业务增长实例瓶颈也日趋可见,如想要减轻该实例的压力,您可以将数据库B垂直拆分至另外一个单独的实例中,详情请参见双写方案简易拆分方案

注意事项

  • 您需要使用一个单独的实例作为目标实例,且目标实例的数据库账号权限需与源实例的数据库账号权限一致。支持的目标实例类型,请参见DTS数据迁移方案概览
    说明 为便于区分会话信息以及提升数据安全性,建议在源和目标实例中单独创建并授权一个数据库账号以供数据迁移使用。
  • 需将目标实例的连接串加入应用程序中。
  • 由于简易拆分方案需要短暂暂停业务并暂停向数据库写入数据,请选择业务低峰期操作以降低程序变更发布、切换实例过程中对业务的影响。

双写方案

说明 可以实现业务的灰度切流,最大限度保证业务不受影响,但您需要先改造业务的应用程序,使应用程序的相关数据能够同时写入源和目标实例的数据库B中。
  1. 配置源和目标实例的数据迁移任务,迁移对象选择为数据库B,配置案例请参见DTS数据迁移方案概览
    说明 配置数据迁移任务时,您必须选中结构数据迁移全量数据迁移增量数据迁移
  2. 等待数据迁移任务的进度变更为增量迁移,并显示为无延迟状态或延迟时间低于5秒。
    数据迁移任务正向1
  3. 验证源和目标实例的数据库B中的数据是否一致。
  4. 如果数据一致,则结束数据迁移的任务,详情请参见结束数据迁移任务
    警告 用于数据迁移的数据库账号拥有读写权限,为保障数据库安全性,请在数据迁移完成后,删除用于数据迁移的数据库账号或回收相关写权限。
  5. 将应用程序中的相关数据同时写入源和目标实例数据库B中。
  6. 登录源和目标实例数据库B,根据数据库类型选择下述命令查看会话信息,确保有新的会话执行写入操作。
    show processlist;
    select * from sys.dm_exec_connections;
    select sid,serial#,username,program,machine,status from v$session;
    select * from pg_stat_activity;
    CLIENT LIST
    use admin
    db.runCommand({currentOp: 1, $all:[{"active" : true}]})

    说明 上述语句查询到的进程或会话信息中,包含DTS连接源和目标实例数据库B的进程或会话。
  7. 应用程序的相关数据同时传入至源实例和目标实例的数据库B中并稳定运行一个业务周期或者7天。
  8. 测试所有业务涉及的功能并确认无问题,可下线源实例的数据库B。

简易拆分方案

说明 有一定的回滚失败风险,但无需改造业务的应用程序。
  1. 配置源和目标实例的数据迁移任务,迁移对象选择为数据库B,配置案例请参见DTS数据迁移方案概览
  2. 等待数据迁移任务的进度变更为增量迁移,并显示为无延迟状态或延迟时间低于5秒。
    数据迁移任务正向1
    说明 配置数据迁移任务时,如果未选中增量数据迁移,进度条不会变更为增量迁移,且迁移完成后会自动结束任务。此类情况通常约定在执行数据迁移任务之前将业务中断并停止新的数据写入源数据库,所以请直接跳转至 步骤6继续操作。
  3. 验证源和目标实例的数据库B中的数据是否一致。
  4. 如果数据一致,则结束数据迁移的任务,详情请参见结束数据迁移任务
    警告 用于数据迁移的数据库账号拥有读写权限,为保障数据库安全性,请在数据迁移完成后,删除用于数据迁移的数据库账号或回收相关写权限。
  5. 断开源实例数据库B与应用程序的连接。
    说明 源实例数据库B与应用程序的连接中断后,如果影响了数据库A涉及业务的功能,您需要暂时中断整个源实例与应用程序的连接。
  6. 登录源实例数据库B,根据数据库类型选择下述命令查看会话信息,确保没有新的会话执行写入操作。
    show processlist;
    select * from sys.dm_exec_connections;
    select sid,serial#,username,program,machine,status from v$session;
    select * from pg_stat_activity;
    CLIENT LIST
    use admin
    db.runCommand({currentOp: 1, $all:[{"active" : true}]})
    说明 上述语句查询到的进程或会话信息中,包含DTS连接源实例数据库B的进程或会话。
  7. 创建反向数据迁移任务并启动,用于将目标实例数据库B后续产生增量数据迁移到源实例数据库B。

    此步骤创建的反向迁移任务的作用是为业务提供回退方案,业务恢复运行后,一旦出现异常可将业务切换至原有的数据库中。

    警告 在配置反向数据迁移任务时,在设置迁移类型及列表环节仅需选择增量数据迁移,然后选择需要迁移回源数据库的库或表。
  8. 保持源实例数据库B与应用程序的断开状态,验证源和目标实例的数据库B数据一致后,将应用程序的相关数据库服务切换至目标实例的数据库B并恢复业务。
  9. 登录目标实例数据库B,根据数据库类型选择下述命令查看会话信息,确保有新的会话执行写入操作。
    show processlist;
    select * from sys.dm_exec_connections;
    select sid,serial#,username,program,machine,status from v$session;
    select * from pg_stat_activity;
    CLIENT LIST
    use admin
    db.runCommand({currentOp: 1, $all:[{"active" : true}]})
    说明 上述语句查询到的进程或会话信息中,包含DTS连接源实例数据库B的进程或会话。
  10. 业务切换至目标数据库并稳定运行一个业务周期或者7天。
  11. 测试所有业务涉及的功能并确认无问题,可下线源实例的数据库B并结束反向数据迁移的任务,详情请参见结束数据迁移任务
    警告 用于数据迁移的数据库账号拥有读写权限,为保障数据库安全性,请在数据迁移完成后,删除用于数据迁移的数据库账号或回收相关写权限。