Skip to content

目的表更名功能

lydarkforest edited this page Jun 19, 2019 · 4 revisions

简介

从v1.5版本开始,MongoShake新增了目的表更名功能,该功能可以让用户更改迁移后的表名。MongoShake不仅在全量同步时会对迁移的数据更改表名,而且在后面增量迁移时也会对同步的oplog更改其表名,确保源表的数据正确写到用户指定的目的表中。增量迁移中我们除了支持dml的更名,而且对ddl和dbref等操作也做了更名的支持。那这个目的表功能有什么用呢,我们目前发现有以下三种用法:

  1. 在不停服的情况下,实现变更表名或者将一个db的表拆为多个db
  2. 构建一个数据中心用于做数据分析或者作为灾备,把多个mongodb实例的数据同步到一个存储量很大的mongodb实例里,可以解决这多个mongodb实例出现db或表重名的情况
  3. 丰富多活场景,由于不能解决循环复制的问题,所以也没办法做到完美的数据多活,但已经可以满足不少多活的业务需求

不停服做目的表变更

先通过MongoShake做表更名的数据同步,同步的过程中业务可以持续访问源库,然后等数据同步完成,使用新业务程序(访问更名后的表)访问目的库,最后将域名或vip流量切到新业务程序。表名变更通过参数transform.namespace进行设置,多个规则通过分号;分割,冒号:左边的是源库的db或namespace,右边是目的库的db或namespace。对每个源库的namespace从左到右依次匹配,使用第一个匹配上的规则进行表更名。

  • 若配置transform.namespace=my.tbl:my1.tbl;my:my2 那么会将源库my库下的其中一个表tbl迁移到目的库的my1中,而将其他表迁移到目的库的my2中

  • 若反过来配置transform.namespace=my:my2;my.tbl:my1.tbl 那么源库my库下的所有表都会迁移到目的库的my2中
  • 要开启ddl的同步,需要配置replayer.dml_only=false
  • 数据中如果有dbref,需要配置dbref=true,设置该参数会大幅降低同步性能,如果数据中没有使用dbref,请不要配置

数据中心/灾备

对于需要多region部署的服务,一般会有跨region容灾,或者需要全部region的数据做数据分析的需求,使用MongoShake可以将多个region的数据同步到一个独立的mongodb中,进行数据分析或者容灾。即使表有重名,也可以进行更名处理。

多活场景

由于循环复制的限制,两个MongoDB实例的同名表不能双向复制,但只要不产生复制的循环,通过更改目的表名,两个MongoDB依然可以做双向复制,达到多活的场景。

双region多活

一个region的服务一般只会改写本region的MongoDB的数据,但会有需求读其他region的数据。通过表更名功能,将本region的业务库迁移到对端并更名为业务远程库,可以实现这种多活需求。这个方案的好处是两个region下的业务代码可以共用同一套代码。

  • MongoShake的配置如下filter.namespace.white=db.a,transform.namespace=db.a:db.a_remote

多region多活

一般需要一个中心MongoDB,来接收所有region同步过来的数据,再将汇总的数据同步给其它region,这样每个region都能获取其它region的所有数据,且中心MongoDB在访问全部数据时不需要跨表访问,所有数据都在同一个表中。

  • HZ业务库和BJ业务库的MongoShake配置如下filter.namespace.white=db.a
  • 中心业务库的MongoShake配置如下filter.namespace.white=db.a,transform.namespace=db.a:db.a_remote
Clone this wiki locally