使用 Physical Import Mode
可以通过以下配置文件使用 Physical Import Mode 执行数据导入:
Lightning 的完整配置文件可参考。
冲突数据,即两条或两条以上的记录存在 PK/UK 列数据重复的情况。当数据源中的记录存在冲突数据,将导致该表真实总行数和使用唯一索引查询的总行数不一致的情况。冲突数据检测支持三种策略:
- record: 仅将冲突记录添加到目的 TiDB 中的 表中。注意,该方法要求目的 TiKV 的版本为 v5.2.0 或更新版本。如果版本过低,则会启用 ‘none’ 模式。
- remove: 推荐方式。记录所有的冲突记录,和 ‘record’ 模式相似。但是会删除所有的冲突记录,以确保目的 TiDB 中的数据状态保持一致。
- none: 关闭冲突数据检测。该模式是三种模式中性能最佳的,但是可能会导致目的 TiDB 中出现数据不一致的情况。
在 v5.3 版本之前,Lightning 不具备冲突数据检测特性,若存在冲突数据将导致导入过程最后的 checksum 环节失败;开启冲突检测特性的情况下,无论 record
还是 remove
策略,只要检测到冲突数据,Lightning 都会跳过最后的 checksum 环节(因为必定失败)。
假设一张表 order_line
的表结构如下:
CREATE TABLE IF NOT EXISTS `order_line` (
`ol_o_id` int(11) NOT NULL,
`ol_d_id` int(11) NOT NULL,
`ol_w_id` int(11) NOT NULL,
`ol_number` int(11) NOT NULL,
`ol_supply_w_id` int(11) DEFAULT NULL,
`ol_delivery_d` datetime DEFAULT NULL,
`ol_quantity` int(11) DEFAULT NULL,
`ol_amount` decimal(6,2) DEFAULT NULL,
`ol_dist_info` char(24) DEFAULT NULL,
PRIMARY KEY (`ol_w_id`,`ol_d_id`,`ol_o_id`,`ol_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
若在导入过程中检测到冲突数据,则可以查询 lightning_task_info.conflict_error_v1
表得到以下内容:
根据上述信息人工甄别需要保留的重复数据,手动插回原表即可。
自 TiDB Lightning v6.2.0 版本起,TiDB Lightning 提供机制控制导入数据过程对在线业务的影响。TiDB Lightning 不会暂停全局的调度,而是只暂停目标表数据范围所在 region 的调度,降低了对在线业务的影响。
注意
TiDB 集群版本需大于等于 v6.1.0,更低的版本 TiDB Lightning 会保持原有行为,暂停全局调度,数据导入期间会给在线业务带来严重影响。
TiDB Lightning 默认情况下会在最小范围内暂停集群调度,无需额外配置。但默认配置下,TiDB 集群仍然会因为数据导入太快,使在线业务的性能受到影响,所以你需要额外配置几个选项来控制导入速度和其他可能影响集群性能的因素:
# 限制 TiDB Lightning 向每个 TiKV 节点写入的带宽大小。
store-write-bwlimit = "128MiB"
[tidb]
# 使用更小的并发以降低计算 checksum 和执行 analyze 对事务延迟的影响。
[cron]
# 避免将 TiKV 切换到 import 模式。
switch-mode = '0'
在测试中用 TPCC 测试模拟在线业务,同时用 TiDB Lightning 向 TiDB 集群导入数据,测试导入数据对 TPCC 测试结果的影响。测试结果如下:
表格中的百分比含义为 TiDB Lightning 导入对 TPCC 结果的影响大小。对于 TPM,数值表示 TPM 下降的百分比;对于延迟 P99、P90、AVG,数值表示延迟上升的百分比。
测试结果表明,TPCC 并发越小,TiDB Lightning 导入对 TPCC 结果影响越大。当 TPCC 并发达到 64 或以上时,Lightning 导入对 TPCC 结果无显著影响。
因此,如果你的 TiDB 生产集群上有延迟敏感型业务,并且并发较小,强烈建议不使用 TiDB Lightning 导入数据到该集群,这会给在线业务带来较大影响。
提高 Lightning Physical Import Mode 导入性能最直接有效的方法:
- 升级 Lightning 所在节点的硬件,尤其重要的是 CPU 和 sorted-key-dir 所在存储设备的性能。
- 使用特性实现水平扩展。
当然,Lightning 也提供了部分并发相关配置以影响 Physical Import Mode 的导入性能。但是从长期实践的经验总结来看,以下四个配置项一般保持默认值即可,调整其数值并不会带来显著的性能提升,可作为了解内容阅读。
导入时,每张表被切分成一个用于存储索引的“索引引擎”和若干存储行数据的“数据引擎”,index-concurrency
用于调整”索引引擎”的并发度。
在调整 index-concurrency
时,需要注意 index-concurrency * 每个表对应的源文件数量 > region-concurrency
以确保 cpu 被充分利用,一般比例大概在 1.5 ~ 2 左右为优。index-concurrency
不应该设置的过大,但不低于 2 (默认),过大会导致太多导入的 pipeline 变差,大量 index-engine 的 import 阶段堆积。
如果表非常大,Lightning 会按照 100 GiB 的大小将表分割成多个批次处理,并发度由 控制。
上述两个参数对导入速度影响不大,使用默认值即可。
io-concurrency
用于控制文件读取并发度,默认值为 5。可以认为在某个时刻只有 5 个句柄在执行读操作。由于文件读取速度一般不会是瓶颈,所以使用默认值即可。
读取文件数据后,lightning 还需要做后续处理,例如将数据在本地进行编码和排序。此类操作的并发度由 region-concurrency
配置控制。region-concurrency
的默认值为 CPU 核数,通常无需调整,建议不要将 Lightning 与其它组件部署在同一主机,如果客观条件限制必须混合部署,则需要根据实际负载调低 region-concurrency
。
此外,TiKV 的 num-threads 配置也可能影响性能,新集群建议设置为 CPU 核数。
TiDB Lightning 在使用物理模式导入数据时,会在本地磁盘创建大量的临时文件,用来对原始数据进行编码、排序、分割。当用户本地磁盘空间不足时,TiDB Lightning 会由于写入文件失败而报错退出。
为了减少这种情况的发生,你可以为 TiDB Lightning 配置磁盘配额 (disk quota)。当磁盘配额不足时,TiDB Lightning 会暂停读取源数据以及写入临时文件的过程,优先将已经完成排序的 key-value 写入到 TiKV,TiDB Lightning 删除本地临时文件后,再继续导入过程。
为 TiDB Lightning 开启磁盘配额,你需要在配置文件中加入配置项:
[tikv-importer]
# 默认为 MaxInt64,即 9223372036854775807 字节
disk-quota = "10GB"
backend = "local"
[cron]
# 检查磁盘配额的时间间隔,默认为 60 秒。
disk-quota
配置项可以设置磁盘配额,默认为 MaxInt64,即 9223372036854775807 字节,这个值远远大于实际情况中可能需要的磁盘空间,相当于没开启。
check-disk-quota
配置项是检查磁盘配额的时间间隔,默认为 60 秒。由于检查临时文件使用空间的过程需要加锁,会使所有的导入线程都暂停,如果在每次写入之前都检查一次磁盘空间的使用情况,则会大大降低写入文件的效率(相当于单线程写入)。为了维持高效的写入,磁盘配额不会在每次写入之前检查,而是每隔一段时间暂停所有线程的写入并检查当前磁盘空间的使用情况。也就是说,当 check-disk-quota
配置项设置为一个非常大的值时,磁盘的使用空间有可能会大大超出磁盘配额,这样的情况下,磁盘配额功能可以说是不生效的。因此,check-disk-quota
的值建议不要设置太大,而具体设置多少则需要由 TiDB Lightning 具体运行的环境决定,因为不同的环境下,TiDB Lightning 写入临时文件的速度是不一样的。理论上来说,写入临时文件的速度越快,check-disk-quota
需要设置得越小。