这是坚持技术写做计划(含翻译)的第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,syncer, Data Migration ,TiDB Lightning , 管理tidb集群的话,又会用到一些工具,好比,pd control,pd recover,tikv control,tidb controller,若是要给tidb开启binlog,用于同步到其余tidb或者mysql集群,又要研究 Pump,Drainer,binlogctl ...ios
就感受tidb团队,一看就是出身大户人家,看官方建议的集群配置吧。git
因此,几乎每个用tidb的人,第一件事,都是,如何修改ansible的参数,绕过检测 [手动滑稽],人嘛,都是,一边吐槽XX周边工具太少,又会吐槽XX太多,学不动,像是初恋的少女,等远方的男朋友,怕他乱来,又怕他不来,哈哈程序员
对比一下友商的
github
其实tidb的官方文档,写的还挺详细的,就是不太像是给入门的人看的 [手动捂脸],本文主要是结合我在使用DM过程当中,写一下遇到的问题,以及群内大牛的解答sql
DM 简化了单独使用mysqldumper,loader,syncer的工做量,从易用性,健壮性和可观测等方面来看,建议使用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
感谢 军军
enable_gtid=true
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-worker的tasks,三段文档结合着看
库重命名,将上游的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-开头的库
复制代码
毕竟使用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 简介
参考 管理数据同步任务
使用 ./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
/path/to/deploy/log/
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
SELECT @@sql_mode
,若是是tidb是新库,能够 set global sql_mode='';
若是要改mysql的话,须要写到 my.ini
里,防止重启失效。山东济南的小伙伴欢迎投简历啊 加入咱们 , 一块儿搞事情。
长期招聘,Java程序员,大数据工程师,运维工程师,前端工程师。