模拟多节点TiKV故障后,集群count(1) 结果不正确

集群版本:5.0.4
集群架构:A -> B两个集群做主备架构,数据通过cdc同步。
操作流程:

  1. 模拟三节点TiKV故障
  2. 使用sync-diff-inspector 数据校验,并补数据
  3. 架构恢复A -> B 数据同步后,在A集群执行count(1) 结果不正确
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
|    50320 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from sbtest1 where id>0;
+----------+
| count(*) |
+----------+
|    50000 |
+----------+
1 row in set (0.04 sec)

mysql> select min(id) from sbtest1;
+---------+
| min(id) |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

reload 集群和收集统计信息后,结果依然不正确

  1. 每个集群是三节点,几副本?
  2. 模拟时,采用的什么步骤和方式?
  3. 通过数据校验后,并且补了数据,怎么会不一致?
  4. 以上的操作过程,是不是有什么环节被忽略了?

cdc同步完成后数据量一致吗?

  1. 集群选用3副本
  2. 模拟时按照步骤:【SOP 系列 18】TiUP 环境恢复 TiKV 副本
  3. 补数据后,实际行数=50000,执行count(1) 实际50320。问题在于为什么会这样。

操作步骤:

  1. 模拟region丢失3副本. 先mv掉deploy 安装目录、再kill 进程、再mv数据目录
  2. 禁止schedule调用
  3. 检查宕机的3台机器对应的store_id; 查询失败
  MySQL [test]> select count(1) from sbtest1;
ERROR 9010 (HY000): TiKV server reports stale command
  1. 停cdc任务
tiup ctl:v5.0.4 cdc changefeed  --pd=http://192.168.8.11:2379 pause --changefeed-id  dr-replication-task-5
  1. 故障集群停tikv
tiup cluster stop dr-primary -R=tikv
  1. 正常的tikv执行unsafe-recover
tiup ctl:v5.0.4 tikv  --db /data/tidb-data/tikv_data_p_20161/db unsafe-recover remove-fail-stores -s 1,2,7 --all-regions
  1. 缩容故障TIKV,重启tikv、pd
tiup cluster scale-in dr-primary -N=192.168.8.11:20161,192.168.8.11:20162,192.168.8.12:20160 --force -y

tiup cluster stop dr-primary -R=pd
tiup cluster start dr-primary -R=pd,tikv
  1. 停掉一个正常TiKV节点, recreate-region
tiup ctl:v5.0.4 tikv --db /data/tidb-data/tikv_data_p_20162/db recreate-region -p '192.168.8.11:2379' -r  4019
tiup ctl:v5.0.4 tikv --db /data/tidb-data/tikv_data_p_20162/db recreate-region -p '192.168.8.11:2379' -r  4031
tiup ctl:v5.0.4 tikv --db /data/tidb-data/tikv_data_p_20162/db recreate-region -p '192.168.8.11:2379' -r  4068
  1. reload 集群
tiup cluster reload dr-primary  -y
  1. 校验数据
bin/sync_diff_inspector -config=conf/dr-check.toml
  1. 补数据后,实际行数=50000,执行count(1) 实际50320。 问题:select count(1) from t1;执行不准确

admin check table 先检查下是不是数据索引不一致
https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-check-table-index#admin-check-tableindex

3副本集群,模拟3个副本都丢失,进行灾难恢复,这个时候能恢复吗?即便恢复了,所有的数据都已经丢失,包括系统元数据。这个场景就不用去灾难恢复,

A 和 B 两个集群之间的数据,是一致的么?

停止 CDC 服务的前后,有没有核对过?

另外,A 集群恢复后,是通过什么步骤来进行数据恢复的?然后依靠什么判断数据完全恢复了?
unsafe-recover 是无法保证数据正常的,只能恢复集群的状态…

  1. 数据一致的:经过两次校验。
    通过官方校验工具:sync_diff_inspector进行两次校验,第一次用于A-B集群之间补数据,第二次校验结果是一致的。

  2. unsafe-recover 和 recreate_region 是用来恢复集群的TIKV,和创建丢失3副本的空region(个人测试如果有region不为空,recreate_region会失败)。 集群TiKV恢复正常后用sync_diff_inspector在 A-B集群做两次校验

admin check table 的结果是一致的吗?是否存在索引和数据不一致的情况?

后续复现

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。