041-使用DM進行同步上游數據到tidb

這是堅持技術寫做計劃(含翻譯)的第41篇,定個小目標999,每週最少2篇。php

回想一下以前數據同步通常會使用一些ETL工具,例如 DataX ,StreamSets ,Kettle,sqoop,nifi,固然也可能使用原始的mysqldump進行人肉苦逼同步。由於每一個團隊的背景不同,無法簡單的說哪一種工具更好,更優,仍是須要落地才行。因此本文就不過多介紹不一樣ETL工具間的優劣了,畢竟PHP是世界上最好的語言。html

本文主要講解,如何使用tidb官方的同步工具DM進行數據同步。先搬運一下tidb官方對dm的簡介前端

DM (Data Migration) 是一體化的數據同步任務管理平臺,支持從 MySQL 或 MariaDB 到 TiDB 的全量數據遷移和增量數據同步。使用 DM 工具備利於簡化錯誤處理流程,下降運維成本。mysql

略微吐槽下,tidb的官方技術棧略有點複雜,好比,廣義的tidb,通常是指pd,tidb,tikv這類核心組件(參考 TiDB 總體架構),可是,部署的話,得用ansible部署,監控呢,得學會看官方提供的 Prometheus+Grafana,同步數據的話,又的看 mydumper , loader,syncerData Migration ,TiDB Lightning , 管理tidb集羣的話,又會用到一些工具,好比,pd control,pd recover,tikv control,tidb controller,若是要給tidb開啓binlog,用於同步到其餘tidb或者mysql集羣,又要研究 Pump,Drainer,binlogctl ...ios

就感受tidb團隊,一看就是出身大戶人家,看官方建議的集羣配置吧。git

  • tidb集羣最低配置要求

image.png

  • dm實例配置

image.png

  • tidb-lighting配置要求(超過200G以上的遷移,建議用tidb-lighting)

image.png

  • tidb binlog的配置

image.png

因此,幾乎每個用tidb的人,第一件事,都是,如何修改ansible的參數,繞過檢測 [手動滑稽],人嘛,都是,一邊吐槽XX周邊工具太少,又會吐槽XX太多,學不動,像是初戀的少女,等遠方的男朋友,怕他亂來,又怕他不來,哈哈程序員

對比一下友商的
github

image.png

其實tidb的官方文檔,寫的還挺詳細的,就是不太像是給入門的人看的 [手動捂臉],本文主要是結合我在使用DM過程當中,寫一下遇到的問題,以及羣內大牛的解答sql

簡介

DM 簡化了單獨使用mysqldumper,loader,syncer的工做量,從易用性,健壯性和可觀測等方面來看,建議使用DM。數據庫

注意一下官方文檔寫的限制條件。

image.png

部署DM

參考  使用 DM-Ansible 部署 DM 集羣

如無特殊說明都按照官方文檔操做。

第五步配置互信時,servers 是要部署DM的節點ip,注意當前登陸名,確保是tidb(執行 woami  )

vi hosts.ini
[servers]
172.16.10.71
172.16.10.72
172.16.10.73

[all:vars]
username = tidb
複製代碼

執行 ansible-playbook -i hosts.ini create_users.yml -u root -k 時,若是是使用 ssh key的話,能夠
ansible-playbook -i hosts.ini create_users.yml -u root -k --private-key /path/to/your/keyfile

第7步配置worker時,須要注意,若是要增量或者全量,而且上游服務的binlog被刪過,而且是gtid格式的,須要執行 show VARIABLES like 'gtid_purged' 若是有值,則須要指定  relay_binlog_gtid  ,不然會報 close sync with err: ERROR 1236 (HY000): The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. 此時停掉worker後,修改 relay_binlog_gtid 重啓無效,是須要修改meta文件的 /tidb/deploy/dm_worker_/relay_log/f5df-11e7-a1dd.000001/relay.meta 感謝 軍軍

image.png

另外須要配置  enable_gtid=true 
若是不是gtid格式的,則須要修改這個  relay_binlog_name (在mysql執行 show BINARY logs )
mysql_password 須要使用 dmctl -encrypt 你的密碼 若是找不到dmctl,確保執行了 ansible-playbook local_prepare.yml 後在 /path/to/dm-ansible/resources/bin/dmctl

dm的worker支持單機多實例,也支持單機單實例(推薦) ,若是由於資源問題,要開啓單機多實例的話,

[dm_worker_servers]
dm_worker1_1 ansible_host=172.16.10.72 server_id=101 deploy_dir=/data1/dm_worker dm_worker_port=8262 mysql_host=172.16.10.81 mysql_user=root mysql_password='VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU=' mysql_port=3306
dm_worker1_2 ansible_host=172.16.10.72 server_id=102 deploy_dir=/data2/dm_worker dm_worker_port=8263 mysql_host=172.16.10.82 mysql_user=root mysql_password='VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU=' mysql_port=3306

dm_worker2_1 ansible_host=172.16.10.73 server_id=103 deploy_dir=/data1/dm_worker dm_worker_port=8262 mysql_host=172.16.10.83 mysql_user=root mysql_password='VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU=' mysql_port=3306
dm_worker2_2 ansible_host=172.16.10.73 server_id=104 deploy_dir=/data2/dm_worker dm_worker_port=8263 mysql_host=172.16.10.84 mysql_user=root mysql_password='VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU=' mysql_port=3306
複製代碼

注意 server_id=101 deploy_dir=/data1/dm_worker dm_worker_port=8262 別衝突,尤爲是 deploy_dir  和 dm_worker_port

第九步,若是部署dm的節點數太多,能夠提高併發數 ansible-playbook deploy.yml -f 10 
第十步,啓動 ansible-playbook start.yml

上述是簡單操做, 若是涉及到複雜的,例如,擴容,縮容dm節點,重啓dm-master或者dm-worker,能夠參考 DM 集羣操做

配置DM

如何看文檔

配置dm-worker的tasks,三段文檔結合着看

image.png

通常場景,使用  Data Migration 簡單使用場景 便可知足。

庫重命名

庫重命名,將上游的user,備份成user_north庫。另外,不支持實例內databases批量加前綴或者後綴。因此,有多少個須要重命名的,就乖乖寫多少個吧

routes:
  ...
 instance-1-user-rule:
 schema-pattern: "user"
 target-schema: "user_north"
複製代碼

忽略庫或者表

black-white-list:
 log-ignored:
 ignore-dbs: ["log"] # 忽略同步log庫
 ignore-tables:
 - db-name: "test" # 忽略同步log庫內的test表
 tbl-name: "log"
複製代碼

儘可能使用白名單

我的建議儘可能使用白名單進行同步,防止由於新增庫dm校驗不經過,致使task被pause掉。此時的假設是,同步任務是嚴謹的,不該該出現不可控因素。固然這只是建議。
若是 上游數據庫有,a,b,c三個庫,前期白名單隻寫了a,b,進行全量+增量同步(all模式),而且task的unit已是sync(非dump),若是此時要同步庫,此時若是隻是簡單改白名單,而後pause-task,update-task,resume-task,會報表不存在的錯。具體的解決辦法,能夠參見 我在tug上提的問題 asktug.com/t/db/616 ,感謝 wangxj@pingCAP

black-white-list:
 rule-1:
 do-dbs: ["~^test-*"] 同步全部test-開頭的庫
複製代碼

忽略drop和truncate操做

畢竟使用DM是用於同步數據,在必定程度上也能夠用於災備場景使用,萬一業務庫被人drop,truncate了,tidb這還能夠救命,因此建議忽略這些危險操做,有必要的,能夠人工去執行。

filters:
  ...
 store-filter-rule:
 schema-pattern: "store"
 events: ["drop database", "truncate table", "drop table"]
 action: Ignore
複製代碼

使用DM Portal生成配置文件,可是Portal生成的是不支持gtid的,詳見  軍軍 的解釋,詳細使用,參見 DM Portal 簡介

image.png

image.png

啓動DM

常規操做

參考 管理數據同步任務 
使用 ./dmctl -master-addr 172.16.30.14 進入交互式命令界面(不支持非交互式的,致使我在使用中遇到,當報錯信息特別大時,超過緩衝區,會致使看不到有效的報錯信息,check-task xx-task >result.log 這種的不支持,但願後邊能改進下 )

  • 啓動任務 start-task /path/to/task.yaml  注意是task文件,而不是任務名
  • 查詢任務 query-status [task-name] task-name是可選的,不填查全部,填了,只查指定的
  • 暫停任務 pause-task task-name ,若是要更新task文件(update-task) task必定要處於pause狀態(報錯致使的pause也行)
  • 恢復同步 resume-task task-name 處於暫停(pause)的任務要恢復,須要使用resume-task ,若是是 full 或者 all 時unit處於dump狀態的(非load),resume-task時會清空已經dump到本地的文件,從新拉取(想一想200多G的數據庫,到99%了,忽然pause了,就肝兒顫)
  • 更新同步任務 update-task /path/to/task.yaml 注意是task文件,不是任務名,執行更新操做,必須是pause狀態,因此,儘可能別再dump時執行update,要執行也是在前期執行。執行後,須要使用 resume-task 啓動已pause的任務
  • 中止任務 stop-task task-name

常見問題

  1. check經過,start時報錯,或者start也正常,query時報錯,這種錯,有跟沒有區別不大,只能ssh到worker節點,看日誌 /path/to/deploy/log/

image.png

  1. Couldn't acquire LOCK BINLOG FOR BACKUP, snapshots will not be consistent:Access denied; you need (at least one of) the SUPER privilege(s) for this operation

image.png

若是沒有reload權限,會報錯,可是不會終止操做,能夠忽略
注意,若是是阿里雲的rds的話,默認是把reload權限給去掉的。
image.png

  1. sql-mode 不一致引發的問題,mysql默認的sql-mode是空字符串,參考 SQL 模式 ,排查方式 SELECT @@sql_mode ,若是是tidb是新庫,能夠 set global sql_mode=''; 若是要改mysql的話,須要寫到 my.ini 裏,防止重啓失效。

image.png

  1. all模式同步數據,若是task狀態已是sync,此時這個task白名單新增庫或者表會致使報錯,表不存在,而後task被pause。要麼使用full-task+incremental-task兩個文件,每次白名單新增時,先更新full-task,再更新incremental-task,要麼直接新啓一個task,用於full更新白名單庫,而後改all的task,重啓便可。

image.png

  1. 處於dump的任務,一旦pause了,再次resume,會刪除已dump的數據文件,從新拉取

image.png

招聘小廣告

山東濟南的小夥伴歡迎投簡歷啊 加入咱們 , 一塊兒搞事情。
長期招聘,Java程序員,大數據工程師,運維工程師,前端工程師。

參考資料

相關文章
相關標籤/搜索