Skip to content

TiDB Server 组件

角色定位

TiDB Server 是 TiDB 分布式数据库的SQL 计算层,负责处理客户端的 SQL 请求,包括 SQL 解析、优化、执行等核心功能。它是客户端与存储层(TiKV)之间的桥梁,将 SQL 查询转换为分布式执行计划,并协调各个 TiKV 节点执行。

核心功能

  • 客户端连接管理:处理来自 MySQL 客户端的连接请求
  • SQL 解析与语法检查:将 SQL 语句解析为抽象语法树(AST)
  • 查询优化:生成高效的分布式执行计划
  • 分布式执行:协调多个 TiKV 节点执行查询
  • 结果集聚合:收集和合并各个节点的执行结果
  • 事务管理:支持 ACID 分布式事务
  • 元数据管理:与 PD 交互,获取和更新集群元数据

架构特点

  • 无状态设计:TiDB Server 本身不存储数据,所有状态信息存储在 PD 和 TiKV 中
  • 水平扩展:可以通过增加节点数量线性提升处理能力
  • 负载均衡:客户端连接可以均匀分布到多个 TiDB Server 节点
  • 高可用性:单个节点故障不影响整个集群的可用性
  • MySQL 兼容:完全兼容 MySQL 5.7/8.0 协议和语法

架构设计

内部模块

TiDB Server 内部包含多个核心模块,协同工作处理 SQL 请求:

1. 连接层

  • 功能:处理客户端连接,支持 TCP/IP、Unix Socket 等连接方式
  • 协议支持:MySQL 5.7/8.0 协议
  • 连接池:管理客户端连接,支持连接复用
  • 认证授权:处理用户认证和权限检查

2. 语法解析层

  • 功能:将 SQL 语句解析为抽象语法树(AST)
  • 语法检查:验证 SQL 语句的语法正确性
  • 语义分析:检查表名、列名等对象是否存在
  • 输出:生成结构化的 AST,供后续优化使用

3. 查询优化层

  • 功能:将 AST 转换为高效的执行计划
  • 逻辑优化:包括谓词下推、列裁剪、连接重排等
  • 物理优化:选择最优的物理执行算子,如扫描方式、连接算法等
  • 分布式优化:将查询分解为可在多个 TiKV 节点上并行执行的任务
  • 代价估算:基于统计信息估算执行计划的代价,选择最优计划

4. 执行层

  • 功能:执行优化后的查询计划
  • 算子执行:执行各种查询算子,如扫描、过滤、连接、聚合等
  • 分布式协调:协调多个 TiKV 节点执行任务
  • 结果集处理:收集、合并和排序查询结果
  • 事务管理:处理事务的开始、提交、回滚等操作

5. 存储接口层

  • 功能:与 TiKV 存储层交互
  • 接口封装:提供统一的存储访问接口
  • 数据编码:将 SQL 数据类型转换为 TiKV 支持的键值格式
  • 并发控制:处理并发访问和锁机制

6. 事务层

  • 功能:实现分布式事务
  • 乐观事务:默认的事务模式,减少锁竞争
  • 悲观事务:支持悲观锁,适合高冲突场景
  • 两阶段提交:实现分布式事务提交
  • 事务重试:自动重试失败的事务

数据流转过程

客户端请求 → 连接层 → 语法解析层 → 查询优化层 → 执行层 → 存储接口层 → TiKV
TiKV 响应 → 存储接口层 → 执行层 → 连接层 → 客户端

部署与配置

部署方式

1. 使用 TiUP 部署

部署命令

bash
# 编辑拓扑文件
vi topology.yaml

# 部署集群
tiup cluster deploy <cluster-name> <tidb-version> topology.yaml --user root -p

# 启动集群
tiup cluster start <cluster-name>

拓扑文件示例

yaml
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb-deploy"
  data_dir: "/tidb-data"

server_configs:
  tidb:
    log.level: "info"

tidb_servers:
  - host: 10.0.0.1
    port: 4000
    status_port: 10080
  - host: 10.0.0.2
    port: 4000
    status_port: 10080

2. 使用 TiDB Operator 部署

YAML 配置示例

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  name: basic
spec:
  version: v7.5.0
  tidb:
    replicas: 2
    template:
      spec:
        containers:
        - name: tidb
          resources:
            requests:
              cpu: 2
              memory: 4Gi
            limits:
              cpu: 4
              memory: 8Gi

核心配置参数

1. 连接配置

参数默认值说明
port4000TiDB Server 监听端口,用于接收客户端连接
status_port10080状态端口,用于监控和管理
advertise-address对外暴露的地址,用于集群内部通信
socketUnix Socket 文件路径,用于本地连接
max_connections10000最大并发连接数
max_user_connections0每个用户的最大连接数,0 表示无限制

2. 性能配置

参数默认值说明
oom-action"log"OOM 处理方式,可选值:"log"、"cancel"
mem-quota-query34359738368单个查询的内存限制(字节)
txn-total-size-limit104857600单个事务的总大小限制(字节)
tmp-storage-path"/tmp"临时文件存储路径
enable-streamingtrue是否启用流式执行
tikv-client并发16与 TiKV 交互的并发数

3. 日志配置

参数默认值说明
log.level"info"日志级别,可选值:"debug"、"info"、"warn"、"error"
log.format"text"日志格式,可选值:"text"、"json"
log.file日志文件路径,为空时输出到标准输出
log.roll-size300MiB日志文件滚动大小
log.roll-backups20保留的日志文件数量

4. 事务配置

参数默认值说明
txn-mode"pessimistic"事务模式,可选值:"pessimistic"、"optimistic"
pessimistic-txn.timeout41000000000悲观事务锁超时时间(纳秒)
optimistic-txn.timeout10000000000乐观事务超时时间(纳秒)
txn-retry-limit10事务重试次数限制

配置文件管理

  • 配置文件路径:默认位于 $DEPLOY_DIR/conf/tidb.toml
  • 动态配置:部分配置支持运行时修改,无需重启服务
  • 配置重载:使用 tiup cluster reload cluster-name -R tidb 命令重载配置
  • 在线修改:使用 SQL 语句 SET GLOBAL variable = value 修改动态配置

监控与运维

监控指标

TiDB Server 提供了丰富的监控指标,可通过 Prometheus 收集和 Grafana 可视化:

1. 连接指标

  • tidb_server_connections:当前活跃连接数
  • tidb_server_connection_errors_total:连接错误总数
  • tidb_server_aborted_connections_total:中断的连接总数

2. 查询指标

  • tidb_server_qps:每秒查询数
  • tidb_server_tps:每秒事务数
  • tidb_server_query_duration_seconds_bucket:查询延迟分布
  • tidb_server_slow_queries_total:慢查询总数

3. 执行指标

  • tidb_executor_statement_total:执行的语句总数
  • tidb_executor_errors_total:执行错误总数
  • tidb_executor_duration_seconds_bucket:执行延迟分布

4. 事务指标

  • tidb_txn_active_total:当前活跃事务数
  • tidb_txn_commit_total:提交的事务总数
  • tidb_txn_rollback_total:回滚的事务总数
  • tidb_txn_retry_total:重试的事务总数

5. 内存指标

  • tidb_server_memory_usage_bytes:内存使用量
  • tidb_server_heap_memory_usage_bytes:堆内存使用量
  • tidb_server_gc_runs_total:垃圾回收次数

日志分析

1. 日志格式

文本格式

[2024/01/20 10:00:00.123 +08:00] [INFO] [server.go:1234] ["server is running"] [addr="0.0.0.0:4000"] [statusAddr="0.0.0.0:10080"] [version="v7.5.0"]

JSON 格式

json
{
  "level": "info",
  "ts": "2024-01-20T10:00:00.123+08:00",
  "caller": "server.go:1234",
  "msg": "server is running",
  "addr": "0.0.0.0:4000",
  "statusAddr": "0.0.0.0:10080",
  "version": "v7.5.0"
}

2. 关键日志分析

  • 慢查询日志:包含执行时间超过阈值的查询,默认阈值为 300ms
  • 错误日志:记录系统错误和异常情况
  • 连接日志:记录客户端连接和断开事件
  • 事务日志:记录事务的开始、提交、回滚等事件

常见运维操作

1. 查看 TiDB Server 状态

bash
# 使用 tiup 查看状态
tiup cluster display <cluster-name> | grep tidb

# 查看进程状态
ps -ef | grep tidb-server

# 查看端口监听
netstat -tlnp | grep 4000

2. 重启 TiDB Server

bash
# 重启单个 TiDB Server 节点
tiup cluster restart <cluster-name> -R tidb[0]

# 重启所有 TiDB Server 节点
tiup cluster restart <cluster-name> -R tidb

3. 升级 TiDB Server

bash
# 升级集群所有组件
tiup cluster upgrade <cluster-name> <new-version>

# 仅升级 TiDB Server 组件
tiup cluster upgrade <cluster-name> <new-version> -R tidb

4. 扩容 TiDB Server

bash
# 编辑拓扑文件,添加新节点
vi topology.yaml

# 扩容集群
tiup cluster scale-out <cluster-name> topology.yaml

5. 缩容 TiDB Server

bash
# 编辑缩容配置文件
vi scale-in.yaml

# 缩容集群
tiup cluster scale-in <cluster-name> -N <tidb-node-ip>:4000

性能优化

查询优化

1. 优化器统计信息

  • 收集统计信息

    sql
    ANALYZE TABLE <table_name>;
  • 查看统计信息

    sql
    SHOW STATS_META LIKE '<table_name>';
    SHOW STATS_HISTOGRAMS LIKE '<table_name>';

2. 执行计划分析

  • 查看执行计划

    sql
    EXPLAIN SELECT * FROM <table_name> WHERE <condition>;
    EXPLAIN ANALYZE SELECT * FROM <table_name> WHERE <condition>;
  • 优化建议

    • 为频繁查询的列添加索引
    • 避免全表扫描,尽量使用索引扫描
    • 优化 JOIN 操作,选择合适的连接顺序
    • 避免在 WHERE 子句中使用函数,以免索引失效

连接优化

1. 连接池配置

  • 客户端使用连接池管理连接,避免频繁创建和关闭连接
  • 合理设置连接池大小,根据业务并发量调整
  • 设置连接超时和空闲超时,及时释放无用连接

2. 线程池配置

  • TiDB Server 内部使用线程池处理请求
  • 合理设置线程池大小,避免线程过多导致上下文切换开销
  • 监控线程池状态,及时调整配置

内存优化

1. 查询内存限制

  • 为单个查询设置合理的内存限制
  • 监控查询内存使用情况,及时发现内存泄漏
  • 对于大查询,考虑使用分区表或分页查询

2. 临时表优化

  • 避免在查询中创建过大的临时表
  • 合理设置临时表存储路径,使用高性能存储
  • 监控临时表使用情况,及时清理无用临时表

高可用性与容灾

高可用性设计

  • 多节点部署:部署多个 TiDB Server 节点,实现负载均衡和故障容错
  • 无状态设计:单个节点故障不影响数据安全,可快速恢复
  • 自动故障检测:PD 自动检测节点故障,客户端自动路由到可用节点
  • 快速恢复:故障节点恢复后可立即加入集群,无需数据同步

容灾部署

  • 跨 AZ 部署:将 TiDB Server 节点部署在不同可用区,提高容灾能力
  • 跨 Region 部署:将 TiDB Server 节点部署在不同地域,实现异地容灾
  • 读写分离:配置读写分离,提高读性能和容灾能力
  • 备份恢复:定期备份数据,确保数据可恢复

常见问题与排查

1. 连接失败

现象:客户端无法连接到 TiDB Server

排查步骤

  • 检查 TiDB Server 进程是否运行:ps -ef | grep tidb-server
  • 检查端口是否监听:netstat -tlnp | grep 4000
  • 检查防火墙配置:确保 4000 端口允许访问
  • 检查用户权限:确认用户名和密码正确,且有访问权限
  • 检查连接数限制:确认未超过 max_connections 限制

解决方案

  • 启动 TiDB Server 进程
  • 调整防火墙规则,开放 4000 端口
  • 增加 max_connections 配置
  • 检查用户权限,确保配置正确

2. 慢查询

现象:查询执行时间过长

排查步骤

  • 查看慢查询日志:grep -i "slow query" tidb.log
  • 分析执行计划:使用 EXPLAIN ANALYZE 查看执行计划
  • 检查统计信息:确认统计信息是否最新
  • 检查索引使用:确认查询是否使用了合适的索引
  • 检查系统资源:确认 CPU、内存、磁盘 I/O 是否正常

解决方案

  • 收集统计信息:ANALYZE TABLE table_name
  • 添加合适的索引
  • 优化查询语句,避免全表扫描
  • 调整 tidb_server_query_duration_seconds_bucket 阈值
  • 增加系统资源或优化系统配置

3. 内存占用过高

现象:TiDB Server 内存占用过高,甚至 OOM

排查步骤

  • 监控内存使用:通过 Prometheus 监控 tidb_server_memory_usage_bytes
  • 查看内存使用详情:使用 go tool pprof 分析内存使用
  • 检查大查询:查看是否有占用大量内存的查询
  • 检查临时表:查看是否有大量临时表创建

解决方案

  • 调整 mem-quota-query 配置,限制单个查询内存使用
  • 优化大查询,避免一次性处理大量数据
  • 合理设置临时表存储路径和大小
  • 升级服务器内存或增加 TiDB Server 节点

4. 事务冲突

现象:事务提交失败,出现冲突

排查步骤

  • 查看事务日志:检查事务冲突的具体原因
  • 分析业务逻辑:确认是否存在高冲突的业务场景
  • 检查事务模式:确认当前使用的是乐观事务还是悲观事务

解决方案

  • 对于高冲突场景,切换到悲观事务模式:
    sql
    SET GLOBAL txn_mode = 'pessimistic';
  • 优化业务逻辑,减少事务冲突
  • 增加事务重试次数:调整 txn-retry-limit 配置
  • 缩小事务范围,减少锁定资源

5. 并发性能问题

现象:并发访问时性能下降明显

排查步骤

  • 监控 QPS/TPS 变化:确认并发性能瓶颈
  • 检查连接数:确认是否超过连接限制
  • 检查线程池状态:确认线程池是否饱和
  • 检查 TiKV 响应时间:确认是否是存储层瓶颈

解决方案

  • 增加 TiDB Server 节点,分担并发压力
  • 调整连接池配置,优化连接管理
  • 调整线程池大小,提高并发处理能力
  • 优化 TiKV 配置,提高存储层性能

最佳实践

1. 部署建议

  • 生产环境:建议部署至少 2-3 个 TiDB Server 节点,实现高可用性
  • 资源配置:每个 TiDB Server 节点建议配置 16C 32GB 内存起
  • 存储选择:TiDB Server 对存储要求不高,普通 SSD 即可
  • 网络配置:确保 TiDB Server 与 TiKV、PD 之间的网络延迟低

2. 配置建议

  • 连接数:根据业务并发量调整 max_connections,建议设置为 5000-10000
  • 内存限制:根据节点内存大小调整 mem-quota-query,建议设置为节点内存的 50%-70%
  • 日志级别:生产环境建议设置为 "info",避免过多日志影响性能
  • 事务模式:根据业务场景选择合适的事务模式,低冲突场景使用乐观事务,高冲突场景使用悲观事务

3. 监控建议

  • 核心指标:监控 QPS、TPS、查询延迟、连接数、内存使用等核心指标
  • 告警配置:设置合理的告警阈值,及时发现问题
  • 日志管理:定期清理日志,避免磁盘空间不足
  • 慢查询分析:定期分析慢查询日志,优化查询性能

4. 维护建议

  • 定期备份:定期备份数据,确保数据安全
  • 定期升级:及时升级到最新版本,获取性能优化和 bug 修复
  • 定期检查:定期检查集群状态,发现并解决潜在问题
  • 文档记录:记录集群配置和维护操作,便于后续管理

常见问题(FAQ)

Q1: TiDB Server 是无状态的吗?

A1: 是的,TiDB Server 是无状态的,所有状态信息存储在 PD 和 TiKV 中。这意味着:

  • 可以随时添加或移除 TiDB Server 节点,无需数据同步
  • 单个节点故障不影响数据安全
  • 客户端连接可以均匀分布到多个 TiDB Server 节点

Q2: TiDB Server 支持哪些客户端协议?

A2: TiDB Server 完全兼容 MySQL 5.7/8.0 协议,支持所有 MySQL 客户端:

  • MySQL 命令行工具
  • MySQL Workbench
  • Navicat、DBeaver 等 GUI 工具
  • 各种编程语言的 MySQL 驱动(如 Java JDBC、Python MySQLdb 等)

Q3: 如何查看 TiDB Server 的版本?

A3: 可以通过以下方式查看 TiDB Server 版本:

  • SQL 命令
    sql
    SELECT VERSION();
  • 命令行
    bash
    mysql -h <tidb-ip> -P 4000 -u root -e "SELECT VERSION();"
  • TiUP
    bash
    tiup cluster display <cluster-name> | grep Version

Q4: TiDB Server 支持哪些存储引擎?

A4: TiDB Server 主要与 TiKV 存储引擎交互,同时也支持:

  • TiFlash:列式存储引擎,用于 HTAP 场景
  • TiKV Raw:Raw KV 接口,用于直接操作键值数据

Q5: 如何优化 TiDB Server 的查询性能?

A5: 优化 TiDB Server 查询性能的方法包括:

  • 为频繁查询的列添加索引
  • 定期收集统计信息,确保优化器生成准确的执行计划
  • 分析执行计划,优化查询语句
  • 避免全表扫描,尽量使用索引扫描
  • 优化 JOIN 操作,选择合适的连接顺序
  • 合理设置内存限制,避免内存溢出

Q6: TiDB Server 如何处理大查询?

A6: TiDB Server 处理大查询的机制包括:

  • 流式执行:支持流式执行,减少内存占用
  • 并行执行:将查询分解为多个并行任务,提高执行效率
  • 内存限制:设置单个查询的内存限制,避免 OOM
  • 临时表:使用临时表存储中间结果
  • 查询超时:设置查询超时,避免查询无限期执行

Q7: 如何监控 TiDB Server 的性能?

A7: 监控 TiDB Server 性能的方法包括:

  • Prometheus + Grafana:官方推荐的监控方案,提供丰富的监控面板
  • 慢查询日志:记录执行时间超过阈值的查询,便于分析
  • 状态变量:通过 SHOW GLOBAL STATUS 查看各种状态指标
  • 性能_schema:通过 performance_schema 查看更详细的性能数据

Q8: TiDB Server 支持哪些事务隔离级别?

A8: TiDB Server 支持四种标准的事务隔离级别:

  • READ UNCOMMITTED:允许读取未提交的数据
  • READ COMMITTED:只允许读取已提交的数据
  • REPEATABLE READ(默认):保证同一事务中多次读取结果一致
  • SERIALIZABLE:最高隔离级别,保证事务串行执行

可以通过以下命令设置事务隔离级别:

sql
SET GLOBAL tx_isolation = 'REPEATABLE-READ';
SET SESSION tx_isolation = 'READ-COMMITTED';

Q9: 如何扩展 TiDB Server 集群?

A9: 扩展 TiDB Server 集群的步骤:

  1. 准备新的服务器节点,安装必要的依赖
  2. 编辑拓扑文件,添加新的 TiDB Server 节点配置
  3. 使用 TiUP 或 TiDB Operator 扩容集群
  4. 更新负载均衡配置,将流量分发到新节点
  5. 监控新节点的性能和状态

Q10: TiDB Server 与 MySQL 有哪些主要区别?

A10: TiDB Server 与 MySQL 的主要区别包括:

  • 架构:TiDB Server 是分布式架构,MySQL 是单机或主从架构
  • 扩展性:TiDB Server 支持水平扩展,MySQL 主要是垂直扩展
  • 分布式事务:TiDB Server 支持分布式事务,MySQL 仅支持单机事务
  • 存储引擎:TiDB Server 使用 TiKV/TiFlash 存储引擎,MySQL 使用 InnoDB 等存储引擎
  • 高可用性:TiDB Server 天生高可用,MySQL 需要额外配置主从复制
  • HTAP 能力:TiDB Server 支持 HTAP 混合负载,MySQL 需要借助其他工具实现