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 分布、事务延迟)。
相关推荐
星恒随风9 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下10 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人12 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
2601_9679873713 小时前
Sqlite参考手册
数据库·python·sqlite·api·教程
隔窗听雨眠13 小时前
Oracle日志体系分层结构与故障定位路径
数据库·oracle·故障排查
为思念酝酿的痛13 小时前
C语言操作MySQL
数据库·mysql
ShineWinsu14 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
zixu_star15 小时前
从单机到分布式:定时任务如何处理大量数据与执行失败?
分布式
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql