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_BITSAUTO_RANDOM 分散写入。

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

生态与监控

  • 工具链:支持 TiUP(部署工具)、TiDB Dashboard(监控界面)。
  • 监控指标:通过 Prometheus + Grafana 跟踪集群状态(如 Region 分布、事务延迟)。
相关推荐
Elastic 中国社区官方博客1 天前
Elasticsearch:使用 Agent Builder 的 A2A 实现 - 开发者的圣诞颂歌
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
2301_816660211 天前
PHP怎么处理Eloquent Attribute Inference属性推断_Laravel从数据自动推导类型【操作】
jvm·数据库·python
qq_372154231 天前
Go 中自定义类型与基础类型的显式转换规则详解
jvm·数据库·python
_下雨天.1 天前
NoSQL之Redis配置与优化
数据库·redis·nosql
LiAo_1996_Y1 天前
CSS如何实现文字渐变效果_通过background-clip实现艺术字
jvm·数据库·python
2401_887724501 天前
CSS如何让表单在手机端友好展示_利用Flexbox实现堆叠排版
jvm·数据库·python
数据库小组1 天前
MySQL 删库后怎么恢复?binlog2sql 之外,NineData 还能做什么
数据库·sql·mysql·安全·数据·ninedata·删库
zhangchaoxies1 天前
Layui轮播图(carousel)怎么设置自动播放间隔
jvm·数据库·python
切糕师学AI1 天前
HBase:一文搞懂分布式宽列数据库(原理 + 架构 + 实战)
数据库·分布式·nosql·hbase·分布式宽列数据库·wide column db
competes1 天前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql