数据同步

可以通过一条命令, 将UDDB作为UDB或者自建MySQL的从库, 挂载到源数据库实例(UDB/自建MySQL)后方。 挂载后,UDDB能够和源数据库保持准实时同步。数据维持准实时同步后, 如需将业务数据库切换到UDDB,简单修改业务数据库的访问IP即可。

数据同步的粒度可以调节: 客户可以选择将一个库、若干个库或者某几张表的数据, 同步到UDDB,而其他库表数据不做同步。

具体的步骤如下:

1.在UDDB下面创建需要迁移的库表

客户在UDDB中创建需同步到UDDB的表。 如果源库中的某个表没有在UDDB中创建, 则不会同步到UDDB。 在UDDB中创建的库表, 需要保证库表名、字段名、字段类型和源数据库一致。但是可以增加水平拆分信息。数据从源库同步到UDDB时, 由UDDB路由节点保证数据按照拆分规则来正确写入和存储。

2.启动数据迁移和同步

在UDDB中先创建好要迁移的库和表,然后通过以下命令即可启动数据同步:

 create udb_import_task(
    src_udb_addr:"10.9.23.45:3306", 
    src_udb_user:"ucloudbackup", 
    src_udb_passwd:"helloworld", 
    import_dbs:"userdb,orderdb", 
    notes:"trans data to uddb" 
);

其中:

src_udb_addr : 源数据库的地址,可以为UDB地址,也可以为自建MySQL地址

src_udb_user: 源数据库的用户名,该用户必须具备数据的select和dump权限

src_udb_passwd: 用户密码 import_dbs: 需要迁移的库, 多个库之间用,号分隔

import_dbs: 需要同步的数据库

notes: 此次同步的说明信息

假如UDDB中有一些表,不需要从源库同步,可以增加omit_tbls字段:

 create udb_import_task(
    src_udb_addr:"10.9.23.45:3306", 
    src_udb_user:"ucloudbackup", 
    src_udb_passwd:"helloworld", 
    import_dbs:"userdb,orderdb", 
    omit_tbls:"userdb.tmp_1,orderdb.tmp_2", 
    notes:"trans data to uddb" 
);

UDDB收到该命令后, 首先连接源数据库实例, 检查UDDB中的库表是否已存在于源数据库中,不存在将报错; 库表存在性检查通过后, UDDB启动数据同步进程, 将源库中迁移到UDDB, 首先通过mysqldumper工具实现全量同步,在采用自研的增量binlog同步工具,实时从源库抓取新生成的binlog并同步到UDDB。

可以通过show udb_import_task命令, 来查看数据迁移和同步进程:

mysql> show udb_import_task\G;
*************************** 1. row ***************************
       src_udb_addr: 10.13.110.26:3306
         import_dbs: import1,import2
        create_time: 1495369094
        modify_time: 1495369313
             status: Running
           log_file: mysql-bin.000495
           file_pos: 5614
	total_sync_num: 42
	 have_data_num: 22
	   no_data_num: 20
             notes: trans data to uddb

其中:

status为迁移和同步任务的状态。状态值如下:

NotStart: 数据同步未开始

Running: 数据同步进行中

Failed: 数据同步失败

Dropping: 数据同步撤销中

Dropped: 数据同步成功撤销

Abnormal: 数据同步异常

log_file、file_pos为UDDB源库目前已写入到UDDB的binlog文件和位置。 可以在源数据库通过show master status来查看目前的binglog文件和位置, 并和show udb_import_task命令输出的log_file、file_pos比对, 判断UDDB中的数据,是否和源数据库一致。

total_sync_num: 3秒内, UDDB数据迁移和同步进程, 从源数据库同步binlog数据的次数

have_data_num: 3秒内, 在total_sync_num次binlog同步中, 从源数据库获取到了binlog数据的次数

no_data_num: 3秒内, 在total_sync_num次binlog同步中, 从源数据库没有获取到binlog数据的次数

3. 停止数据同步

可以通过以下命令, 终止UDDB的数据迁移和同步进程:

drop udb_import_task(
    src_udb_addr:"10.9.23.45:3306", 
    src_udb_user:"ucloudbackup", 
    src_udb_passwd:"helloworld", 
    import_dbs:"userdb,orderdb", 
    omit_tbls:"userdb.tmp_1,orderdb.tmp_2", 
    notes:"trans data to uddb" 
);

UDDB收到该命令后, 立即停止数据迁移和同步进程,并将迁移和同步任务状态改为Dropped。

4. 重新开启数据迁移和同步进程

当UDDB内部出现异常时, 数据迁移和同步进程将终止。 此时show udb_import_task状态为Abnormal。此时,可以通过以下两个命令, 重启数据迁移和同步进程:

1.重头开始启动数据同步过程,先全量导入,再增量同步数据:

restart udb_import_task full(
    src_udb_addr:"10.9.23.45:3306", 
    src_udb_user:"ucloudbackup", 
    src_udb_passwd:"helloworld", 
    import_dbs:"userdb,orderdb", 
    omit_tbls:"userdb.tmp_1,orderdb.tmp_2", 
    notes:"trans data to uddb" 
);

2.从上一次binlog位点开始,重新增量同步数据:

restart udb_import_task last(
    src_udb_addr:"10.9.23.45:3306", 
    src_udb_user:"ucloudbackup", 
    src_udb_passwd:"helloworld", 
    import_dbs:"userdb,orderdb", 
    omit_tbls:"userdb.tmp_1,orderdb.tmp_2", 
    notes:"trans data to uddb" 
);

5. 推荐的数据迁移和业务切换流程

以下是我们推荐的在线业务数据迁移和业务切换流程:

1.在UDDB中,创建需要迁移的数据库和表。

2.执行create udb_import_task语句, 开启数据迁移和同步进程, 从源数据库迁移数据。

3.每隔若干秒, 通过show udb_import_task查看迁移和同步进度, 如果每次查询的结果, 是no_data_num的值, 接近total_sync_num的值,那么说明UDDB的数据,已经接近追平源数据库的数据。 此时可以将暂停业务写入源数据库。

4.暂停业务写入源数据库后, 通过在源数据库show master status,获取源数据库最新binlog地址,通过show udb_import_task,获取UDDB最新的binglog地址。如果两者相同,则说明UDDB和源数据库一致,此时可以将业务切换到UDDB进行写入。