rds_dbsync数据源同步工具

一、介绍

dbsync 项目目标是围绕 PostgreSQL Greenplum ,实现易用的数据的互迁功能
github地址:https://github.com/aliyun/rds_dbsync
 
支持的功能如下:

1、MySQL -> PostgreSQL/Greenplum(binlog_minner binlog_loader)
功能:基于 MySQL binlog 解析的增量数据同步
状态:可用

2、MySQL -> PostgreSQL/Greenplum mysql2pgsql
功能:以表为单位的多线程全量数据迁移
状态:可用

3、PostgreSQL -> PostgreSQL pgsql2pgsql
功能:pg->pg 全量+增量数据同步
状态:可用

4、PostgreSQL -> PostgreSQL/Greenplum pgsql2gp
功能:基于 PostgreSQL 逻辑日志的增量数据同步
状态:不可用

 
 
 

二、功能1(基于 MySQL binlog 解析的增量数据同步)

1、原理介绍

官方文档说明:https://github.com/aliyun/rds_dbsync/blob/master/doc/mysql2gp.md

1.在客户端主机(也可以部署在其他主机)上启动一个临时 PG 数据库,用于临时存放从 MySQL 拉去到的 binlog 数据

2.binlog_miner 从源 MySQL 的一个 binlog 文件开始,拉取和解析 binlog 并存放到临时 PG 中

3.binlog_loader 从临时 PG 中读取增量数据,并做适当的处理,最终批量写入到目标 PostgreSQL 或 Greenplum 中去

2、配置相关数据源和目标数据源

1、mysql数据源

1、数据库,create database syncdb1;
2、用户权限,需要拥有select权限和binlog拉取权限,此处使用root权限
3、同步的表(切换到syncdb1数据库),create table tb1(a int primary key, b char(10));

2、pgsql临时数据库

1、用户,create user test with password 'test';
2、数据库,create database test with owner 'test';

3、pgsql目的数据库

1、用户,create user syncdb with password 'syncdb';
2、数据库,create database syncdb with owner 'syncdb';
3、同步的表(使用syncdb用户切换到syncdb数据库),create table tb1(a int primary key, b char(10));

3、搭建步骤

1、下载和解压缩

下载地址:https://github.com/aliyun/rds_dbsync/releases
解压缩:unzip mysql2pgsql.bin.el7.20171213.zip && mv mysql2pgsql.bin.el7.20171213 mysql2pgsql

2、修改配置文件,vim bin/my.cfg

1、mysql数据源
[src.mysql]
host = "118.190.209.102"
port = "5700
user = "root"
password = "123456"
db = "syncdb1"
encodingdir = "share"
encoding = "utf8"
binlogfile = "mysql-bin.000001"
binlogfile_offset = "154"
serverid = 129

2、pgsql临时数据库
[local.pgsql]
connect_string = "host=127.0.0.1 dbname=test port=5432 user=test password=test"

3、pgsql目的数据库
[desc.pgsql]
connect_string = "host=118.190.209.102 dbname=syncdb port=5432 user=syncdb password=syncdb"
target_schema = "public"
ignore_copy_error_count_each_table = "0"

4、需要同步的表设置
[binlogloader]
loader_table_list = "loader_table_list.txt"
load_batch = 2
load_batch_gap = 10  # load任务的间隔

3、修改配置文件,vim bin/loader_table_list.txt

tb1

4、启动同步进程

1、 启动 binlog 拉取进程

cd bin
./binlog_miner

2、 启动 binlog 写入进程

cd bin
./binlog_loader

5、过程中pgsql临时表的介绍

1、mysql数据源插入数据

insert into tb1 select 1,'a';

2、pgsql临时表数据

1、binlog_data表
test=# select * from binlog_data;
 id | event | tbname | new_row | old_key | flag 
----+-------+--------+---------+---------+------
  1 |     1 | tb1    | 1|'a'   | 1       |    1

2、binlog_load_table_status表
test=# select * from binlog_load_table_status;
 id | tbname |       last_load_time       | apply_id | task_id 
----+--------+----------------------------+----------+---------
  1 | tb1    | 2018-08-01 15:02:52.307866 |        1 |       1

3、binlog_miner_status
test=# select * from binlog_miner_status;
 id |    binlogfile    | position | binlog_data_id |        last_update        
----+------------------+----------+----------------+---------------------------
  1 | mysql-bin.000001 |      419 |              1 | 2018-08-01 15:02:51.52023

4、binlog_washer_status
test=# select * from binlog_washer_status;
 id | b | e | count |        finish_time         
----+---+---+-------+----------------------------
  1 | 0 | 1 |     1 | 2018-08-01 15:02:51.753591

3、pgsql目的数据库

syncdb=> select * from tb1;
 a |     b      
---+------------
 1 | a 

6、存在问题和解决思路

1、数据源同步的表,发生ddl变更操作后,启动dml操作
报错

COPY failed: ERROR:  extra data after last expected column
CONTEXT:  COPY tb1, line 1: "3|'c'|3"
[loader] task 3 run faild
[binlog_loader_main] thread exit, proc exit

解决

1、调整目的数据库的表结构,和源端保持一致
2、重新启动binlog_loader进程

2、多个库中表的同步
这个工具默认是同步下面对应的库表,所以每个进程只能同步一个库

数据库:my.cfg-->[src.mysql]-->db对应的数据库
表:loader_table_list.txt对应的表

可以并发启动多个进程,每个进程分别同步一个库,最终的目标库可以保持一致,实现mysql多个库中的表同步到pgsql的一个库的一个表

3、同步表比较多和数据量比较大时,会造成性能的瓶颈

猜你喜欢

转载自blog.51cto.com/11257187/2153182
今日推荐