TIDB-Data Migration-配置-简单的同步场景

一、拓扑

        在写配置之前稍微“抱怨”一下TIDB对机器的要求,如果没有云主机或者公司提供的环境做测试,想在自己笔记本上面搭建TIDB的环境还是有点吃力的。本来想在自己的笔记本环境下用sysbench对单机的mysql和tidb做一次简单的压测,然后发现压力一上来主机就扛不住了,TIDB也随之崩了。

拓扑环境:

172.1.1.101 TIDB1/PD1 monitor 中控 dm-work1

172.1.1.102 TIDB2/PD2 dm-work2

172.1.1.103 TIKV1

172.1.1.104 TIKV2

172.1.1.106 TIKV3

172.1.1.107 PD dm-master  dm-monitor

上游mysql:

实例1:172.1.1.21:3306

实例2:172.1.1.21:3307

 实例1现有的表:user.information/user.log,store.store_bj/store.store_sz/store.store_tj,log.messages

实例2现有的表:user.information/user.log,store.store_sh/store_sz,log.messages

同步需求

1、不合并 user 库。

    将实例 1 中的 user 库同步到下游 TiDB 的 user_north 库中。

    将实例 2 中的 user 库同步到下游 TiDB 的 user_east 库中。

2、将上游 store 库同步到下游 store 库中,且同步过程中不合并表。

    实例 1和实例 2 中都存在 store_sz 表,且这两个 store_sz 表分别被同步到下游的 store_suzhou 表和 store_shenzhen 表中

    任何情况下都不删除 store 库的任何数据。

3、log 库需要被过滤掉。

二、配置过程

       在使用DM的过程中需要注意一下对上游数据库的要求,主要有版本要求、binlog配置的要求(比如binlog_format/binlog_row_image等)、上游数据库中dm用户的权限要求(REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SELECT)。

 部署dm

 ###############

1. 中控机安装依赖包

# su - root

# yum -y install epel-release git curl sshpass

# yum -y install python2-pip



2. 中控机创建tidb用户,为tidb添加sudo权限

# useradd -m -d /home/tidb tidb

修改tidb用户密码

# passwd tidb

配置 tidb 用户sudo权限

# visudo

--添加以下内容

tidb ALL=(ALL) NOPASSWD: ALL



3. tidb用户创建ssh key

# su - tidb

$ ssh-keygen -t rsa

--提示时直接敲几次回车即可。



4. 在中控机器上下载 TiDB-Ansible

tidb用户

# su - tidb

$ cd /home/tidb/

下载最新dm版本

$ wget http://download.pingcap.org/dm-ansible-latest.tar.gz

解压

$ tar -xzvf dm-ansible-latest.tar.gz

$ mv dm-ansible-latest dm-ansible



5. 在中控机器上安装 Ansible 及其依赖

$ cd /home/tidb/tidb-ansible/

$ sudo pip install -r ./requirements.txt 

验证ansible版本:

$  ansible --version



6、配置hosts.ini

[tidb@tidb01 dm-ansible]$ more hosts.ini

[servers]

172.1.1.101

172.1.1.102

172.1.1.107

[all:vars]

username = tidb



7、为集群集群创建用户配置ssh互信和下载文件

ansible-playbook -i hosts.ini create_users.yml -u root -k

ansible-playbook local_prepare.yml

$ cd /home/tidb/dm-ansible

$ ansible -i inventory.ini all -m shell -a 'whoami'

$ ansible -i inventory.ini all -m shell -a 'whoami' -b



9、配置inventory文件

##配置说明详见官方文档,主要还是dm-worker的配置,一个mysql实例对应一个dm-worker,在配置过程中主要还是注意拓扑的配置,密码记得用dmctl加密,同时最好启动dm_portal的图形配置功能,不然后续的任务配置真的很繁琐。另外提一点和配置不相干的话,之前一直以为purge-expires和purge-interval的单位是天,看了文档才知道purge-expires的单位是小时,interval的单位是秒钟~~

[tidb@tidb01 dm-ansible]$ more inventory.ini

## DM modules

[dm_master_servers]

dm_master ansible_host=172.1.1.107

[dm_worker_servers]

dm-worker1 ansible_host=172.1.1.101 source_id="mysql-replica-01" server_id=101 mysql_host=172.1.1.21 mysql_user=dm

_user mysql_password=xGlHW/69swrw67TY2hGGb0DoIFg= mysql_port=3306

dm-worker2 ansible_host=172.1.1.102 source_id="mysql-replica-02" server_id=102 mysql_host=172.1.1.21 mysql_user=dm

_user mysql_password=xGlHW/69swrw67TY2hGGb0DoIFg= mysql_port=3307

[dm_portal_servers]

dm_portal ansible_host=172.1.1.107

## Monitoring modules

[prometheus_servers]

prometheus ansible_host=172.1.1.107

[grafana_servers]

grafana ansible_host=172.1.1.107

[alertmanager_servers]

alertmanager ansible_host=172.1.1.107

## Global variables

[all:vars]

cluster_name = dm-test-cluster

ansible_user = tidb

dm_version = latest

deploy_dir = /data1/dm/delay

grafana_admin_user = "admin"

grafana_admin_password = "admin"


12、部署DM和启动

    $ ansible-playbook deploy.yml

$ ansible-playbook start.yml

./dmctl --master-addr 172.1.1.107:8261进入dmctl,使用query-status查看状态,没报错就是正常了~ 另外关注一下dm-worker的信息,不要看到没报错就认为OK,显示少了dm-worker都不知道~

同步任务配置

##非常初步的配置,很多都使用了默认数据,管它呢,现在先搞清楚怎么配置table-routing/binlog event filter和黑白名单在说~ PS:不太会用简书,贴出来太丑了~估计格式都变了

[tidb@tidb01 conf]$ cat my_test.yaml

name: dm_log_user_store # global unique

task-mode: all  # full/incremental/all

is-sharding: false 

meta-schema: "dm_meta" 

remove-meta: false 

enable-heartbeat: false 

target-database:

  host: "172.1.1.101"

  port: 4000

  user: "root"

  password: ""

mysql-instances:           

  -

    source-id: "mysql-replica-01"

    route-rules: ["instance-3306-user-rules","instance-3306-store-rules"]

    filter-rules: ["log-filter-rules", "store-filter-rules"]

    black-white-list:  "log-ignored"

    loader-config-name: "global"

    syncer-config-name: "global"

  -

    source-id: "mysql-replica-02"

    route-rules: ["instance-3307-user-rules","instance-3307-store-rules"]

    filter-rules: ["log-filter-rules", "store-filter-rules"]

    black-white-list: "log-ignored"

    loader-config-name: "global"   

    syncer-config-name: "global"   

routes:                     

  instance-3306-user-rules:

    schema-pattern: "user"   

    target-schema: "user_north"     

  instance-3307-user-rules:

    schema-pattern: "user*"

    target-schema: "user_east"

  instance-3306-store-rules:

    schema-pattern: "store"

    table-pattern: "store_sz"

    target-schema: "store"

    target-table:  "store_suzhou"

  instance-3307-store-rules:

    schema-pattern: "store"

    table-pattern: "store_sz"

    target-schema: "store"

    target-table:  "store_shenzhen"


filters:                   

  log-filter-rules:

    schema-pattern: "user"   

    table-pattern: "log"       

    events: ["truncate table", "drop table","delete"] 

    action: Ignore

  store-filter-rules:

    schema-pattern: "store"   

    events: ["truncate table", "drop table","delete","drop database"] 

    action: Ignore

black-white-list:

  log-ignored:

    ignore-dbs: ["log"]

mydumpers:

  global:

    mydumper-path: "./bin/mydumper"

    threads: 4

    chunk-filesize: 64

    skip-tz-utc: true

    extra-args: "-B test -T t1,t2 --no-locks"

loaders:                   

  global:

    pool-size: 16

    dir: "./dumped_data"

syncers:                   

  global:

    worker-count: 16

    batch: 100

三、遇到的问题 

配置不当产生的问题

问题1:只能看到一个dm-worker

原因:不仔细导致,在inventory配置的时候把两个实例使用同样的dm-worker名了,修改后重新deploy解决。


问题2:启动时候各种报错,明明配置内容没问题就是启动不了

特别特别特别大的坑!!!  对齐格式的时候不要用tab,要用空格补全!要用空格补全!要用空格补全!

操作产生的问题

问题1:不能停止task,这里卡了我好久,明明有这个任务的存在就是不能停止


报错

原因:手贱~ 多敲了一个分号!


四、思考

做完了这个测试时候就在想,在start一个任务之后使用stop停止,之后又使用start启动,会不会又来一次全量的导出导入呢?

做了测试之后发现不会重新做全量的导入和导出,我猜应该是因为有dm_log_user_store_loader_checkpoint和dm_log_user_store_syncer_checkpoint表的存在吧,这些表记录了导入导出的元数据信息。但是如果把我这两个表破drop后呢?这个时候就发现dumped_data.dm_log_user_store的那一堆sql文件创建时间被更新了,说明做了导出,并且下游数据变多了说明数据做了导入,其实这个时候下游数据和上游数据已经不一致了(测试表没创建pk)。找了一下相关资料,从原理中理解了问题的所在:

load处理单元导入ddl的流程:

    获取{db}-schema-create.sql/{db}.{table}-schema.sql文件列表

    根据文件名字进行库表的过滤判断black-white-list

    获取创建库、表的语句

    替换ddl,router-rules

    执行语句

    因为使用的默认参数的导出,mydumper部分没有配置~,导出的create table/create schema这些sql文件都只有create、没有drop参数~  如果我想要实现类似oracle中impdp的table_exist_action=replace的功能,估计需要通过设置mydump的扩展参数实现,目前还没做测试~~到时候发测试结果

-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容