MySql通过Sharding-Sphere分库分表之后的在线DDL方案总结

1.概述

  • 之前,通过二次开发的分库分表中间件Sharding-Shere实现了对MySql的分表。
  • 由于某些原因,分库分表之后,原表和分表都在提供服务。
  • 现由于某些需求,需要对原和分表增加若干字段,并要求不能影响线上服务。
  • 此文章是对在线DDL的总结,前置文章如下:记一次分库分表——改造策略总结

2.如何保证不影响线上服务

  • 经过调研,最终采用的是在线DDL插件:pt-online-schema-change。
  • pt-online-schema-change原理:
    • 如果存在外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,做相应设置的处理。
    • 创建一个新的表,表结构为修改后的数据表,用于从源数据表向新表中导入数据。
    • 创建触发器,用于记录从拷贝数据开始之后,对源数据表继续进行数据修改的操作记录下来,用于数据拷贝结束后,执行这些操作,保证数据不会丢失。
    • 拷贝数据,从源数据表中拷贝数据到新表中。
    • 修改外键相关的子表,根据修改后的数据,修改外键关联的子表。
    • rename源数据表为old表,把新表rename为源表名,并将old表删除。
    • 删除触发器。
  • 关于pt-online-schema-change,可以参考以下链接
    • 在线更改MySQL表结构工具pt-online-schema-change
    • pt-online-schema-change使用说明、限制与比较

3.其他注意事项

项目特殊现状:

  • 依赖Sharding-Sphere的项目在启动时,会加载分表数据结构,只有所有分表结构一致时,才能启动成功。
  • 目前项目中存在一个从分表向原表同步的数据同步服务,它会根据分表数据变化生成SQL语句,然后操作老表。

特殊现状引起的特殊处理:

  • 分表在线DDL期间,依赖Sharding-Sphere的项目无法进行重启,务必保证其可用性。
  • 为了避免数据同步服务的异常,应该DDL原表,再DDL分表。以此避免因先DDL分表,导致生成的SQL包含新增列,而此时原表无此列的问题。

你可能感兴趣的:(MySql,技术方案)