gravity是由膜拜公司自主研发的不同数据库间数据同步工具。
官方介绍:https://github.com/moiot/gravity/blob/master/README-cn.md
Gravity 是一款数据复制组件,提供全量、增量数据同步,以及向消息队列发布数据更新。
DRC 的设计目标是:
支持多种数据源和目标的,可灵活定制的数据复制组件
支持基于 Kubernetes 的 PaaS 平台,简化运维任务
使用场景
- 大数据总线:发送 MySQL Binlog,Mongo Oplog 的数据变更到 kafka 供下游消费
- 单向数据同步:MySQL --> MySQL 的全量、增量同步
- 双向数据同步:MySQL <--> MySQL 的双向增量同步,同步过程中可以防止循环复制
- 分库分表到合库的同步:MySQL 分库分表 --> 合库的同步,可以指定源表和目标表的对应关系
- 在线数据变换:同步过程中,可支持对进行数据变换
Gravity是摩拜单车数据库团队自研的一套数据复制组件,目前已经稳定支撑了摩拜单车公司数百条同步通道,TPS 50000/s,
80线延迟小于50ms。使用go语言编写,具有如下特点:
1.多数据源(MySQL, MongoDB, TiDB, PostgreSQL)
2.支持异构(不同的库、表、字段之间同步),支持分库分表到合表的同步。
3.支持双活&多活,复制过程将流量打标,避免循环复制。
4.管理节点高可用,故障恢复不会丢失数据
5.支持filter plugin (语句过滤,类型过滤,column过滤等多维度的过滤)。
6.支持传输过程进行数据转换。
7. 一键全量+增量迁移数据。
8. 轻量级,稳定高效,容易部署。
9.支持基于Kubernetes 的PaaS 平台,简化运维任务。
使用场景:
1.大数据总线:发送MySQL Binlog,Mongo Oplog,TiDB Binlog 的增量数据到 Kafka供下游消费。
2.单向数据同步:MySQL → MySQL&TiDB 的全量、增量同步。
3.双向数据同步:MySQL ↔ MySQL 的双向增量同步,同步过程中可以防止循环复制。
4.分库分表到合库的同步:MySQL 分库分表--> 合库的同步,可以指定源表和目标表的对应关系。
5.数据清洗: 同步过程中,可通过filter plugin 将数据自定义转换。
6.数据归档: MySQL→ 归档库 ,同步链路中过滤掉delete 语句。
Gravity 的设计初衷是要将多种数据源联合到一起,互相打通,让业务设计上更灵活,数据复制、数据转换变的更容易,
能够帮助大家更容易的将业务平滑迁移到TiDB 上面。
该项目已经在GitHub 开源,欢迎大家交流使用 https://github.com/moiot/gravity
一、安装配置golang
golang 针对中国用户有专门的网站:
https://golang.google.cn/dl/
下载文件:
# wget https://dl.google.com/go/go1.17.linux-amd64.tar.gz
解压文件:
# tar -xzvf go1.17.linux-amd64.tar.gz -C /usr/local/
设置环境变量:
# vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
# source /etc/profile
版本验证:
# go version
go version go1.12 linux/amd64
2 命令
2.1 指定module的根目录并生成go.mod文件
go mod init example.com/hello
2.2 下载并添加依赖到go.mod文件中
go build, go test
2.3 查看module下的所有依赖
go list -m all
2.4 更新稳定版依赖
go get rsc.io/sampler
2.5 更新为指定版本依赖
go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
go get rsc.io/sampler@v1.3.1
2.6 清理无用的依赖
go mod tidy
2.7 将依赖复制到项目路径的vendor文件夹中
go mod vendor
2.8 忽略cache里的包,只使用vendor目录里的依赖进行编译
go build -mod=vendor
2.9 校验依赖并查看是否有修改
go mod verify
二、安装配置gravity
1.前提条件:安装部署好golang的环境变量:
2.下载gravity的代码:
下载地址:https://github.com/moiot/gravity/releases
选择需要的版本
# wget https://github.com/moiot/gravity/archive/v0.9.61.tar.gz
注释:
由于还是老的模式组织目录结构,需要把项目放在 ${GOPATH}/src/github.com/moiot/
3.由于目前的版本不支持go module功能需要解压到 指定的目录 go/src目录:
# mkdir -p /usr/local/go/src/github.com/moiot/
# tar -xzvf v0.9.25.tar.gz -C /usr/local/go/src/github.com/moiot/
# mv gravity-0.9.25/ gravity
或者直接clone 源代码:
# git clone https://github.com/moiot/gravity.git
#export GOPROXY=https://goproxy.io
# make
#export GOPROXY=
注:解决方法:
换一个国内能访问的代理地址:https://goproxy.cn
执行命令:go env -w GOPROXY=https://goproxy.cn
重新执行命令,完美通过
##查看帮助信息:
# ./bin/gravity --help -L warn
Usage of gravity:
-L string
log level: debug, info, warn, error, fatal (default 'info') (default "info")
-V print version and exit
-config string
path to config file
-http-addr string
http-addr (default ":8080")
-log-file string
log file path
-log-format string
log format (default "json")
##版本查询:
# ./bin/gravity -V
Release Version (gravity): 0.0.1+git.
Git Commit Hash:
Git Branch:
UTC Build Time: 2019-07-26 02:58:06
三、问题解决
#执行make命令时,由于一些依赖包需要翻墙才能下载到,所以go在这里自动下载相应的包或依赖包时,会出现timeout问题,无法下载或加载依赖包。。最终导致make失败
go: golang.org/x/net@v0.0.0-20190311183353-d8887717615a: unrecognized import path "golang.org/x/net" (https fetch: Get https://golang.org/x/net?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
go: google.golang.org/grpc@v1.19.0: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
go: golang.org/x/sys@v0.0.0-20180905080454-ebe1bf3edb33: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
go: finding github.com/pingcap/parser v0.0.0-20190118120648-5958b6fcdb2d
go: golang.org/x/crypto@v0.0.0-20180904163835-0709b304e793: unrecognized import path "golang.org/x/crypto" (https fetch: Get https://golang.org/x/crypto?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
解决方法:
设置以下环境变量:
export GOPROXY=https://goproxy.io
然后在执行make命令。
原因:
设置了GOPROXY环境变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。 https://goproxy.io是官方提供公用的代理服务。
通过设置该环境变量:export GOPROXY=https://goproxy.io 后即可正常下载墙外的源码包了:
也可以通过置空这个环境变量来关闭,export GOPROXY=
需要Go version >= 1.11。