TiDB 学习第 5 天:TiDB 增量同步数据之 Syncer工具的使用

x33g5p2x  于2021-12-19 转载在 其他  
字(4.9k)|赞(0)|评价(0)|浏览(679)

一、数据增量同步

我们之前搞定了如何使用 mydumper/loader 将 MySQL 的数据全量导入到 TiDB,但如果后续 MySQL 的数据有更新,我们仍然希望快速导入,这时候使用全量的方式就不合适了。
TiDB 提供 syncer 工具能方便的将 MySQL 的数据增量的导入到 TiDB 里面。
步骤同样需要下载工具集,由于这里是测试环境,工具集已经下载了,所以直接用即可

二、场景描述

之前我们已经使用 mydumper/loader 导入了reports 数据库中 RMAN_USERGROUPHISTORY这张表的数据,现在我们希望这两张表的任何更新,更新的数据都是实时的同步到 TiDB 上面。

三、同步工具

TiDB 数据同步用 Syncer 进行操作,Syncer 是一个数据导入工具,能方便地将 MySQL 的数据增量导入到 TiDB。Syncer 包含在 tidb-enterprise-tools 安装包中,下载地址

1、Syncer 架构

2、Syncer 部署位置

Syncer 可以部署在任一台可以连通对应的 MySQL 和 TiDB 集群的机器上,推荐部署在 TiDB 集群。

四、Syncer 同步前预检查了

数据在同步前需要进行预检查,如果参数或者状态不对应数据会同步不成功

1、检查数据库版本,Syncer 只支持以下版本
select @@version   
    5.5 < MySQL 版本 < 5.8
    MariaDB 版本 >= 10.1.2 #(更早版本的 binlog 部分字段类型格式与 MySQL 不一致)
2、检查源库 server-id
show global variables like 'server_id';

结果为空或者为 0,Syncer 无法同步数据。
Syncer server-id 与 MySQL server-id 不能相同,且必须在 MySQL cluster 中唯一。

3、检查 Binlog 相关参数

Binlog 是Mysql的二进制文件
a、它的开启用于数据增量备份
b、用于主从复制,mysql注节点维护了一个binlog日志文件,从节点从binlog中同步数据
1)检查 Mysql 的 Binlog 是否开启,使用如下命令确认开启

show global variables like 'log_bin';

如果结果是 log_bin = OFF,则需要开启 binlog,详情请见 Mysql 开启 Binlog

4、检查 MySQL binlog 格式是否为 ROW

binlog 格式必须为 ROW,且参数 binlog_row_image 必须设置为 FULL,可使用如下命令查看参数设置:

show global variables like 'binlog_format';

如果发现 binlog 格式是其他格式,可以通过如下命令设置为 ROW:

mysql>set global binlog_format=ROW;
mysql>flush logs;

如果 MySQL 有连接,建议重启 MySQL 服务或者杀掉所有连接。

5、检查 MySQL binlog_row_image 是否为 FULL。
show global variables like 'binlog_row_image';

设置格式为FULL 设置的前提是binlog_format为ROW类型的 其他的不起作用

set global binlog_row_image = FULL;
6、检查用户权限。

全量导出的 mydumper 需要的用户权限。

  • mydumper 导出数据至少拥有以下权限:select, reload。
  • mydumper 操作对象为 RDS 时,可以添加 --no-locks 参数,避免申请 reload 权限。
  • 增量同步 Syncer 需要的上游 MySQL/MariaDB 用户权限。
  • 需要上游 MySQL 同步账号至少赋予以下权限:
select , replication slave , replication client

查看mysql用户权限

show grants for root;
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'/GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX ON db.table TO 'your_user'@'your_wildcard_of_host';

下游 TIDB 需要的权限

权限作用域
SELECTTables
INSERTTables
UPDATETables
DELETETables
CREATEDatabases,tables
DROPDatabases, tables
ALTERTables
INDEXTables

为所同步的数据库或者表,需要执行下面的 GRANT 语句:

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX  ON db.table TO 'your_user'@'your_wildcard_of_host';
7、检查 SQL mode。

必须确认上下游的 SQL mode 一致;如果不一致,则会出现数据同步的错误。

show variables like '%sql_mode%';

如果不一致需要 修改成一致

8、linux中修改mysql的sql_mode

在etc/my.cnf配置文件中加上 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

注意: TiDB中的sql_mode在安装路径下的配置文件中加上即可

五、Syncer 配置

1、指定数据库同步

本部分将通过实际案例描述 Syncer 同步数据库参数的优先级关系。

  • 如果使用 route-rules 规则,参考 Sharding 同步支持
  • 优先级:replicate-do-db –> replicate-do-table –> replicate-ignore-db –> replicate-ignore-table
    详情请见 TiDB官网 Syncer 配置说明

六、Syncer 增量同步示例

1、设置同步开始的 position

设置 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;如果使用 binlog-gtid 同步则需要设置 binlog-gtid,且启动 Syncer 时带有 --enable-gtid。
2、启动 Syncer

Syncer 的命令行参数:

Usage of syncer:
  -L string
      日志等级: debug, info, warn, error, fatal (默认为 "info")
  -V
      输出 Syncer 版本;默认 false
  -auto-fix-gtid
      当 mysql master/slave 切换时,自动修复 gtid 信息;默认 false
  -b int
      batch 事务大小 (默认 100)
  -c int
      Syncer 处理 batch 线程数 (默认 16)
  -config string
      指定相应配置文件启动 Sycner 服务;如 `--config config.toml`
  -enable-ansi-quotes
      使用 ANSI_QUOTES sql_mode 来解析 SQL 语句
  -enable-gtid
      使用 gtid 模式启动 Syncer;默认 false,开启前需要上游 MySQL 开启 GTID 功能
  -flavor string
      上游数据库实例类型,目前支持 "mysql" 和 "mariadb"
  -log-file string
      指定日志文件目录;如 `--log-file ./syncer.log`
  -log-rotate string
      指定日志切割周期, hour/day (默认 "day")
  -max-retry int
      SQL 请求由于网络异常等原因出错时的最大重试次数(默认值为 100)
  -meta string
      指定 Syncer 上游 meta 信息文件  (默认与配置文件相同目录下 "syncer.meta")
  -persistent-dir string
      指定同步过程中历史 schema 结构的保存文件地址,如果设置为空,则不保存历史 schema 结构;如果不为空,则根据 binlog 里面包含的数据的 column 长度选择 schema 来还原 DML 语句
  -safe-mode
      指定是否开启 safe mode,让 Syncer 在任何情况下可重入
  -server-id int
      指定 MySQL slave sever-id (默认 101)
  -status-addr string
      指定 syncer metric 信息; 如 `--status-addr 127:0.0.1:10088`
  -timezone string
      目标数据库使用的时区,请使用 IANA 时区标识符,如 `Asia/Shanghai`

Syncer 的配置文件 config.toml:

log-level = "info"
log-file = "syncer.log"
log-rotate = "day"

server-id = 101

## meta 文件地址
meta = "./syncer.meta"
worker-count = 16
batch = 100
flavor = "mysql"

## Prometheus 可以通过该地址拉取 Syncer metrics,也是 Syncer 的 pprof 调试地址
status-addr = ":8271"

## 如果设置为 true,Syncer 遇到 DDL 语句时就会停止退出
stop-on-ddl = false

## SQL 请求由于网络异常等原因出错时的最大重试次数
max-retry = 100

## 指定目标数据库使用的时区,binlog 中所有 timestamp 字段会按照该时区进行转换,默认使用 Syncer 本地时区
# timezone = "Asia/Shanghai"

## 跳过 DDL 语句,格式为 **前缀完全匹配**,如:`DROP TABLE ABC` 至少需要填入 `DROP TABLE`
# skip-ddls = ["ALTER USER", "CREATE USER"]
……
……
……

[from]
host = "127.0.0.1"
user = "root"
password = ""
port = 3306

[to]
host = "127.0.0.1"
user = "root"
password = ""
port = 4000

启动:

./bin/syncer -config config.toml
2、在 MySQL 中插入新的数据
INSERT INTO table1 VALUES (4, 4), (5, 5);

登录到 TiDB 查看:

mysql -h127.0.0.1 -P4000 -uroot -p
select * from t1;
+----+------+
| id | age  |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+

总结:本章节介绍了 TiDB 数据同步工具的运用,一部分是参照官网而写,一部分是实操演练,以此篇来对自己所做工作做一个小结。

参考:

https://pingcap.com/docs-cn/stable/reference/tools/syncer/

相关文章