外题
本文只写增量,全量请看历史文章
为啥用增量呢,因为同步机目前比较乱,近10个任务,只有小部分任务需要保留,所以配置也不用太高,磁盘也不用太高,所以通过重新新一台机搭建md集群,用增量同步来达到迁移的效果
增量怎么保持数据一致性,这个,因为我这边情况比较特殊,需要保留的任务同步源都是基于mysql从库的,所以我先停了mysql从库的同步,在等现在的任务同步完所有数据,在停止现在的任务,在起新的增量任务
还有,目前线上集群已经升级到了6.1.0,所以也想将md集群对应的升级到6.1.0
所以本文也不适合所有人,请只作为参考
如果想全量直接做的兄弟,我劝你三思,竟然官方都提供了全量同步的方式,肯定经过很多人(生产)练过,你有把握你的方式就一定能胜过官方,稳定最重要
安装
需要二个组件
DM安装
tiup install dm
dmctl安装
tiup list dmctl # 查看dmctl版本
tiup install dmctl:v6.1.0 # 版本请跟以下的md集群版本对应
部署
创建MD集群
md集群也是需要.yaml文件的
.yaml
global:
user: "tidb" # 用户名
ssh_port: 22 # ssh端口
deploy_dir: "/usr/local/tidb" # 系统包统一存放放路径
data_dir: "/data/tidb" # 数据统一存放路径
master_servers:
- host: 172.18.3.38
worker_servers:
- host: 172.18.3.38
注意:
如果只有一个master的情况,mysql源必须是小于等于dm-worker的数量。
如果是多个master(奇数),mysql源必须是小于dm-worker的数量。
如果加入了mysql源的话,status状态会由Free变成Bound
安装md集群
tiup list dm-master ## 查看版本
tiup dm deploy dm-sdk v6.1.0 ./dm.yaml ## 版本请跟上面的dmctl版本对应
启动集群
tiup dm start dm-sdk
查看集群
tiup dm display dm-sdk
创建数据源
加密方式
tiup dmctl --encrypt 密码 ## 创建数据源需要的相关文件中的密码加密方式,也可以用明文
同步源配置
.yaml
source-id: "sdk"
enable-gtid: true
from:
host: "172.18.3.44"
port: 3306
user: "xxxxx"
password: "xxxxxxx" # 可加密可明文
加入同步源
tiup dmctl --master-addr 172.18.3.38:8261 operate-source create sdk.yaml # 加入同步源
tiup dmctl --master-addr 172.18.3.38:8261 operate-source update sdk.yaml # 同步源不可删除,只能修改
task配置
yaml配置大全
# ----------- 全局配置 -----------
# ********* 基本信息配置 *********
name: test # 任务名称,需要全局唯一
task-mode: all # 任务模式,可设为 "full"、"incremental"、"all"
shard-mode: "pessimistic" # 如果为分库分表合并任务则需要配置该项。默认使用悲观协调模式 "pessimistic",在深入了解乐观协调模式的原理和使用限制后,也可以设置为乐观协调模式 "optimistic"
meta-schema: "dm_meta" # 下游储存 `meta` 信息的数据库
timezone: "Asia/Shanghai" # 时区
case-sensitive: false # schema/table 是否大小写敏感
online-ddl-scheme: "gh-ost" # 目前仅支持 "gh-ost" 、"pt"
ignore-checking-items: [] # 不关闭任何检查项。可选的检查项有 "all"、"dump_privilege"、"replication_privilege"、"version"、"binlog_enable"、"binlog_format"、"binlog_row_image"、"table_schema"、"schema_of_shard_tables"、"auto_increment_ID"
clean-dump-file: true # 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件
target-database: # 下游数据库实例配置
host: "192.168.0.1"
port: 4000
user: "root"
password: "/Q7B9DizNLLTTfiZHv9WoEAKamfpIUs=" # 推荐使用经 dmctl 加密后的密码
max-allowed-packet: 67108864 # 设置 DM 内部连接 TiDB 服务器时,TiDB 客户端的 "max_allowed_packet" 限制(即接受的最大数据包限制),单位为字节,默认 67108864 (64 MB)
# 该配置项从 DM v2.0.0 版本起弃用,DM 会自动获取连接 TiDB 的 "max_allowed_packet"
session: # 设置 TiDB 的 session 变量,在 v1.0.6 版本引入。更多变量及解释参见 `https:#docs.pingcap.com/zh/tidb/stable/system-variables`
sql_mode: "ANSI_QUOTES,NO_ZERO_IN_DATE,NO_ZERO_DATE" # 从 DM v2.0.0 版本起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "sql_mode" 的值。手动配置该项具有更高优先级
tidb_skip_utf8_check: 1 # 从 DM v2.0.0 版本起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "tidb_skip_utf8_check" 的值。手动配置该项具有更高优先级
tidb_constraint_check_in_place: 0
security: # 下游 TiDB TLS 相关配置
ssl-ca: "/path/to/ca.pem"
ssl-cert: "/path/to/cert.pem"
ssl-key: "/path/to/key.pem"
# ******** 功能配置集 **********
routes: # 上游和下游表之间的路由 table routing 规则集
route-rule-1: # 配置名称
schema-pattern: "test_*" # 库名匹配规则,支持通配符 "*" 和 "?"
table-pattern: "t_*" # 表名匹配规则,支持通配符 "*" 和 "?"
target-schema: "test" # 目标库名称
target-table: "t" # 目标表名称
route-rule-2:
schema-pattern: "test_*"
target-schema: "test"
filters: # 上游数据库实例匹配的表的 binlog event filter 规则集
filter-rule-1: # 配置名称
schema-pattern: "test_*" # 库名匹配规则,支持通配符 "*" 和 "?"
table-pattern: "t_*" # 表名匹配规则,支持通配符 "*" 和 "?"
events: ["truncate table", "drop table"] # 匹配哪些 event 类型
action: Ignore # 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
filter-rule-2:
schema-pattern: "test_*"
events: ["all dml"]
action: Do
block-allow-list: # 上游数据库实例匹配的表的 block-allow-list 过滤规则集,如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
bw-rule-1: # 配置名称
do-dbs: ["~^test.*", "user"] # 迁移哪些库
ignore-dbs: ["mysql", "account"] # 忽略哪些库
do-tables: # 迁移哪些表
- db-name: "~^test.*"
tbl-name: "~^t.*"
- db-name: "user"
tbl-name: "information"
ignore-tables: # 忽略哪些表
- db-name: "user"
tbl-name: "log"
mydumpers: # dump 处理单元的运行配置参数
global: # 配置名称
threads: 4 # dump 处理单元从上游数据库实例导出数据的线程数量,默认值为 4
chunk-filesize: 64 # dump 处理单元生成的数据文件大小,默认值为 64,单位为 MB
skip-tz-utc: true # 忽略对时间类型数据进行时区转化,默认值为 true
extra-args: "--consistency none" # dump 处理单元的其他参数,不需要在 extra-args 中配置 table-list,DM 会自动生成
loaders: # load 处理单元的运行配置参数
global: # 配置名称
pool-size: 16 # load 处理单元并发执行 dump 处理单元的 SQL 文件的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
dir: "./dumped_data" # dump 处理单元输出 SQL 文件的目录,同时也是 load 处理单元读取文件的目录。该配置项的默认值为 "./dumped_data"。同实例对应的不同任务必须配置不同的目录
syncers: # sync 处理单元的运行配置参数
global: # 配置名称
worker-count: 16 # sync 并发迁移 binlog event 的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
batch: 100 # sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100
enable-ansi-quotes: true # 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
safe-mode: false # 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。在启动或恢复增量复制任务的前 5 分钟内 TiDB DM 会自动启动 safe mode
# ----------- 实例配置 -----------
mysql-instances:
-
source-id: "mysql-replica-01" # 对应 source.toml 中的 `source-id`
meta: # `task-mode` 为 `incremental` 且下游数据库的 `checkpoint` 不存在时 binlog 迁移开始的位置; 如果 checkpoint 存在,则以 `checkpoint` 为准
binlog-name: binlog.000001
binlog-pos: 4
binlog-gtid: "03fc0263-28c7-11e7-a653-6c0b84d59f30:1-7041423,05474d3c-28c7-11e7-8352-203db246dd3d:1-170" # 对于 source 中指定了 `enable-gtid: true` 的增量任务,需要指定该值
route-rules: ["route-rule-1", "route-rule-2"] # 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
filter-rules: ["filter-rule-1"] # 该上游数据库实例匹配的表的 binlog event filter 规则名称
block-allow-list: "bw-rule-1" # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
mydumper-config-name: "global" # mydumpers 配置的名称
loader-config-name: "global" # loaders 配置的名称
syncer-config-name: "global" # syncers 配置的名称
-
source-id: "mysql-replica-02" # 对应 source.toml 中的 `source-id`
mydumper-thread: 4 # dump 处理单元用于导出数据的线程数量,等同于 mydumpers 配置中的 `threads`,当同时指定它们时 `mydumper-thread` 优先级更高
loader-thread: 16 # load 处理单元用于导入数据的线程数量,等同于 loaders 配置中的 `pool-size`,当同时指定它们时 `loader-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
syncer-thread: 16 # sync 处理单元用于复制增量数据的线程数量,等同于 syncers 配置中的 `worker-count`,当同时指定它们时 `syncer-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
task.yaml
name: sdkt
task-mode: incremental # 只增量
case-sensitive: true
clean-dump-file: true
target-database:
host: "172.18.3.40"
port: 4000
user: "xxxx"
password: "xxxxxxxxxx"
mysql-instances:
-
source-id: "sdk" #对应 source.toml 中的 `source-id`,就是上一个的.yaml中的source-id名称
block-allow-list: "instance" # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
mydumper-thread: 4 # dump 处理单元用于导出数据的线程数量,等同于 mydumpers 配置中的 `threads`,当同时指定它们时 `mydumper-thread` 优先级更高
loader-thread: 8 # load 处理单元用于导入数据的线程数量,等同于 loaders 配置中的 `pool-size`,当同时指定它们时 `loader-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
syncer-thread: 8 # sync 处理单元用于复制增量数据的线程数量,等同于 syncers 配置中的 `worker-count`,当同时指定它们时 `syncer-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
meta: # `task-mode` 为 `incremental` 且下游数据库的 `checkpoint` 不存在时 binlog 迁移开始的位置; 如果 `checkpoint` 存在,以 `checkpoint` 为准
binlog-name: "mysql-bin.000000"
binlog-pos: 156
binlog-gtid: "002ff48d-124d5-11ea-a7fe-00163e10521f07:1-76730487,1131deffa-fc5c-11e9-8b95-0221310163e12fb39:1-726318631,3e1832125d6-ac75-13111ea-b24a-0021163e042d7d:1-882084969" # 请按实际的gtid来,已做为修改
block-allow-list:
instance:
do-dbs: ["test"] # 同步的库
ignore-dbs: ["mysql", "sys", "information_schema", "performance_schema"] # 不同步的库
检查task.yaml配置是否通过
tiup dmctl --master-addr 172.18.3.38:8261 check-task sdk-task.yaml
启动同步
tiup dmctl --master-addr 172.18.3.38:8261 start-task sdk-task.yaml #启动
tiup dmctl --master-addr 172.18.3.38:8261 query-status sdk-task #查看状态
tiup dmctl --master-addr 172.18.3.38:8261 stop-task sdk-task ##停止
tiup dmctl --help # 其他