title | category |
---|---|
Syncer 使用文档 |
advanced |
# 下载 tool 压缩包
wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz
wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256
# 检查文件完整性,返回 ok 则正确
sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256
# 解开压缩包
tar -xzf tidb-enterprise-tools-latest-linux-amd64.tar.gz
cd tidb-enterprise-tools-latest-linux-amd64
Syncer 可以部署在任一台可以连通对应的 MySQL 和 TiDB 集群的机器上,推荐部署在 TiDB 集群。
-
MySQL 开启 binlog 功能,参考 Setting the Replication Master Configuration
-
Binlog 格式必须使用
ROW
format,这也是 MySQL 5.7 之后推荐的 binlog 格式,可以使用如下语句打开:SET GLOBAL binlog_format = ROW;
设置 syncer 的 meta 文件, 这里假设 meta 文件是 syncer.meta
:
# cat syncer.meta
binlog-name = "mysql-bin.000003"
binlog-pos = 930143241
binlog-gtid = "2bfabd22-fff7-11e6-97f7-f02fa73bcb01:1-23,61ccbb5d-c82d-11e6-ac2e-487b6bd31bf7:1-4"
- 注意:
syncer.meta
只需要第一次使用的时候配置,后续syncer
同步新的 binlog 之后会自动将其更新到最新的 position - 注意: 如果使用 binlog position 同步则只需要配置 binlog-name binlog-pos; 使用 gtid 同步则只需要设置 gtid
syncer
的配置文件 config.toml
:
log-level = "info"
server-id = 101
# meta 文件地址
meta = "./syncer.meta"
worker-count = 1
batch = 1
# pprof 调试地址, Prometheus 也可以通过该地址拉取 syncer metrics
status-addr = ":10081"
skip-sqls = ["ALTER USER", "CREATE USER"]
# 支持白名单过滤, 指定只同步的某些库和某些表, 例如:
# 指定同步 db1 和 db2 下的所有表
replicate-do-db = ["db1","db2"]
# 指定同步 db1.table1
[[replicate-do-table]]
db-name ="db1"
tbl-name = "table1"
# 指定同步 db3.table2
[[replicate-do-table]]
db-name ="db3"
tbl-name = "table2"
# 支持正则,以~开头表示使用正则
# 同步所有以 test 开头的库
replicate-do-db = ["~^test.*"]
# sharding 同步规则,采用 wildcharacter
# 1. 星号字符 (*) 可以匹配零个或者多个字符,
# 例子, doc* 匹配 doc 和 document, 但是和 dodo 不匹配;
# 星号只能放在 pattern 结尾,并且一个 pattern 中只能有一个
# 2. 问号字符 (?) 匹配任一一个字符
[[route-rules]]
pattern-schema = "route_*"
pattern-table = "abc_*"
target-schema = "route"
target-table = "abc"
[[route-rules]]
pattern-schema = "route_*"
pattern-table = "xyz_*"
target-schema = "route"
target-table = "xyz"
[from]
host = "127.0.0.1"
user = "root"
password = ""
port = 3306
[to]
host = "127.0.0.1"
user = "root"
password = ""
port = 4000
启动 syncer
:
./bin/syncer -config config.toml
2016/10/27 15:22:01 binlogsyncer.go:226: [info] begin to sync binlog from position (mysql-bin.000003, 1280)
2016/10/27 15:22:01 binlogsyncer.go:130: [info] register slave for master server 127.0.0.1:3306
2016/10/27 15:22:01 binlogsyncer.go:552: [info] rotate to (mysql-bin.000003, 1280)
2016/10/27 15:22:01 syncer.go:549: [info] rotate binlog to (mysql-bin.000003, 1280)
INSERT INTO t1 VALUES (4, 4), (5, 5);
登录到 TiDB 查看:
mysql -h127.0.0.1 -P4000 -uroot -p
mysql> select * from t1;
+----+------+
| id | age |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
syncer
每隔 30s 会输出当前的同步统计,如下
2017/06/08 01:18:51 syncer.go:934: [info] [syncer]total events = 15, total tps = 130, recent tps = 4,
master-binlog = (ON.000001, 11992), master-binlog-gtid=53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-74,
syncer-binlog = (ON.000001, 2504), syncer-binlog-gtid = 53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-17
2017/06/08 01:19:21 syncer.go:934: [info] [syncer]total events = 15, total tps = 191, recent tps = 2,
master-binlog = (ON.000001, 11992), master-binlog-gtid=53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-74,
syncer-binlog = (ON.000001, 2504), syncer-binlog-gtid = 53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-35
可以看到,使用 syncer
,我们就能自动的将 MySQL 的更新同步到 TiDB。
根据上面的 route-rules 可以支持将分库分表的数据导入到同一个库同一个表中,但是在开始前需要检查分库分表规则
- 是否可以利用 route-rule 的语义规则表示
- 分表中是否包含唯一递增主键,或者合并后数据上有冲突的唯一索引或者主键
则只需要在所有 mysql 实例下面,启动 syncer, 并且设置以下 route-rule
[[route-rules]]
pattern-schema = "example_db"
pattern-table = "table_*"
target-schema = "example_db"
target-table = "table"
Syncer 使用开源时序数据库 Prometheus 作为监控和性能指标信息存储方案,使用 Grafana 作为可视化组件进行展示,配合 AlertManager 来实现报警。其方案如下图