Facebook 分享 MySQL 5.6 到 8.0 的迁移经验
作者 | 白开水
Facebook 在一篇博客中分享了该公司在某种程度上艰难的大规模跨越式迁移到 MySQL 8.0 版本的经验。此前,其一直使用的是 MySQL 5.6 版本。
MySQL 是由 Oracle 开发的开源数据库,为 Facebook 的一些最重要的工作负载提供支持。Facebook 方面称,MySQL 的每个新主要版本都需要其花费大量时间和精力来迁移工作负载。其中挑战包括有:
将其自定义功能移植到新版本 确保复制在主要版本之间兼容 最小化现有应用程序查询所需的更改 修复阻止服务器支持其工作负载的性能回归
根据透露,Facebook 上次升级到 MySQL 5.6 花了一年多的时间;而此向 MySQL 8.0 的升级也花了好几年的时间。在 5.7 版本发布的时候,Facebook 仍在开发 5.6 版上的 LSM-Tree 存储引擎 MyRocks。鉴于在构建新存储引擎的同时升级到 5.7 会显着减缓 MyRocks 的进度,因此该团队选择继续使用 5.6 直到 MyRocks 完成。而 MySQL 8.0 则刚好是在 MyRocks 完成时发布的,所以 Facebook 选择升级以改进其存储引擎。
Facebook 指出,迁移到 8.0 明显比迁移到 5.6 要更困难。他们有 1700 个代码补丁要从其定制的 MySQL 5.6 分支迁移到 8.0。由于 Facebook 的 MySQL 新功能和不断添加到 5.6 代码库中的修复,使得这项工作变得非常复杂。
因为从 5.6 到 8.0 的升级完全跳过了 5.7,一些在 5.6 中活跃的 API 要么被弃用、要么被完全删除;这也就意味着任何使用旧 API 的应用程序都需要更新。且 Facebook 的一些功能也与 8.0 中的类似功能不向前兼容,需要弃用和向前迁移。
还有自定义代码文档参差不齐的问题。Facebook 称,它的大多数自定义代码都有良好的注释和文档。但其他的代码没有很好的文档,Facebook 需要挖掘旧的文件、帖子和代码注释来了解历史。
最终,Facebook 方面评估了 2300 多个补丁并将其中的 1500 个移植到了 MySQL 8.0。“我们已将许多 InnoDB 副本集转换为完全在 8.0 上运行。其余的大多数都处于迁移路径的不同阶段。现在我们的大部分自定义功能都已移植到 8.0,更新到 Oracle 的次要版本相对容易,我们计划跟上最新版本的步伐。”
“尽管我们在迁移的道路上遇到了种种障碍,但我们已经看到了运行8.0的好处。总的来说,新版本大大扩展了我们在 MySQL @ Facebook 上所能做的事情。”
更多详情可查看官方博客:https://engineering.fb.com/2021/07/22/data-infrastructure/mysql/
往期推荐
关注我回复「加群」,加入Spring技术交流群