TIDB分布式数据库

概念

TiDB 是一款开源的分布式 NewSQL 数据库,兼容 MySQL 生态,支持水平扩展、金融级高可用及实时 HTAP(混合事务分析处理)。与 OldSQL(如 MySQL)相比,它解决了单机容量和性能瓶颈;与 NoSQL 相比,提供完整的 ACID 事务和 SQL 接口。

核心特性

  • MySQL 兼容:支持 MySQL 5.7 协议及常用功能,迁移成本低。
  • 水平扩缩容:存储与计算分离,支持在线弹性扩缩容。
  • 金融级高可用:多副本 + Multi-Raft 协议,保障数据强一致性。
  • 实时 HTAP:通过 TiKV(行存)和 TiFlash(列存)支持 OLTP 与 OLAP。
  • 云原生:支持 Kubernetes 部署(TiDB Operator)。

核心架构

  • TiDB Server:无状态 SQL 计算层,处理 SQL 解析、优化及执行计划生成。
  • TiKV Server:分布式行式存储引擎,基于 Raft 协议实现数据强一致性与高可用。
  • PD Server:元数据管理与调度中枢,负责 Region 调度及全局 ID 分配。
  • TiFlash Server:列式存储引擎,通过 Multi-Raft Learner 实时同步 TiKV 数据,支持实时分析。

主要限制

  • 功能限制:不支持存储过程、自定义函数和触发器。
  • 资源开销:分布式架构引入额外管理开销(如多副本同步)。
  • 适用规模:数据量低于千万级时,单机 MySQL 可能更经济。
  • 其他限制:默认单行大小 ≤6 MB(可调至 120 MB),用户名最长 32 字符。

应用场景

  • 金融核心系统:需 RPO=0 和 RTO≤30 秒的高可用场景。
  • 高并发 OLTP:替代分库分表,实现透明水平扩展。
  • 实时 HTAP:同一份数据同时支持交易与分析(T+0)。
  • 数据汇聚与报表:简化传统 Hadoop 架构,直接通过 SQL 生成报表。

Java 交互

连接与驱动
  • 驱动 :使用 mysql-connector-java。

  • 连接字符串 :配置多个 TiDB 节点地址以实现负载均衡。

    java 复制代码
    String url = "jdbc:mysql://tidb-host1:4000,tidb-host2:4000/testdb?loadBalanceAutoCommitStatementThreshold=5";
  • 连接池:推荐 HikariCP,配置与 MySQL 一致。

事务处理
  • 乐观事务 :默认模式,提交时检测冲突,需处理重试逻辑。

    java 复制代码
    int maxRetries = 3;
    for (int i = 0; i < maxRetries; i++) {
        try {
            updateAccountBalance(connection, accountId, amount);
            connection.commit();
            break;
        } catch (MySQLTransactionRollbackException e) {
            if (i == maxRetries - 1) throw e;
            Thread.sleep(50);
        }
    }
  • 悲观事务 :通过 SET tidb_txn_mode = 'pessimistic' 启用。

主键与自增 ID
  • 显式主键:建议使用单调递增主键(避免写热点)。
  • 自增 ID :保证唯一性但不连续,可选 AUTO_RANDOM 或雪花算法。
SQL 优化
  • 避免大事务:单事务数据量过大可能触发限制(默认 100MB)。
  • 索引优化 :通过 EXPLAIN 分析执行计划。
  • 热点处理 :
    • 写入热点 :使用 SHARD_ROW_ID_BITS 或 AUTO_RANDOM 分散写入。

      sql 复制代码
      CREATE TABLE events (content TEXT) SHARD_ROW_ID_BITS = 4;  -- 16 分片
    • 读取热点:优化查询频率或分片键设计。

生态与监控

  • 工具链:支持 TiUP(部署工具)、TiDB Dashboard(监控界面)。
  • 监控指标:通过 Prometheus + Grafana 跟踪集群状态(如 Region 分布、事务延迟)。
相关推荐
夜雪一千39 分钟前
MySQL外键彻底入门:是什么、怎么用、什么时候不该用
数据库·mysql
qq_3344668644 分钟前
删除SSMS的历史登录记录
数据库·sql
zl_dfq1 小时前
Redis 之 【常见面试题总结】(从数据类型到高可用、缓存一致性全解析)
数据库·redis
龙亘川1 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
kv1102 小时前
Android studio国内开发有关
java·数据库·android studio
frjc3 小时前
分布式事务:场景与选型决策表
分布式
哭泣方源炼蛊3 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
余槐i3 小时前
EXPLAIN 显示走了索引查询仍慢:回表与选择性在 500 万行表上拉开 10 倍耗时
数据库·postgresql·性能优化·vacuum·explain
GISMagic3 小时前
5.《Designing Data-Intensive Applications》:系统设计与分布式能力提炼
分布式·ai coding
深度智能Ai3 小时前
IndexTTS‑2高清音质接口对接文档
数据库