TiDB 學習第 5 天:TiDB 增量同步數據之 Syncer工具的使用

一、數據增量同步

我們之前搞定了如何使用 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 架構

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 需要的權限

權限 作用域
SELECT Tables
INSERT Tables
UPDATE Tables
DELETE Tables
CREATE Databases,tables
DROP Databases, tables
ALTER Tables
INDEX Tables

爲所同步的數據庫或者表,需要執行下面的 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章