TiDB >> 集群数据迁移和滚动升级

文章目录

    • 数据迁移
      • 从线上集群迁移到新部署的TiDB集群
      • 集群信息
      • 集群版本
      • 数据导出
        • mydumper
          • 准备工作
          • 执行全量导出
          • 导出完成
      • 数据导入
        • 全量导入
          • loader
          • 准备工作
          • 执行全量导入
          • 导入完成
        • 增量导入
          • Drainer
    • 升级
      • Ansible滚动升级
        • 注意事项(官方要求)
        • 集群信息
        • 中控机安装Ansible及依赖
        • 滚动升级
        • 测试验证
    • 总结

数据迁移

从线上集群迁移到新部署的TiDB集群

由于需要跨版本升级线上TiDB集群,需要部署新集群进行过渡升级,因此涉及数据迁移过程,故进行简单记录。

集群信息

  1. 线上TiDB集群(作为数据源)

三台物理节点服务器,其中127为集群中控机。

  • 10.0.0.127
  • 10.0.0.168
  • 10.0.0.169
  1. 新TiDB集群

三台物理节点服务器,其中182为集群中控机

  • 10.0.0.182
  • 10.0.0.183
  • 10.0.0.184

集群版本

  1. v2.0.8
  2. v2.0.11-binlog

数据导出

mydumper

TiDB数据库,官方推荐使用mydumper工具进行数据导出,虽然同样也支持mysqldump工具,但相较于mydumper在大数据量迁移时性能上会慢一些,因此官方不推荐使用。使用方法详见官方文档。

准备工作
  1. 数据导出需要的权限(至少)
  • SELECT
  • RELOAD
  • LOCK TABLES

这里为了方便,我直接用root账号进行操作

  1. 限制导出的文件大小
  • 导出时使用-F 64 限制文件大小不超过64M
  1. 创建数据导出目录
  • mkdir -p /data/tidb/10.0.0.127_4000/$(date "+%Y-%m-%d-%H")
  1. 生成Drainer启动所需的meta文件
  • binlogctl -pd-urls=http://10.0.0.127:2379 -cmd generate_meta

后续增量数据需要通过Drainer来进行同步,故一同创建

执行全量导出
nohup mydumper -h "10.0.0.127" -P "4000" -u "root" -p "mysql_password" -t 2 -F 64 --skip-tz-utc  --logfile   mydumper_10.0.0.127.log -o /data/tidb/10.0.0.127_4000/2019-05-05-15 &

# 参数说明:
- t : 数据导出的线程数
- F : 切分table的chunk大小
--skip-tz-utc : 忽略掉 MySQL 与导数据的机器之间时区设置不一致的情况,禁止自动转换
--logfile : 程序执行日志
-o : 导出目录
导出完成
$ du -sh /data/tidb/10.0.0.127_4000/2019-05-05-15
56G	2019-05-05-15

# Drainer所需TSO信息文件
$ ls /data/tidb/10.0.0.127_4000/2019-05-05-15/binlog_position
savepoint

$ cat /data/tidb/10.0.0.127_4000/2019-05-05-15/binlog_position/savepoint
commitTS = 408168797903519837

数据导入

数据导入,需要分成全量导入和增量导入两部分

全量导入

loader

官方提供的数据导入工具,官方文档传送门。

准备工作
  1. 新集群环境搭建(参见集群部署)
  2. 新集群TiDB账号信息
执行全量导入
nohup loader -h 10.0.0.182 -u root -P 4000 -p mysql_pwd -t 32 -d /data/tidb/10.0.0.127_4000/2019-05-05-15/ >> loader.log  2>&1 &

# 参数说明:
- t : 线程数
- d : 数据导入路径
导入完成
# 登录新集群查看,数据已导入
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql              |
| news               |
| news_test          |
| test               |
| tidb_binlog        |
| tidb_loader        |
+--------------------+
8 rows in set (0.00 sec)

增量导入

增量导入时,若数据源为MySQL,官方推荐使用syncer工具,这里因为原与目标集群都是TiDB,可以直接使用Drainer来进行增量同步。有需要了解syncer工具的移步官方文档。

Drainer
  1. 准备工作
  • initial_commit_ts获取
    • $ cat /data/tidb/10.0.0.127_4000/2019-05-05-15/binlog_position/savepoint
    • commitTS = 408168797903519837

CommitTS 的值作为 Drainer 初次启动使用

  • 修改tidb-ansible/inventory.ini 文件
    • 此处修改的是线上集群的inventory.ini文件,因为新集群是做为线上集群的下游。
    • [drainer_servers]下添加本机IP
      • drainer_mysql ansible_host=10.0.0.127 initial_commit_ts="408168797903519837"

若原有集群已部署过其他Drainer,可以拷贝整个tidb_ansible目录,再进行修改,区分部署(但是需要注意Drainer的启动端口)。

  • 修改drainer配置文件
    • cd tidb_ansible/conf
    • cp drainer.toml drainer_mysql_drainer.toml
    • vim drainer_mysql_drainer.toml
      • worker-count = 30
      • db-type = "mysql"
      • [syncer.to]
      • host = 10.0.0.182
      • user = "root"
      • password = mysql_pwd
      • port = 4000
  1. 线上集群部署Drainer
$ ansible-playbook deploy_drainer.yml
  1. 启动Drainer
$ ansible-playbook start_drainer.yml
  1. 查看日志
# 日志位置在deploy_dir下
$ ls /data/tidb/deploy/log/drainer.log

升级

Ansible滚动升级

由2.0.11-binlog版本升级至2.1.9最新版

注意事项(官方要求)

  1. 不支持回退到2.0.x或更早版本。
  2. 2.0.6前版本,若集群在运行DDL操作,需等待完成后再执行升级。
  3. 早于2.0.1之前版本,无法滚动升级:
  • 停机升级,从2.0.1升级到2.1。
  • 先滚动升级到2.0.1或2.0.x,再滚动升级到2.1。
    4.升级过程中不要执行DDL。

集群信息

三台物理节点服务器,其中182为集群中控机

  • 10.0.0.182
  • 10.0.0.183
  • 10.0.0.184

中控机安装Ansible及依赖

步骤同集群部署,此处不再赘述

滚动升级

  1. 首先使用tidb用户,备份原版本tidb-ansible目录
$ mv tidb-ansible tidb-ansible-2.0.11-binlog
  1. 下载tidb-ansible
$ git clone -b release-2.1 https://github.com/pingcap/tidb-ansible.git
  1. 编辑inventory.ini和配置文件

参照备份的inventory.ini文件

  1. 下载TiDB 2.1 binary到中控机
$ ansible-playbook local_prepare.yml
  1. 执行升级
$ ansible-playbook rolling_update.yml
  1. 监控组件升级
$ ansible-playbook rolling_update_monitor.yml

测试验证

数据库登录查看数据

总结

此次数据迁移,是由于TiDB在2.0.11版本以后更改binlog同步模式,线上集群(2.0.8-kafka)无法直接滚动升级到2.1.9。在同业务层确认可以停写操作但不能停读的情况下,搭建新集群(2.0.11-binlog)进行过渡升级,最终在新集群滚动升级到2.1.9版本。

你可能感兴趣的:(TiDB)