本文讲解的方法论是一种通用的迁移方案,既适合字段迁移、表迁移、也适合库迁移以及应用迁移,既适合数据库的迁移也适合缓存的迁移,虽然在细节上有些不同,但是在方法论上则大同小异,我们以分片后的数据容量不能满足需求,需要对分片后的数据扩容为例,这里的扩容实际上是迁移的一种特殊案例,我们以扩容为例来说明相应的步骤和实现细节。
1. 平滑迁移
平滑迁移适合对可用性要求较高的场景,例如,线上的交易服务对缓存或者数据库依赖较大,不能忍受停机带来的业务损失,也没有交易的低峰期,我们对此只能采用平滑迁移的方式。
平滑迁移,是指将正在提供线上服务的数据,从一个地方数据存储到另一个数据存储,整个迁移过程中要求不停机,服务不受影响。根据数据所处层次,可以分为缓存迁移、数据库存储迁移、应用迁移等等;根据数据迁移前后的变化,又可以分为数据平移和数据转移。数据库对数据库的迁移属于平移,数据库对其他Nosql库的迁移属于数据转移。 数据平移是指迁移前后数据组织形式不变,比如Mysql数据库从1个实例扩展为4个实例,Redis缓存从2个实例扩展到8个实例,等等。
如果在最初的设计里就为以后的扩容做好准备,也就是做了充分的容量评估,关于容量评估,请参考《分布式服务架构:原理、设计与实战》的第3章的内容,那么数据迁移工作就会简单很多,比如Mysql已经做了分库分表,扩展实例的时候,只需要多做几个从库,切换访问关系,最后将冗余的库表删除即可达到扩容的效果,当然,这需要短暂的停止服务。
近年来出现很多支持自动可伸缩的数据库,在实现上已经做到全自动数据迁移,如HBase、TiDB等,那就更简单了,只要通过管理功能来添加机器,手工修改配置或者系统自动发现,就可完成数据库容,也就免去了发杂的数据迁移等工作。 数据转移是指在数据迁移前后,数据组织形式发生了变化。比如将Mysql数据库迁移到HBase数据库,微博就经历过这样的过程。
平滑迁移通常使用的是双写方案,方案分成4个步骤:双写、迁移历史数据、切读、下双写。
这种方式如果应用与缓存扩容的迁移的场景,则还有一个变种,就是不需要迁移旧数据,在第1步中双写后,在一定的时间里通过新规则对新缓存进行写入,新缓存已经有了足够的数据,这样我们就不用再迁移旧数据,直接进入第3步即可。
首先,假设我们的应用现在使用了具有两个分片的数据集群,通过关键字哈希的方式进行路由,如下图所示。
因为两个分片已经不能满足容量的需求,所以现在需要扩容到4个分片,达到原来两倍的总大小,因此我们需要迁移。
迁移的具体过程如下。
1. 双写
按照新规则和旧规则同时往新新旧数据系统中写数据,如下图所示。
2. 迁移历史数据
把旧缓存集群中的历史数据读取出来,按照新的规则写到新的数据集群中,如下图所示。
3. 切读
把应用层所有的读操作路由到新的数据集群上,如下图所示。
4. 下线双写
在这一步,我们把写入旧的集群的逻辑下线,,如下图所示。
领取专属 10元无门槛券
私享最新 技术干货