作为开发人员,我们有很大概率会遇到需要将当前正在使用的数据库迁移到另一个数据库的场景。比如你在项目早期选择了 MySQL 作为数据库 ,虽然它已经能满足大多数业务场景和性能要求,但随着你的数据量越来越大业务日趋复杂,继续使用 MySQL 则可能成为瓶颈,这时候你可能要开始考虑将 MySQL 替换为更适合的数据库比如 HBase(或 Cassandra…)。
对于一个在线业务系统来说,迁移数据库的挑战在于不仅要做到不停机无缝迁移还要保证迁移过程风险可控,这也正是本文要分享的内容,介绍如何使用功能开关无缝、安全地实现数据库迁移。
迁移案例:将 MySQL 迁移到 HBase
接下来将通过一个案例介绍整个迁移的实现过程。某个在线消息业务由于受限于 MySQL 性能和存储瓶颈,所以需要将数据迁移到 HBase 以便于进一步扩大业务规模。
1、使用功能开关实现迁移控制
我们这里假设应用程序逻辑都是通过 DAO (数据存取对象)来查询/读取 MySQL 持久化数据。为了能将数据存取切换到 HBase 中,所以第一步是编写一个针对 HBase 的 DAO,并且和 MySQL DAO 实现相同的接口以提供相同数据读写能力。
现在已经有两种 DAO 接口实现,一种有支持 MySQL,另一种是支持 HBase。此时开始引入我们的功能开关管理服务 FeatureProbe。
先在eatureProbe 上创建四个 Boolean 类型功能开关来独立控制对 MySQL 和 HBase 的读写,以其中一个开关(messages-mysql-write)为例配置如下所示:
接下来我们对外统一提供 saveMessage 方法保存一个消息,代码如下所示:
public void storeMessage(Message message, FPUser fpUser) {
if(fpClient.booleanValue('messages-mysql