作者:张鱼小丸子-PingCAP

原文来源: https://tidb.net/blog/dd46ed3f

参考文档: https://github.com/moiot/gravity/blob/master/docs/2.0/03-inputs.md

整体架构

Gravity 是一款数据复制组件,提供全量、增量数据同步,以及向消息队列发布数据更新。 使用场景

  • 大数据总线:发送 MySQL Binlog,Mongo Oplog 的数据变更到 kafka 供下游消费
  • 单向数据同步:MySQL --> MySQL 的全量、增量同步
  • 双向数据同步:MySQL <–> MySQL 的双向增量同步,同步过程中可以防止循环复制
  • 分库分表到合库的同步:MySQL 分库分表 --> 合库的同步,可以指定源表和目标表的对应关系
  • 在线数据变换:同步过程中,可支持对进行数据变换

架构简介

单进程架构

单进程的 Gravity 采用基于插件的微内核架构,由各个插件围绕系统里的 core.Msg 结构实现输入到输出的整个流程。

各个插件有各自独立的配置选项。

如上图所示,系统总共由这几个插件组成:

  • Input 用来适配各种数据源,比如 MySQL 的 Binlog 并生成 core.Msg
  • Filter 用来对 Input 所生成的数据流做数据变换操作,比如过滤某些数据,重命名某些列,对列加密
  • Output 用来将数据写入目标,比如 Kafka, MySQL,Output 写入目标时,使用 Router 所定义的路由规则
  • Scheduler 用来对 Input 生成的数据流调度,并使用 Output 写入目标;Scheduler 定义了当前系统支持的一致性特性( 当前默认的 Scheduler 支持同一行数据的修改有序
  • Matcher 用来匹配 Input 生成的数据。Filter 和 Router 使用 Matcher 匹配数据

基本功能测试

MySQL环境准备

Gravity 对源端 MySQL 的要求如下:

  • 开启 gtid 模式的 binlog
  • 创建 drc 账户,并赋予 replication 相关权限,以及 drc 数据库的所有权限
  • MySQL 源端、目标端相应的表需要创建好

MySQL 配置项如下所示

[mysqld]

server_id=4

log_bin=mysql-bin

gtid-mode=ON

binlog_format=ROW

drc 账户权限如下所示

CREATE USER drc IDENTIFIED BY 'xxx' ;

GRANT SELECT , RELOAD, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT, INSERT , UPDATE , DELETE ON *.* TO 'drc' @ '%' ;

GRANT ALL PRIVILEGES ON drc.* TO 'drc' @ '%' ;

上下游表结构创建

--source

CREATE TABLE ``test . test_source_table (

\`\`id int (11),

PRIMARY KEY ( id )

) ENGINE=InnoDB DEFAULT CHARSET=utf8

--target

CREATE TABLE ``test . test_target_table (

\`\`id int (11),

PRIMARY KEY ( id )

) ENGINE=InnoDB DEFAULT CHARSET=utf8

GO 环境配置

参考文档: 配置好 Go 语言环境

wget https: //dl .google.com /go/go1 .11.4.linux-amd64. tar .gz

tar -C /usr/local -xzf go1.11.4.linux-amd64. tar .gz

mkdir -p usr /local/go/src/github .com /moiot/ && cd usr /local/go/src/github .com /moiot/

git clone https: //github .com /moiot/gravity .git

cd gravity && make

MySQL to MySQL

创建配置文件 mysql2mysql.toml

mysql2mysql.toml

同步测试

##源端表及表数据

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| _gravity |

| mysql |

| performance_schema |

| sys |

| test |

| wk |

+--------------------+

7 rows in set (0.00 sec)

mysql> use test

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+---------------------+

| Tables_in_test |

+---------------------+

| test_source_table_1 |

| test_source_table_2 |

+---------------------+

2 rows in set (0.00 sec)

mysql> select * from test_source_table_1;

+-----+------+------+

| id | name | age |

+-----+------+------+

| 1 | NULL | NULL |

| 2 | NULL | NULL |

| 3 | NULL | NULL |

| 4 | NULL | NULL |

| 6 | NULL | NULL |

| 9 | NULL | NULL |

| 33 | NULL | NULL |

| 333 | wk | 12 |

| 334 | wk | 12 |

| 354 | wk | 12 |

+-----+------+------+

10 rows in set (0.00 sec)

mysql> select * from test_source_table_2;

+-----+------+------+

| id | name | age |

+-----+------+------+

| 3 | NULL | NULL |

| 4 | NULL | NULL |

| 5 | NULL | NULL |

| 6 | NULL | NULL |

| 66 | NULL | NULL |

| 77 | GG | 18 |

| 81 | GG | 18 |

| 89 | GG | 18 |

| 166 | bb | 11 |

| 183 | bb | 11 |

+-----+------+------+

10 rows in set (0.00 sec)

mysql>

目标端效果

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

5 rows in set (0.00 sec)

mysql> use test ;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+-------------------+

| Tables_in_test |

+-------------------+

| test_target_table |

+-------------------+

1 row in set (0.00 sec)

mysql> select * from test_target_table;

+-----+------+------+

| id | name | age |

+-----+------+------+

| 1 | NULL | NULL |

| 2 | NULL | NULL |

| 3 | NULL | NULL |

| 4 | NULL | NULL |

| 5 | NULL | NULL |

| 6 | NULL | NULL |

| 9 | NULL | NULL |

| 33 | NULL | NULL |

| 66 | NULL | NULL |

| 77 | GG | 18 |

| 81 | GG | 18 |

| 89 | GG | 18 |

| 166 | bb | 11 |

| 183 | bb | 11 |

| 333 | wk | 12 |

| 334 | wk | 12 |

+-----+------+------+

16 rows in set (0.00 sec)

mysql>

MySQL to TiDB

上游一库多表下游一库一表测试

配置文件

mysql2tidb2.toml

测试步骤

--上游表

mysql> show tables;

+ ---------------------+

| Tables_in_test |

+ ---------------------+

| test_source_table_1 |

| test_source_table_2 |

+ ---------------------+

2 rows in set (0.00 sec)

mysql> select * from test_source_table_1;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 2019 | pingcap | 3 |

+ ------+---------+------+

1 row in set (0.00 sec)

mysql> select * from test_source_table_2;

+ -----+------+------+

| id | name | age |

+ -----+------+------+

| 77 | GG | 18 |

| 81 | GG | 18 |

| 89 | GG | 18 |

| 166 | bb | 11 |

| 183 | bb | 11 |

+ -----+------+------+

5 rows in set (0.01 sec)

--下游同步效果

mysql> select * from test_target_table;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 77 | GG | 18 |

| 81 | GG | 18 |

| 89 | GG | 18 |

| 166 | bb | 11 |

| 183 | bb | 11 |

| 2019 | pingcap | 3 |

+ ------+---------+------+

6 rows in set (1.91 sec)

--上游delete

mysql> delete from test_source_table_2 where name = 'GG' or age= '11' ;

Query OK, 5 rows affected (0.00 sec)

mysql> select * from test_source_table_2;

Empty set (0.00 sec)

--下游效果

mysql> select * from test_target_table;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 2019 | pingcap | 3 |

+ ------+---------+------+

1 row in set (0.10 sec)

--上游 insert 在 test_source_table_2 中插入 id=2019 的记录,模拟主键冲突

mysql> insert into test_source_table_2 values (2019, 'tidb' ,2);

Query OK, 1 row affected (0.00 sec)

mysql> select * from test_source_table_2;

+ ------+------+------+

| id | name | age |

+ ------+------+------+

| 2019 | tidb | 2 |

+ ------+------+------+

1 row in set (0.00 sec)

mysql> select * from test_source_table_1;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 2019 | pingcap | 3 |

+ ------+---------+------+

1 row in set (0.00 sec)

--下游效果

mysql> select * from test_target_table;

+ ------+------+------+

| id | name | age |

+ ------+------+------+

| 2019 | tidb | 2 |

+ ------+------+------+

1 row in set (0.31 sec)

-- 上游 update

mysql> update test_source_table_1 set age = 999 where name = 'pingcap' ;

Query OK, 1 row affected (0.02 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from test_source_table_1;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 2019 | pingcap | 999 |

+ ------+---------+------+

1 row in set (0.00 sec)

--下游结果

mysql> select * from test_target_table;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 2019 | pingcap | 999 |

+ ------+---------+------+

1 row in set (0.05 sec)

-- 此时发现上游按照数据同样被 replace 了

多库多表同步

gravity 可以同时启动多个,多个同步进程指向下游同一个库

默认 gravity 启动会使用 8080 端口,如果启动多个进程,需要改动默认端口

bin/gravity -config mysql2tidbtwo.toml -http-addr “:9090”

mysql> select * from test_source_table_1;

+ ----+------+------+

| id | name | age |

+ ----+------+------+

| 0 | RAFT | 10 |

+ ----+------+------+

1 row in set (0.00 sec)

mysql> select * from test_source_table_2;

+ ----+------+------+

| id | name | age |

+ ----+------+------+

| 1 | TIKV | 2 |

+ ----+------+------+

1 row in set (0.01 sec)

--源库效果

mysql> select * from test_target_table;

+ ------+---------+------+

| id | name | age |

+ ------+---------+------+

| 0 | RAFT | 10 |

| 1 | TIKV | 2 |

| 2019 | pingcap | 999 |

+ ------+---------+------+

3 rows in set (7.50 sec)

其它功能测试

filter 模块功能测试遇到 bug,摩拜正在修复

测试结果

  • 上下游同步成功 ,MySQL 到 TiDB 同步配置文件只需要修改对应 IP 和 port 就可以
  • 可以完成一库多表的合并
  • 同步之前需要在上下游创建好对应的 schema 以及表结构
  • DML 遇到主键冲突时会 replace
  • 多库合并仅限于同一数据库实例不同 schema ,跨实例合表有问题
  • MySQL 到 TiDB 同步配置文件只需要修改对应 IP 和 port 就可以

对比 TiDB-DM

Gravity 的测试调研 Gravity - TiDB相关推荐

  1. layout_weight layout_gravity gravity

    layout_weight 表示布局的权重,0或者1.比如消息框对应的EditText控件的默认布局权重是0,设定的布局高度(layout height)是fill_parent,而且它在发送按钮之前 ...

  2. 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性

    在进行UI布局的时候,可能常常会用到 android:gravity  和 android:layout_Gravity 这两个属性. 关于这两个属性的差别,网上已经有许多人进行了说明,这边再简单说一 ...

  3. layout_gravity 和 gravity

    LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravity. 他们的区别在于: android:gravity 属性是对该view中内 ...

  4. Android属性(android:gravity)的说明

    官方网址:http://developer.android.com/reference/android/R.attr.html#gravity 它(android:gravity)指明了一个对象,在其 ...

  5. gravity mysql_gravity 使用操作。

    gravity 使用操作. 最近我司有一个比较奇葩的需求,我们的环境是主从,因为数据量较大会定期的删除数据, 最近不行了,要求新建出来一个库 同步正事环境的数据,但是要剔除 delete ,drop, ...

  6. android gravity参数,android - 如何以编程方式设置layout_gravity?

    android - 如何以编程方式设置layout_gravity? 我的问题很简单, 如何以编程方式设置我的按钮layout_gravity? 我在互联网上发现了这个,但它只是抛出了一个Nullpo ...

  7. Gravity bridge——IBC Bridge to Ethereum

    1. 引言 前序博客有: Cosmos IBC The Interblockchain Communication Protocol: An Overview Cosmos IBC如何异构跨链 Gra ...

  8. Android layout_gravity 和 gravity的区别

    这两个属性,有时候蛮容易混淆,好记性不如烂笔头 ,还是直接记录下来吧 1. android:layout_gravity定义: android:layout_gravity Gravity speci ...

  9. android:layout_gravity=end,android layout_gravity 和gravity

    LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravity.(RelativeLayout是没有android:layout_grav ...

最新文章

  1. camera中LENS和SENSOR的CRA是如何搭配的?
  2. IOS上传图片的方法
  3. CVPR2020检测类论文最全汇总:136篇论文方向细分(附代码和论文打包下载)
  4. Servlet+MySQL使用DBCP数据库连接池实现用户登录
  5. 上网本 ubuntu debian android,关于Debian:在Android上的chroot ubuntu 16.04上,apt-get更新失败...
  6. Azure App Service 如何在第一时间用上最新版 .NET Core
  7. kubernetes实践之运行aspnetcore webapi微服务
  8. C++ 设置线程名字
  9. 微信小程序 地图组件使用
  10. 安卓学习第一课——电话拨号器
  11. C语言x86汇编指令理解volatile(三十五)
  12. JavaScript:加载请求本地资源工具StaticResourceUtil.js
  13. 【toLua++】toLua++编译生成tolua++.exe史上完整版
  14. ecahrts给地图添加贴图纹理
  15. 大学生必知到的外国典故
  16. 关于Java方法的学习
  17. 核心价值观与企业文化管理实践---基于华为的企业文化的管理实践-林 安老师
  18. 物联网概念火热,靠技术如何落地?
  19. 阿里云ECS服务器使用要求及不可以进行的操作
  20. this.$utils 是什么意思是

热门文章

  1. 不同网络环境下监控视频统一汇聚集中管理方案介绍
  2. Intel+Nvidia双显卡笔记本Linuxmint18下安装CUDA+OpenCV+Caffe的安装记录
  3. 2023年广西大学农村发展专业上岸学长经验、参考书推荐
  4. 说说本人学习DirectX之路
  5. HTML5前期学习准备(一)
  6. 服务器千兆网卡显示百兆,Cisco 2960交换机,服务器千兆网卡,显示百兆问题?...
  7. 美多商城项目发送短信优化
  8. 【亚马逊运营】什么情况下使用Coupon卖家们知多少?
  9. 学习记录 - Simpack之轨道车辆如何生成车轮不圆
  10. 知识管理的唯一出路:与业务融合,构建情景化知识管理体系