更新时间:2024-12-17 GMT+08:00
分享

应用无损透明(ALT)简介

数据库系统在进行只读升主、小版本升级和规格变更时,可能会中断用户会话,此时用户的应用程序需要感知到会话变化并提供复杂的应对措施来解决故障,比如判断数据库连接或事务是否中断,进行事务补偿以及重建数据库会话上下文等。

针对上述问题,TaurusDB提供了应用无损透明(ALT),在数据库系统切换时,可以避免数据库连接和事务中断,无需用户对事务进行补偿、无需恢复和重建会话上下文,从而实现无损的应用连续性,保证业务不中断。

架构图

图1 架构图

应用无损透明(ALT)功能以用户连接为粒度,用户可以连接到数据库代理,在进行只读升主、规格变更或者小版本升级时,系统会复制用户的后台会话,在达到安全的事务边界后,确保后台会话操作上下文被完整克隆至目的节点,从而保证业务不会中断。

安全的事务边界是指当前会话上的事务提交完成,开启下一个事务之前的状态,例如:

  • 开启autocommit的事务块每个语句执行完成时,可以达到事务边界。
    start transaction;
    DML; 
    commit;
  • 关闭autocommit时,当commit执行完成,达到事务边界。
  • 单独DML、DDL语句,执行完成,可以达到事务边界。
  • 使用表锁、备份锁、用户自定锁时,需要释放锁以后,达到事务边界。

注意事项

表1 注意事项

分类

注意事项

版本约束

  • TaurusDB内核版本需要大于等于2.0.54.240600。
  • 数据库代理内核版本需要大于等于2.24.06.000。

使用约束

  • TaurusDB的ALT功能为白名单功能,如需使用,请在管理控制台右上角,选择“工单 > 新建工单”,提交申请。
  • 实例为一主多读,至少有一个只读节点,已开启数据库代理且必须通过数据库代理地址连接实例。
  • 只读数据库代理模式下不支持应用无损透明(ALT)功能。
  • 主备模式的数据库代理不支持应用无损透明(ALT)功能。
  • 单机或者多主TaurusDB模式下不支持应用无损透明(ALT)功能。
  • 首次开启ALT功能会重启TaurusDB实例。开启或关闭ALT会重启代理实例。关闭所有代理实例的ALT会重启TaurusDB实例。
  • 应用无损透明(ALT)功能事务排干机制超时时间,通过参数“rds_tac_drain_timeout”控制,默认为5s,取值范围为1-60s。
    • 业务压力较大,Prepare语句个数较多或者事务执行时间较长时,建议增加超时时间。
    • 不建议调小超时时间,如果在该时间内有连接没有排干事务,则这些连接不具有ALT的能力。
  • 应用无损透明(ALT)切换过程中,会短时间在目标新主机上创建和原主节点相同数量的备用连接,请确保数据库实例的总连接数上限为当前连接数的2倍以及2倍以上,修改最大连接数需要评估实例规格和内存使用情况,请参考TaurusDB数据库实例支持的最大数据连接数是多少
  • 应用无损透明(ALT)支持Prepare协议,切换过程中会重建Prepare语句的上下文信息,如果业务有大量的Prepare语句,可能影响切换的成功率;
  • 应用无损透明(ALT)切换建议在业务低峰进行,如果业务主节点和只读节点压力过大,可能影响切换的成功率;
  • 数据库代理的语法限制和功能限制请参考TaurusDB数据库代理注意事项

不支持的功能

  • 应用无损透明(ALT)功能不支持一些用户设置的系统变量:
    • innodb_ft_user_stopword_table:只支持值为NULL。
    • transaction_write_set_extraction:只支持值为OFF。
    • profiling:不支持设置为1或者ON。
  • 应用无损透明(ALT)功能不支持开启透明数据加密(TDE)。
  • 应用无损透明(ALT)功能暂不兼容以下数据库代理能力:
    • 暂不兼容会话级连接池。
    • 暂不兼容单列插入16MB以上的数据。
    • 暂不兼容查询结果集大于16MB以上的数据。
    • 暂不兼容prepare Cache。
  • 应用无损透明(ALT)功能不支持用户临时表。
  • 应用无损透明(ALT)功能不支持部分无法达到安全事务边界的情况:
    • 不支持长时间不提交的InnoDB事务块。
    • 不支持有未释放的表锁、用户锁,备份锁和binlog锁(Lock for backup/binlog)。
    • 不支持XA事务。
  • 应用无损透明(ALT)功能短时间内连续变更的场景,可能出现失败率高的情况。
  • 以下场景不支持转移Prepare语句:
    • 当Prepare语句中打开游标(Cursor)且未关闭场景,无法转移该Prepare语句。
    • 当Prepare语句的变量已经保存了LONG_DATA类型,无法转移该Prepare语句。

相关文档