1. 程式人生 > >TiDB資料庫 使用syncer工具同步實時資料

TiDB資料庫 使用syncer工具同步實時資料


mysql> select campaign_id ,count(id) from creative_output group by campaign_id; 602843 rows in set (4 min 44.23 sec)
mysql> select is_cr_own ,count(id) from creative_output group by is_cr_own;
597684 rows in set (44.55 sec)

 

首先是檢視tidb資料庫的syncer工具的介紹

使用syncer工具的場景一般是:

  全量匯入歷史資料後,通過增量的方式同步新的資料 (需要 checker + mydumper + loader + syncer)。該場景需要提前開啟 binlog 且格式必須為 ROW。

主要的步驟我們可以看官網連結:

https://pingcap.com/docs-cn/op-guide/migration-overview/

注意:mysql必須開啟幾項服務才行,主要是bin-log功能,Binlog格式等等,詳細請檢視:https://pingcap.com/docs-cn/tools/syncer/  的後半部分內容。

 

有一個檔案syncer.mata需要注意:

我建立並編輯好這個檔案後放在了/usr/local/tidb-tools目錄下面,這個檔案的目錄需要在config.toml的內容中指定一下。但是我的重點是要說上面這個圖片中的“binlog-gtid”這一行的內容。因為我本次實驗沒有用到主從環境,所以暫時不考慮binlog-gtid的問題,下面列一下我的檔案內容

我只寫了這兩行資料,不過雖然沒有用到binlog-gtid的功能,也應該指定出來,把binlog-pos設定為空就可以了,例如:binlog-pos=""

 

然後我們最好使用配置檔案config.toml來啟動syncer。config.toml檔案可以放在任一位置,在啟動syncer時提供檔案即可:例如

其實位置是小問題,只是我在看文章的時候糾結z這個位置是在哪裡呢,後來才知道是小問題。

 還有幾個報錯的,我們需要注意一下:

1、報錯:就是啟動syncer的時候直接報錯

居然不能連線mysql這肯定是配置檔案的原因,檢視一下來:

log-level = "
info" server-id = 101 ## meta 檔案地址 meta = "/usr/local/tidb-tools/syncer.meta" worker-count = 16 batch = 10 ## pprof 除錯地址, Prometheus 也可以通過該地址拉取 syncer metrics ## 將 127.0.0.1 修改為相應主機 IP 地址 status-addr = "172.31.30.62:10086" ## 跳過 DDL 或者其他語句,格式為 **字首完全匹配**,如: `DROP TABLE ABC`,則至少需要填入`DROP TABLE`. # skip-sqls = ["ALTER USER", "CREATE USER"] ## 在使用 route-rules 功能後, ## replicate-do-db & replicate-ignore-db 匹配合表之後(target-schema & target-table )數值 ## 優先順序關係: replicate-do-db --> replicate-do-table --> replicate-ignore-db --> replicate-ignore-table ## 指定要同步資料庫名;支援正則匹配,表示式語句必須以 `~` 開始 #replicate-do-db = ["~^b.*","s1"] ## 指定要同步的 db.table 表 ## db-name 與 tbl-name 不支援 `db-name ="dbname,dbname2"` 格式 #[[replicate-do-table]] #db-name ="dbname" #tbl-name = "table-name" #[[replicate-do-table]] #db-name ="dbname1" #tbl-name = "table-name1" ## 指定要同步的 db.table 表;支援正則匹配,表示式語句必須以 `~` 開始 #[[replicate-do-table]] #db-name ="test" #tbl-name = "~^a.*" ## 指定**忽略**同步資料庫;支援正則匹配,表示式語句必須以 `~` 開始 #replicate-ignore-db = ["~^b.*","s1"] ## 指定**忽略**同步資料庫 ## db-name & tbl-name 不支援 `db-name ="dbname,dbname2"` 語句格式 #[[replicate-ignore-table]] #db-name = "your_db" #tbl-name = "your_table" ## 指定要**忽略**同步資料庫名;支援正則匹配,表示式語句必須以 `~` 開始 #[[replicate-ignore-table]] #db-name ="test" #tbl-name = "~^a.*" # 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 = "172.31.30.62" #是這一步出錯了 user = "root" password = "123456" port = 3306 [to] host = "172.31.30.62" user = "root" password = "" port = 4000

不知道大概什麼問題,雖然我的mysql和tidb主節點在一個機器上面,但是連線的時候指定不同的埠就可以了,可是在這裡就是行不通,我猜應該是hosts檔案對映的問題吧,但是我沒有修改hosts檔案,只是把上面的黃色區域的內容修改了為:“127.0.0.1”就成功了,我們看一下成功的例子:

 

然後你在mysql中插入資料,syncer會實時寫入tidb資料庫中。

即便把syncer關掉之後,這個時候雖然不會同步,但是一啟動程序就會立即同步mysql中之前未同步到tidb中的資料。

下面這是syncer的同步程序,在config.toml指定的