为什么我们要从MySQL迁移到TiDB?( 四 )


如果 dm-worker 和 TiKV 混部 , 会导致全备文件占据大量磁盘空间 , 引起 TiKV Region 评分出现异常 , 导致性能下降 , 已转化为 PRM 产品需求 。
④关于 DM 使用期间出现数据丢失的问题
在早期还没有 dm-portal 自动化生成 task 时 , 我们都是自行编写 DM 的 task 同步文件 。后来有了 dm-portal 自动化生成工具 , 只要图形页面点点点就可以了 。

为什么我们要从MySQL迁移到TiDB?

文章插图
 
但该工具目前有一个问题是 , 没有全库正则匹配 , 即便你只勾选一个库 , 他底层是默认把每张表都给你配置一遍 。
这就会出现当上层 MySQL 新创建某张表的时候 , 下游会被忽略掉 , 例如当你使用改表工具 gh-ost 或者 pt-online-schema-change , 你的临时表都会被当做为不在白名单内而被忽略 , 这个问题使用者需要注意 。
我们也已经反馈给了官方 。未来不久的版本估计就可以修复 。
mysql> select * from client where clientid='82b51e6f6eb64955487f978dd94a2c81e492f6170xxxxxxxxxxxxxxxxxxxxxxxxx';Empty set (0.00 sec)这里日志可以看到 event 被 skip 了 。
⑤关于 DM 使用期间偶发性 1062 主键冲突的问题
query-error task 能看到具体的报错信息 , 下游看都没有该值:
mysql> select * from client where clientid='82b51e6f6eb64955487f978dd94a2c81e492f6170xxxxxxxxxxxxxxxxxxxxxxxxx';Empty set (0.00 sec)再去上游看 , 结果发现也没有值 , 业务逻辑应该是后来 delete 了:
mysql> select * from client where clientid='82b51e6f6eb64955487f978dd94a2c81e492f6170xxxxxxxxxxxxxxxxxxxxxxxxx';Empty set (0.00 sec)因为上游也没有值 , 去上游看 Binlog 后分析如下:
是先写入 , 再删除 , 所以上游没值是可以预期的 , 但是下游还没有同步到这块 , 此时也是没有值的 , 不应该存在 1062 的问题 。
当集群有大规模 kv:1062 报错时 , 或者集群写入压力大时 , DM 从结果看无法保证 Binlog 的有序落盘 , 需确认 DM能不能保证 LVS 下的多个 TiDB Binlog 的每一个 Event 是有序执行的 。
只从现象看 , 只要集群没有大量的 1062 报错 , PD 相关的监控值都比较低 , DM 也不会出现任何同步报错 , 反之就出现 。
从 Binlog 看就像是第一条 Insert了 , 还没来得及 Delete , 直接 Insert 产生的报错 , 但报错后那个 Delete 的也完成了 , 所以这时候我再怎么快也快不到毫秒级 , 下游看不到所有记录 。
解决的办法是将 1062 大量冲突的业务拆分出集群 , 或 DM 直接写 TiDB 的真实 IP 而不是 LVS 。
⑥DM 同步异常
有业务反馈 Drop 分区和 Drop 列时出现同步异常 。补充下分区表相关的测试的结果 , DM 更多的无法拆分的情况还是在 Drop 这块 , 普通的 add , modify 没问题的 。
一次删除多个分区的操作则会报错:
alter table dsp_group_media_report drop partition p202006 ,p202007 ;Drop 含有索引的列操作会报错:
Alter table dsp_group drop column test_column;40 亿表添加 DDL 添加索引导致的 Duration 升高:
为什么我们要从MySQL迁移到TiDB?

文章插图
 
定位到是:
mysql> show global variables like 'tidb_ddl_reorg_worker_cnt';+---------------------------+-------+| Variable_name| Value |+---------------------------+-------+| tidb_ddl_reorg_worker_cnt | 16|+---------------------------+-------+1 row in set (0.11 sec)mysql> show global variables like 'tidb_ddl_reorg_batch_size';+---------------------------+-------+| Variable_name| Value |+---------------------------+-------+| tidb_ddl_reorg_batch_size | 1024|+---------------------------+-------+上述两个参数对已有非 pcie 集群压力比较大导致 。通过 set global 调节(3.0.3 后 , 默认从 256 涨到了 1000 和 16):
tidb_ddl_reorg_batch_size 1000-256tidb_ddl_reorg_worker_cnt 16-4同时 , 提高 Compaction 相关:
max-background-jobs: 8-10-12max-sub-compactions: 1-2-4defaultcf.compression-per-level: ["lz4", "lz4", "lz4", "lz4", "lz4", "zstd", "zstd"]writecf.compression-per-level: ["lz4", "lz4", "lz4", "lz4", "lz4", "zstd", "zstd"]


推荐阅读