一、數據增量同步
我們之前搞定了如何使用 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 需要的權限
權限 | 作用域 |
---|---|
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 數據同步工具的運用,一部分是參照官網而寫,一部分是實操演練,以此篇來對自己所做工作做一個小結。
參考: