黄东旭解析 TiDB 的核心优势
638
2024-03-24
TiDB Data Migration (DM) 是一款便捷的数据迁移工具,支持从与 MySQL 协议兼容的数据库(MySQL、MariaDB、Aurora MySQL)到 TiDB 的全量数据迁移和增量数据同步。
在TOOLS的文件夹中,找到dm-master-v6.5.2-linux-amd64.tar.gz包,解压到本地
# tar zxvf dm-master-v6.5.2-linux-amd64.tar.gz
编写安装配置拓扑文件
# vim dmtopo.yaml
编辑如下内容,注意格式,这里测试时只用单节点来部署。
注意事项:要和TIDB的数据库拓扑IP区分开,否则会造成TIDB集群的granafa和dashboard监控因IP冲突而导致访问失效。
---
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/home/tidb/dm/deploy"
data_dir: "/home/tidb/dm/data"
# arch: "amd64"
master_servers:
- host: 21.72.124.42
worker_servers:
- host: 21.72.124.42
monitoring_servers:
- host: 21.72.124.42
grafana_servers:
- host: 21.72.124.42
alertmanager_servers:
- host: 21.72.124.42
安装DM组件
# tiup dm deploy dm-test v6.5.2 ./dmtopo.yaml --user tidb
# tiup dm display dm-test
(1)加密数据源密码
# tiup dmctl encrypt abc!@#123
(2)编写数据源配置文件
source-id: "mysql-01" # 数据源 ID,在数据迁移任务配置和 dmctl 命令行中引用该 source-id 可以关联到对应的数据源
from:
host: "127.0.0.1"
port: 3306
user: "root"
password: "MKxn0Qo3m3XOyjCnhEMtsUCm83EhGQDZ/T4=" # 推荐使用 dmctl 对上游数据源的用户密码加密之后的密码
security: # 上游数据源 TLS 相关配置。如果没有需要则可以删除
ssl-ca: "/path/to/ca.pem"
ssl-cert: "/path/to/cert.pem"
ssl-key: "/path/to/key.pem"
# tiup dmctl --master-addr 21.72.124.42:8261 operate-source create
source-mysql-01.yaml
# vim dm-task.yaml
#注意文件格式
name: testdm
task-mode: all
target-database:
host: "127.0.0.1"
port: 4000
user: "root"
password: "" # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
# 填写一个或多个所需同步的数据源信息
mysql-instances:
- source-id: "mysql-01"
block-allow-list: "ba-rule1"
block-allow-list:
ba-rule1:
do-dbs: ["testdm"]
任务配置文件分为以下几部分:
# 全局配置
## 基本信息配置
## 功能配置集
# 实例配置
完整配置文件实例请参考https://docs.pingcap.com/zh/tidb/v6.5/task-configuration-file-full
# tiup dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml
结果如下:
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.3.0/dmctl/dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-01",
"worker": "dm-192.168.80.201-8262"
}
],
"checkResult": "pre-check is passed. "
}
query-status
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 query-statustestdm
pause-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 pause-task testdm
resume-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 resume-task testdm
stop-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 stop-task testdm
(1)分库分表数据迁移
(2)上下游列数量不一致
(3)增量数据校验、迁移
使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份。
[tidb@localhost] #cd /home/tidb_install/tidb-enterprise-server-v6.5.2-linux-amd64
[tidb@localhost] #tar -zxvf dumpling-v6.5.2-linux-amd64.tar.gz
会解压出一个dumpling文件
导出某库到本地文件夹语句如下:
[tidb@localhost]#tiup dumpling -uroot -P13390 -h21.72.124.42 -o /home/dump -B P6ODS
参数解释:
-u 导出数据库的用户名
-P 导出数据库的端口号
-h 导出数据库的IP地址
-o 要导入的文件夹,需有相应权限
-B 导出的数据库名称schema
-V 或 --version
输出 Dumpling 版本并直接退出
-B 或 --database
导出指定数据库
-T 或 --tables-list
导出指定数据表
-f 或 --filter
导出能匹配模式的表,语法可参考 table-filter
--case-sensitive
table-filter 是否大小写敏感
-h 或 --host
连接的数据库主机的地址
-t 或 --threads
备份并发线程数
-r 或 --rows
用于开启表内并发加速导出。默认值是 0,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。
-L 或 --logfile
日志输出地址,为空时会输出到控制台
--loglevel
日志级别 {debug,info,warn,error,dpanic,panic,fatal}
--logfmt
日志输出格式 {text,json}
-d 或 --no-data
不导出数据,适用于只导出 schema 场景
--no-header
导出 csv 格式的 table 数据,不生成 header
-W 或 --no-views
不导出 view
-m 或 --no-schemas
不导出 schema,只导出数据
-s 或--statement-size
控制 INSERT SQL 语句的大小,单位 bytes
-F 或 --filesize
将 table 数据划分出来的文件大小,需指明单位(如 128B, 64KiB, 32MiB, 1.5GiB)
--filetype
导出文件类型(csv/sql)
-o 或 --output
导出本地文件路径或外部存储 URL 格式
-S 或 --sql
根据指定的 sql 导出数据,该选项不支持并发导出
--consistency
flush: dump 前用 FTWRLsnapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据lock: 对需要 dump 的所有表执行 lock tables read 命令none: 不加锁 dump,无法保证一致性auto: 对 MySQL 使用 --consistency flush;对 TiDB 使用 --consistency snapshot
--snapshot
snapshot tso,只在 consistency=snapshot 下生效
--where
对备份的数据表通过 where 条件指定范围
-p 或 --password
连接的数据库主机的密码
-P 或 --port
连接的数据库主机的端口
-u 或 --user
连接的数据库主机的用户名
--dump-empty-database
导出空数据库的建库语句
--ca
用于 TLS 连接的 certificate authority 文件的地址
--cert
用于 TLS 连接的 client certificate 文件的地址
--key
用于 TLS 连接的 client private key 文件的地址
--csv-delimiter
csv 文件中字符类型变量的定界符
--csv-separator
csv 文件中各值的分隔符,如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符
--csv-null-value
csv 文件空值的表示
--escape-backslash
使用反斜杠 (\) 来转义导出文件中的特殊字符
--output-filename-template
以 golang template 格式表示的数据文件名格式支持 {{.DB}}、{{.Table}}、{{.Index}} 三个参数分别表示数据文件的库名、表名、分块 ID
--status-addr
Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址
--tidb-mem-quota-query
单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte。对于 v4.0.10 或以上版本,若不设置该参数,默认使用 TiDB 中的 mem-quota-query 配置项值作为内存限制值。对于 v4.0.10 以下版本,该参数值默认为 32 GB
--params
为需导出的数据库连接指定 session 变量,可接受的格式: "character_set_client=latin1,character_set_connection=latin1"
-c 或 --compress
压缩 Dumpling 导出的 CSV、SQL 数据与表结构文件为指定格式,支持 "gzip"、"snappy" 和 "zstd" 压缩算法
TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入。
下载 TiDB Lightning 安装包
解压 Lightning 压缩包即可获得 tidb-lightning 可执行文件。
tar -zxvf tidb-lightning-${version}-linux-amd64.tar.gz
chmod +x tidb-lightning
特性
作用域
所需权限
备注
必需
基本功能
目标 table
CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,ALTER
DROP 仅 tidb-lightning-ctl 在执行 checkpoint-destroy-all 时需要
目标 database
CREATE
必需
Logical Import Mode
information_schema.columns
SELECT
Physical Import Mode
mysql.tidb
SELECT
-
SUPER
-
RESTRICTED_VARIABLES_ADMIN,RESTRICTED_TABLES_ADMIN
当目标 TiDB 开启 SEM
推荐
冲突检测,max-error
lightning.task-info-schema-name 配置的 schema
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
如不需要,该值必须设为""
可选
并行导入
lightning.meta-schema-name 配置的 schema
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
如不需要,该值必须设为""
可选
checkpoint.driver = "mysql"
checkpoint.schema 设置
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
使用数据库而非文件形式存放 checkpoint 信息时需要
目标 TiKV 集群必须有足够空间接收新导入的数据。除了标准硬件配置以外,目标 TiKV 集群的总存储空间必须大于 数据源大小 × 副本数量 × 2。例如集群默认使用 3 副本,那么总存储空间需为数据源大小的 6 倍以上。公式中的 2 倍可能难以理解,其依据是以下因素的估算空间占用:
索引会占据额外的空间
RocksDB 的空间放大效应
目前无法精确计算 Dumpling 从 MySQL 导出的数据大小,但你可以用下面 SQL 语句统计信息表的 data_length 字段估算数据量:
统计所有 schema 大小,单位 MiB,注意修改 ${schema_name}
SELECT table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_schema;
统计最大单表,单位 MiB,注意修改 ${schema_name}
SELECT table_name, table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_name,table_schema ORDER BY sum DESC LIMIT 5;
TiDB Lightning 支持从多种类型的文件导入数据到 TiDB 集群。
通过以下配置为 TiDB Lightning 指定数据文件所在位置。
[mydumper]
# 本地源数据目录或 S3 等外部存储 URL
data-source-dir = "/data/my_database"
TiDB Lightning 运行时将查找 data-source-dir 中所有符合命令规则的文件。
数据源命名规则如下:
${db_name}.${table_name}-schema.sql
${db_name}-schema-create.sql
${db_name}.${table_name}.${csv|sql|parquet}
${db_name}.${table_name}.001.${csv|sql|parquet}
${db_name}.${table_name}.${csv|sql|parquet}.{compress}
CSV格式的数据
CSV 格式可在 tidb-lightning.toml 文件中 [mydumper.csv] 下配置。大部分设置项在 MySQL [LOAD DATA] 语句中都有对应的项目。
SQL格式的数据
TiDB Lightning 在处理 SQL 文件时,由于无法对单个文件进行快速分割,因此无法通过增加并发提高单个文件的导入速度。鉴于此,导出数据为 SQL 文件时应尽量避免单个 SQL 文件过大,通常单文件在 256MiB 左右可以达到最佳性能。
Physical Import Mode 不经过 SQL 接口,而是直接将数据以键值对的形式插入 TiKV 节点,是一种高效、快速的导入模式。使用 Physical Import Mode 时,单个 Lightning 实例可导入的数据量为 10 TiB
Physical Import Mode 对应的后端模式为 local。
使用限制:
B Lightning 实例向同一 TiDB 集群导入数据,而应考虑使用并行导入特性。
不可同时使用 Physical Import Mode 和 Logical Import Mode 导入同一 TiDB 集群。
在 Logical Import Mode 下,TiDB Lightning 先将数据编码成 SQL,然后直接运行这些 SQL 语句进行数据导入。对于已有数据、对外提供服务的 TiDB 集群,推荐使用 Logical Import Mode 导入数据。Logical Import Mode 的行为与正常执行 SQL 并无差异,可保证 ACID。
Logical Import Mode 对应的后端模式为 tidb。
使用限制:
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
max-size = 128 # MB
max-days = 28
max-backups = 14
# 启动之前检查集群是否满足最低需求。
check-requirements = true
[mydumper]
# 本地源数据目录或外部存储 URL
data-source-dir = "/data/my_database"
[tikv-importer]
# 导入模式配置,设为 local 即使用 Physical Import Mode
backend = "local"
# 冲突数据处理方式
duplicate-resolution = remove
# 本地进行 KV 排序的路径。
sorted-kv-dir = "./some-dir"
# 限制 TiDB Lightni
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。