pdf文档 TiDB 2.1.7

141.29 KB 9 页 0 评论
语言 格式 评分
英语
.pdf
3
摘要
文档评估了TiDB 2.1.7至3.0.0-beta.1-40版本在事务处理中的表现,发现其在默认配置下存在读偏移、更新丢失等问题,导致无法提供快照隔离。主要问题源于两个自动重试机制设计不当,导致事务冲突处理不当。文档建议禁用自动重试机制以修复问题,并指出3.0.0-rc.2版本已默认禁用这些机制,解决了大部分问题。
AI总结
# 《TiDB 2.1.7》测试报告总结 TiDB是一款基于Google Percolator模型的分布式、自动分区的SQL数据库。尽管TiDB 2.1.7及更高版本(直至3.0.0-beta.1-40)默认支持快照隔离,但由于其自动重试机制的设计缺陷,存在读偏移(Read Skew)和更新丢失(Lost Updates)的问题。这些问题主要由两种自动重试机制引起,该机制在事务冲突时会盲目重新应用更新,而忽略了事务边界的 isolation 约束。 TiDB的架构包括以下三个核心模块: - **Placement Driver (PD)**:负责分配时间戳并协调分片,通过Raft共识算法实现容错。 - **TiKV**:一个分片的、可水平扩展的键值存储,使用RocksDB存储数据。 - **TiDB**:无状态的事务性SQL层,存储数据于TiKV。 ## 核心问题 1. **默认配置的隔离问题** Default配置下,TiDB存在以下问题: - **读偏移(Read Skew)**:允许事务读取到不一致的快照。 - **更新丢失(Lost Updates)**:事务提交的更新可能丢失。 - **写偏移(Write Skew)**:在某些情况下,`SELECT ... FOR UPDATE`无法完全防止写偏移。 这些问题的根源在于两个自动重试机制的设计缺陷。通过禁用这些机制(`tidb_disable_txn_auto_retry`和`tidb_retry_limit`),TiDB 2.1.8及更高版本可以通过快照隔离和单键线性化测试。 2. **启动和初始化问题** - TiKV在启动过程中可能因连接问题崩溃,导致集群无法正常运行。 - 新集群在初始阶段可能因单副本(region)数据存储而导致数据丢失风险。 - 表创建过程中可能存在竞态条件,导致表创建后立即读取时表不存在的情况。 3. **读写锁的局限性** - `SELECT ... FOR UPDATE`无法完全防止写偏移,特别是在键(key)首次创建时。 - 自动重试机制会隐藏事务冲突,导致事务结果不符合快照隔离的理论要求。 ## 解决方案与建议 1. **版本升级** 在3.0.0-rc.2及更高版本中,自动重试机制默认禁用(`tidb_disable_txn_auto_retry`默认为开启),从而修复了默认配置下的隔离问题。 2. **配置调整** - 用户可以通过禁用自动重试机制(`tidb_disable_txn_auto_retry`和`tidb_retry_limit`)来避免读偏移和更新丢失。 - 在新集群部署时,建议等待TiKV所有区域的副本完全同步后再允许写入。 3. **操作建议** - 使用进程监控工具(如systemd)管理TiDB、TiKV和PD的启动,避免因启动顺序问题导致的服务崩溃。 - 关注时钟偏差(clock skew),确保节点时钟行为一致。 ## 测试与发现 TiDB的测试结果表明: - 在未禁用自动重试的情况下,TiDB的默认隔离级别弱于快照隔离,可能导致读偏移、更新丢失等异常。 - 即使在健康集群中,也可能因自动重试机制的不当设计而观察到读偏移。 - 在某些情况下,写偏移可能仍然发生,尤其是在键首次创建时。 ## 未来工作与改进 1. **软件改进** -PingCAP已将自动重试默认禁用,并修复了部分启动问题。 -TiDB 3.0.0-rc.2及更高版本修复了表创建和新集群复制问题。 2. **测试与验证** - Jepsen未能观察到因时钟偏差导致的异常,但理论上存在一致性风险。 - 未来版本可能会进一步优化自动重试机制,以在不影响性能的前提下提供更高的安全性。 ## 结论 TiDB在默认配置下存在隔离级别不足的问题,但通过升级至3.0.0-rc.2并调整配置,可以显著降低事务异常的风险。用户应注意TiDB的启动和初始化过程中的潜在问题,并采取措施确保数据一致性和可用性。
P1
P2
P3
P4
P5
P6
P7
P8
P9
下载文档到本地,方便使用
文档评分
请文明评论,理性发言.