外观
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: 100802. 使用 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. 连接配置
| 参数 | 默认值 | 说明 |
|---|---|---|
port | 4000 | TiDB Server 监听端口,用于接收客户端连接 |
status_port | 10080 | 状态端口,用于监控和管理 |
advertise-address | 空 | 对外暴露的地址,用于集群内部通信 |
socket | 空 | Unix Socket 文件路径,用于本地连接 |
max_connections | 10000 | 最大并发连接数 |
max_user_connections | 0 | 每个用户的最大连接数,0 表示无限制 |
2. 性能配置
| 参数 | 默认值 | 说明 |
|---|---|---|
oom-action | "log" | OOM 处理方式,可选值:"log"、"cancel" |
mem-quota-query | 34359738368 | 单个查询的内存限制(字节) |
txn-total-size-limit | 104857600 | 单个事务的总大小限制(字节) |
tmp-storage-path | "/tmp" | 临时文件存储路径 |
enable-streaming | true | 是否启用流式执行 |
tikv-client并发 | 16 | 与 TiKV 交互的并发数 |
3. 日志配置
| 参数 | 默认值 | 说明 |
|---|---|---|
log.level | "info" | 日志级别,可选值:"debug"、"info"、"warn"、"error" |
log.format | "text" | 日志格式,可选值:"text"、"json" |
log.file | 空 | 日志文件路径,为空时输出到标准输出 |
log.roll-size | 300MiB | 日志文件滚动大小 |
log.roll-backups | 20 | 保留的日志文件数量 |
4. 事务配置
| 参数 | 默认值 | 说明 |
|---|---|---|
txn-mode | "pessimistic" | 事务模式,可选值:"pessimistic"、"optimistic" |
pessimistic-txn.timeout | 41000000000 | 悲观事务锁超时时间(纳秒) |
optimistic-txn.timeout | 10000000000 | 乐观事务超时时间(纳秒) |
txn-retry-limit | 10 | 事务重试次数限制 |
配置文件管理
- 配置文件路径:默认位于
$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 40002. 重启 TiDB Server
bash
# 重启单个 TiDB Server 节点
tiup cluster restart <cluster-name> -R tidb[0]
# 重启所有 TiDB Server 节点
tiup cluster restart <cluster-name> -R tidb3. 升级 TiDB Server
bash
# 升级集群所有组件
tiup cluster upgrade <cluster-name> <new-version>
# 仅升级 TiDB Server 组件
tiup cluster upgrade <cluster-name> <new-version> -R tidb4. 扩容 TiDB Server
bash
# 编辑拓扑文件,添加新节点
vi topology.yaml
# 扩容集群
tiup cluster scale-out <cluster-name> topology.yaml5. 缩容 TiDB Server
bash
# 编辑缩容配置文件
vi scale-in.yaml
# 缩容集群
tiup cluster scale-in <cluster-name> -N <tidb-node-ip>:4000性能优化
查询优化
1. 优化器统计信息
收集统计信息:
sqlANALYZE TABLE <table_name>;查看统计信息:
sqlSHOW STATS_META LIKE '<table_name>'; SHOW STATS_HISTOGRAMS LIKE '<table_name>';
2. 执行计划分析
查看执行计划:
sqlEXPLAIN 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 集群的步骤:
- 准备新的服务器节点,安装必要的依赖
- 编辑拓扑文件,添加新的 TiDB Server 节点配置
- 使用 TiUP 或 TiDB Operator 扩容集群
- 更新负载均衡配置,将流量分发到新节点
- 监控新节点的性能和状态
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 需要借助其他工具实现
