ITPub博客

首页 > 数据库 > > TiDB Data Migration 教程

TiDB Data Migration 教程

作者:浪花小雨滴 时间:2020-05-15 15:32:57 0 删除 编辑

TiDB Data Migration (DM) 是一体化的数据同步任务管理平台,支持将大量、复杂的生产环境中的数据从 MySQL 或 MariaDB 迁移到 TiDB。

DM 功能如下:

  • 数据迁移
    • 支持导出与导入源数据库的初始全量数据,并在数据迁移过程中读取、应用来自源数据库存储的 binlog,从而保持数据的同步。
    • 通过合并上游的多个 MySQL 或 MariaDB 实例或集群的表,DM 能迁移生产环境中的分库分表。
  • 将 TiDB 作为 MySQL 或 MariaDB 的从库时,DM 能持续提高数据库水平扩展的能力,或在无需 ETL 作业的情况下,在 TiDB 上进行数据实时分析。

本教程主要介绍如何使用 DM 迁移上游多个 MySQL 实例的一个分片表。包括两种场景:

  • 合并若干个互不冲突的表或分片,即这些表或分片的表结构并不会造成唯一键的冲突;
  • 合并唯一键存在冲突的表。

本教程假设目前使用的是一台新的、纯净版 CentOS 7 实例,你能(使用 VMware、VirtualBox 及其他工具)在本地虚拟化或在供应商提供的平台上部署一台小型的云虚拟主机。因为需要运行多个服务,建议内存最好在 1 GB 以上。

警告:

本教程中 TiDB 的部署方法并不适用于生产或开发环境。

TiDB Data Migration 架构TiDB Data Migration 平台由 3 部分组成:DM-master、DM-worker 和 dmctl。

  • DM-master 负责管理和调度数据同步任务的操作。
  • DM-worker 负责执行特定的数据同步任务。
  • dmctl 是一个命令行工具,用于控制 DM 集群。

.yaml 文件中定义了各个数据同步任务,dmctl 会读取这些文件,并且这些文件会被提交给 DM-master。DM-master 再将关于给定任务的相应职责告知每个 DM-worker 实例。

详情参见 安装

本部分介绍如何部署 3 个 MySQL Server 实例及 pd-server、tikv-server 和 tidb-server 实例各 1 个,以及如何启动 1 个 DM-master 和 3 个 DM-worker 实例。

  1. 安装 MySQL 5.7,下载或提取 TiDB v3.0 以及 DM v1.0.2 安装包:

    sudo yum install -y http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm &&
    sudo yum install -y mysql-community-server &&
    curl https://download.pingcap.org/tidb-v3.0-linux-amd64.tar.gz | tar xzf - &&
    curl https://download.pingcap.org/dm-v1.0.2-linux-amd64.tar.gz | tar xzf - &&
    curl -L https://github.com/pingcap/docs/raw/master/dev/how-to/get-started/dm-cnf/dm-cnf.tgz | tar xvzf -
    
  2. 创建目录和符号链接:

    mkdir -p bin data logs &&
    ln -sf -t bin/ "$HOME"/*/bin/* &&
    [[ :$PATH: = *:$HOME/bin:* ]] || echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile && . ~/.bash_profile
    
  3. 安装 3 个 MySQL Server 实例的配置:

    tee -a "$HOME/.my.cnf" <<EoCNF
    [server]
    socket=mysql.sock
    pid-file=mysql.pid
    log-error=mysql.err
    log-bin
    auto-increment-increment=5
    [server1]
    datadir=$HOME/data/mysql1
    server-id=1
    port=3307
    auto-increment-offset=1
    [server2]
    datadir=$HOME/data/mysql2
    server-id=2
    port=3308
    auto-increment-offset=2
    [server3]
    datadir=$HOME/data/mysql3
    server-id=3
    port=3309
    auto-increment-offset=3
    EoCNF
    
  4. 初始化并启动这些 MySQL 实例:

    for i in 1 2 3
    do
        echo  "mysql$i"
        mysqld --defaults-group-suffix="$i" --initialize-insecure
        mysqld --defaults-group-suffix="$i" &
    done
    
  5. 执行 jobs 和/或 pgrep -a mysqld 以确保 MySQL Server 实例都在运行状态。

    jobs
    
    [1]   Running                 mysqld --defaults-group-suffix="$i" &
    [2]-  Running                 mysqld --defaults-group-suffix="$i" &
    [3]+  Running                 mysqld --defaults-group-suffix="$i" &
    
    pgrep -a mysqld
    
    17672 mysqld --defaults-group-suffix=1
    17727 mysqld --defaults-group-suffix=2
    17782 mysqld --defaults-group-suffix=3
    

同步分片数据

本示例场景包含 3 个分片,这些分片表结构相同,但自增主键并不重叠。

在 .my.cnf 文件中设置 auto-increment-increment=5 和 auto-increment-offset 可以实现这种情况。将 auto-increment-increment 设置为 5,则这些实例的自增 ID 以 5 为单位递增;每个实例的 auto-increment-offset 都设置得不同,则这些实例的偏移为 0 到开始计数的值。例如,若一个实例的 auto-increment-increment 为 5,auto-increment-offset 为 2,则会生成自增 ID 序列 {2,7,12,17,22,…}。

  1. 对于这 3 个 MySQL Server 实例,每个实例都分别创建数据库和表:

    for i in 1 2 3
    do
        mysql -h 127.0.0.1 -P "$((3306+i))" -u root <<EoSQL
            create database dmtest1;
            create table dmtest1.t1 (id bigint unsigned not null AUTO_INCREMENT primary key, c char(32), port int);
    EoSQL
    done
    
  2. 在每个 MySQL 实例中插入几百行数据:

    for i in 1 2 3; do
        mysql -h 127.0.0.1 -P "$((3306+i))" -u root dmtest1 <<EoSQL
            insert into t1 values (),(),(),(),(),(),(),();
            insert into t1 (id) select null from t1;
            insert into t1 (id) select null from t1;
            insert into t1 (id) select null from t1;
            insert into t1 (id) select null from t1;
            insert into t1 (id) select null from t1;
            update t1 set c=md5(id), port=@@port;
    EoSQL
    done
    
  3. 查询上一步写入的所有行并排序,以确认写入数据是正确的:

    for i in 1 2 3; do
        mysql -N -h 127.0.0.1 -P "$((3306+i))" -u root -e 'select * from dmtest1.t1'
    done | sort -n
    

注意返回的列表左侧是一列递增的、无重叠的 ID,右侧的端口编号显示这些数据插入到哪些实例以及从哪些实例中查询:

启动 DM-master 和 DM-worker

本小节介绍如何使用 DM 将来自不同的 MySQL 实例的数据合并到 TiDB 的一张表里。

配置文件包 dm-cnf.tgz 包含:

  1. 启动单个 tidb-server 实例、每个 MySQL Server 实例 (总共 3 个实例)的 DM-worker 进程和一个 DM-master 进程:

    tidb-server --log-file=logs/tidb-server.log &
    for i in 1 2 3; do dm-worker --config=dm-cnf/dm-worker$i.toml & done
    dm-master --config=dm-cnf/dm-master.toml &
    
  2. 执行 jobs 和/或 ps -a,确保这些进程都正在运行:

    jobs
    
    [1]   Running                 mysqld --defaults-group-suffix="$i" &
    [2]   Running                 mysqld --defaults-group-suffix="$i" &
    [3]   Running                 mysqld --defaults-group-suffix="$i" &
    [4]   Running                 tidb-server --log-file=logs/tidb-server.log &
    [5]   Running                 dm-worker --config=dm-cnf/dm-worker$i.toml &
    [6]   Running                 dm-worker --config=dm-cnf/dm-worker$i.toml &
    [7]-  Running                 dm-worker --config=dm-cnf/dm-worker$i.toml &
    [8]+  Running                 dm-master --config=dm-cnf/dm-master.toml &
    
    ps -a
    
       PID TTY          TIME CMD
     17317 pts/0    00:00:00 screen
     17672 pts/1    00:00:04 mysqld
     17727 pts/1    00:00:04 mysqld
     17782 pts/1    00:00:04 mysqld
     18586 pts/1    00:00:02 tidb-server
     18587 pts/1    00:00:00 dm-worker
     18588 pts/1    00:00:00 dm-worker
     18589 pts/1    00:00:00 dm-worker
     18590 pts/1    00:00:00 dm-master
     18892 pts/1    00:00:00 ps
    

每个上游的 MySQL Server 实例对应一个单独的 DM-worker 实例,每个 DM-worker 实例都有各自的配置文件。这些文件内容包括:

各个 DM-worker 通过不同的端口监听(由 worker-addr 定义)。

以下为 dm-worker1.toml 的示例:

# DM-worker 配置

server-id = 1
source-id = "mysql1"
flavor = "mysql"
worker-addr = ":8262"
log-file = "logs/worker1.log"
relay-dir = "data/relay1"
meta-dir = "data/meta1"
dir = "data/dump1"

[from]
host = "127.0.0.1"
user = "root"
password = ""
port = 3307

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3157964/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39969