关于数据复制的一些问题

1 TiDB 从所有要写入的 Key 中选择一个作为当前事务的 Primary Key
2 TiDB 向所有的本次提交涉及到的 TiKV 发起 prewrite 请求,TiKV 判断是否所有 Key 都可以 prewrite 成功
3 TiDB 收到所有 Key 都 prewrite 成功的消息
4 TiDB 向 PD 请求 commit_ts
5 TiDB 向 Primary Key 发起第二阶段提交。Primary Key 所在的 TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁
6 TiDB 收到两阶段提交成功的信息

按照以上的提交顺序,
1 客户端收到commit 成功是在第几阶段提交成功后呢?
2 tikv分为leader和副本那么当提交成功后在每个tidb查询到的数据是否都是一样的呢每个tidb是否会有同步延迟?如果都读取磁盘leader的数据那么是不是一定是一致的?
3 如果prewrite少数节点失败那么这条事务是判断为成功还是失败,后期的数据一致性是如何保证的?

  1. TiDB 收到两阶段提交成功的信息,然后才会给客户端返回成功。

  2. 首先写入肯定是先写leader,然后异步同步到follower。每个tidb查询时都会上pd去取tso。然后上leader查询数据。除非配置了follower读取数据(这个我看到过,没有使用过)。正常来讲所有tidb读取的数据都是一样的,不会存在延迟的情况。 数据读取流程(如果 Memtable 没有,会访问 Block-Cache,最后访问SST也就是磁盘)

  3. prewrite失败后,tidb会自动切换为悲观事务进行重试。达到限制后这个事务才会给客户端返回失败。

如果你使用的4.0版本,可以看一下这2个参数:
max-txn-ttl TTL默认为 10 分钟,重试超时的总时间;
max_retry_count 默认为256,控制悲观事务的重试次数,可以通过慢日志过滤 Exec_retry_count 查看SQL的重试次数。

非常感谢

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