《架构师之路:架构设计中的100个知识点》 27.MySQL在线扩展表结构
一个海量数据高并发的业务场景,产品经理前期没想清楚,现在想要增加业务属性,MySQL要扩展表结构,有什么办法吗?
方案一:alter table add column,行不行?
不可行,海量数据高并发情况下会锁表。
通过增加表的方式扩展,通过外键join来查询,行不行?
不可行,外键影响性能,连表影响性能,海量数据高并发情况下不行。
通过增加表的方式扩展,通过视图来查询,行不行?
不可行,视图影响性能,海量数据高并发情况下不行。
揍产品经理,避免需求变更,行不行?
不可行,打赢坐牢,打输住院。
提前预留一些reserved字段,以备扩展,行不行?
可行。但如果预留过多,会造成空间浪费,预留过少,不一定达得到扩展效果。
MySQL的online-schema-change,在线扩展字段,行不行?
可行。且这是标配。
MySQL的online-schema-change的原理是怎么样的?如何能在海量数据高并发的场景下,平滑扩展字段呢?
假设原表为:user(id, name)
希望扩展字段升级为:user(id, name, age)
第一步,创建新表,user_new(id, name, age),也就是扩展字段后的表;
第二步,创建触发器,对原表user进行的所有写操作insert/delete/update,对新表进行相同的操作;
第三步,逐步迁移数据,分批限速将user表中的数据库,迁移到user_new表;
第四步,删掉触发器,移走原表;
第五步,将新表user_new重命名rename为原表user,字段扩展完成;
整个过程不需要加大锁,可以持续对外提供服务。
MySQL的online-schema-change有什么注意事项吗?
有三点要注意:
其一,被迁移的表要求有主键,这个条件一般都满足;
其二,扩展过程中要建立触发器,原表如果已经有很多触发器,方案就不行,但互联网海量数据高并发的场景下,一般都不允许业务触发器;
其三,由于触发器的建立,会影响原表性能,因此这个操作最好在流量低峰期进行;
pt-online-schema-change是互联网MySQL-DBA必备的利器,在互联网公司使用广泛。
知其然,知其所以然。
思路比结论更重要。
补充阅读材料:
《pt-online-schema-change介绍》
https://docs.percona.com/percona-toolkit/pt-online-schema-change.html
