Skip to content

TiDB 日志收集与存储

日志类型

1. 组件日志

TiDB 日志

  • 默认位置/tidb-deploy/tidb-[port]/log/tidb.log
  • 主要内容:SQL 执行日志、慢查询日志、错误日志
  • 日志级别:debug, info, warn, error

TiKV 日志

  • 默认位置/tidb-deploy/tikv-[port]/log/tikv.log
  • 主要内容:Raft 日志、存储引擎日志、gRPC 日志、错误日志
  • 日志级别:debug, info, warn, error

PD 日志

  • 默认位置/tidb-deploy/pd-[port]/log/pd.log
  • 主要内容:调度日志、集群管理日志、错误日志
  • 日志级别:debug, info, warn, error

TiFlash 日志

  • 默认位置/tidb-deploy/tiflash-[port]/log/tiflash.log
  • 主要内容:查询执行日志、存储引擎日志、错误日志
  • 日志级别:trace, debug, information, warning, error, critical

TiCDC 日志

  • 默认位置/tidb-deploy/cdc-[port]/log/cdc.log
  • 主要内容:同步日志、错误日志
  • 日志级别:debug, info, warn, error

2. 慢查询日志

  • 默认位置/tidb-deploy/tidb-[port]/log/slow.log
  • 主要内容:执行时间超过阈值的 SQL 语句
  • 配置参数slow-threshold(默认 300ms)

3. 审计日志

  • 默认位置:需手动配置
  • 主要内容:用户登录、权限变更、敏感操作
  • 配置方式:通过 tidb_enable_audit 系统变量启用

日志配置

1. 日志级别配置

TiDB 日志级别

toml
# TiDB 配置文件
[log]
# 日志级别
level = "info"
# 日志格式
format = "text"  # 可选:text, json
# 日志文件路径
file = "/tidb-deploy/tidb-4000/log/tidb.log"
# 慢查询日志路径
slow-query-file = "/tidb-deploy/tidb-4000/log/slow.log"
# 慢查询阈值(毫秒)
slow-threshold = 300

TiKV 日志级别

toml
# TiKV 配置文件
[logger]
# 日志级别
level = "info"
# 日志格式
format = "text"  # 可选:text, json
# 日志文件路径
file = "/tidb-deploy/tikv-20160/log/tikv.log"
# 日志文件大小限制(MB)
rotation.size = 300
# 日志文件保留数量
rotation.keep = 10

PD 日志级别

toml
# PD 配置文件
[log]
# 日志级别
level = "info"
# 日志格式
format = "text"  # 可选:text, json
# 日志文件路径
file = "/tidb-deploy/pd-2379/log/pd.log"
# 日志文件大小限制(MB)
max-size = 1024
# 日志文件保留天数
max-days = 7

2. 动态调整日志级别

TiDB 动态调整

sql
-- 设置全局日志级别
SET GLOBAL log_level = 'debug';

-- 设置会话日志级别
SET SESSION log_level = 'debug';

-- 查看当前日志级别
SELECT @@global.log_level, @@session.log_level;

PD 动态调整

bash
# 通过 PD API 调整日志级别
curl -X POST -d '{"level":"debug"}' http://<pd-address>:2379/pd/api/v1/config/log

日志收集方案

1. 基于 TiUP 的日志收集

bash
# 查看集群日志
tiup cluster log <cluster-name>

# 查看特定组件日志
tiup cluster log <cluster-name> --component tidb

# 查看特定实例日志
tiup cluster log <cluster-name> --instance <instance-address>:<port>

# 实时查看日志
tiup cluster log <cluster-name> --follow

# 查看指定时间范围的日志
tiup cluster log <cluster-name> --start-time "2023-01-01 00:00:00" --end-time "2023-01-01 01:00:00"

2. 基于 Filebeat 的日志收集

安装 Filebeat

bash
# 下载 Filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.0-linux-x86_64.tar.gz

# 解压
 tar -xzf filebeat-7.17.0-linux-x86_64.tar.gz
cd filebeat-7.17.0-linux-x86_64

配置 Filebeat

yaml
# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tidb-deploy/tidb-*/log/tidb.log
  fields:
    component: tidb
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tidb-deploy/tikv-*/log/tikv.log
  fields:
    component: tikv
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tidb-deploy/pd-*/log/pd.log
  fields:
    component: pd
  fields_under_root: true

output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]
  index: "tidb-logs-%{+yyyy.MM.dd}"

setup.template.name: "tidb"
setup.template.pattern: "tidb-*"
setup.ilm.enabled: false

启动 Filebeat

bash
# 启动 Filebeat
./filebeat -e -c filebeat.yml

# 作为服务启动
systemctl enable filebeat
systemctl start filebeat

3. 基于 Fluentd 的日志收集

安装 Fluentd

bash
# 使用 gem 安装
 gem install fluentd -v "~> 1.14.0"

# 或使用 td-agent
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh

配置 Fluentd

xml
# /etc/td-agent/td-agent.conf
<source>
  @type tail
  path /tidb-deploy/tidb-*/log/tidb.log
  pos_file /var/log/td-agent/tidb.log.pos
  tag tidb.log
  <parse>
    @type multiline
    pattern_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} /
    format /^(?<log_time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+(?<log_level>\w+)\s+(?<log_message>.*)$/
    time_format %Y-%m-%d %H:%M:%S.%L
  </parse>
</source>

<source>
  @type tail
  path /tidb-deploy/tikv-*/log/tikv.log
  pos_file /var/log/td-agent/tikv.log.pos
  tag tikv.log
  <parse>
    @type multiline
    pattern_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} /
    format /^(?<log_time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+(?<log_level>\w+)\s+(?<log_message>.*)$/
    time_format %Y-%m-%d %H:%M:%S.%L
  </parse>
</source>

<match tidb.log tikv.log pd.log>
  @type elasticsearch
  hosts https://elasticsearch:9200
  index tidb-logs-%Y.%m.%d
  user elastic
  password password
  <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
  </buffer>
</match>

启动 Fluentd

bash
# 启动 td-agent
systemctl enable td-agent
systemctl start td-agent

# 查看日志
tail -f /var/log/td-agent/td-agent.log

4. 基于 Loki 的日志收集

安装 Loki 和 Promtail

bash
# 下载 Loki
wget https://github.com/grafana/loki/releases/download/v2.5.0/loki-linux-amd64.zip
unzip loki-linux-amd64.zip

# 下载 Promtail
wget https://github.com/grafana/loki/releases/download/v2.5.0/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip

配置 Promtail

yaml
# promtail-config.yaml
target_config:
  sync_period: 10s

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: tidb_logs
  static_configs:
  - targets:
      - localhost
    labels:
      job: tidb_logs
      host: <hostname>
      __path__: /tidb-deploy/tidb-*/log/tidb.log

- job_name: tikv_logs
  static_configs:
  - targets:
      - localhost
    labels:
      job: tikv_logs
      host: <hostname>
      __path__: /tidb-deploy/tikv-*/log/tikv.log

- job_name: pd_logs
  static_configs:
  - targets:
      - localhost
    labels:
      job: pd_logs
      host: <hostname>
      __path__: /tidb-deploy/pd-*/log/pd.log

启动 Loki 和 Promtail

bash
# 启动 Loki
nohup ./loki-linux-amd64 -config.file=loki-config.yaml &

# 启动 Promtail
nohup ./promtail-linux-amd64 -config.file=promtail-config.yaml &

日志存储

1. 本地存储

存储配置

toml
# TiDB 日志存储配置
[log]
file = "/tidb-deploy/tidb-4000/log/tidb.log"

# TiKV 日志存储配置
[logger]
file = "/tidb-deploy/tikv-20160/log/tikv.log"
rotation.size = 300  # MB
rotation.keep = 10   # 保留文件数量

# PD 日志存储配置
[log]
file = "/tidb-deploy/pd-2379/log/pd.log"
max-size = 1024  # MB
max-days = 7     # 保留天数

存储优化

  • 使用高性能存储设备(如 SSD)存储日志
  • 合理规划日志分区,避免与数据分区共用
  • 定期清理过期日志,释放磁盘空间
  • 考虑使用 LVM 或 RAID 提高存储可靠性

2. 集中式存储

Elasticsearch

  • 优点:强大的搜索能力、丰富的可视化、可扩展性好
  • 缺点:资源消耗高、配置复杂
  • 适用场景:大规模集群、需要复杂查询和分析

Loki

  • 优点:轻量级、与 Grafana 无缝集成、资源消耗低
  • 缺点:搜索能力相对较弱
  • 适用场景:与 Prometheus 配合使用、中小规模集群

ClickHouse

  • 优点:高性能、列式存储、适合大规模日志存储
  • 缺点:配置复杂、学习曲线陡峭
  • 适用场景:大规模日志分析、需要复杂聚合查询

3. 存储策略

热数据存储

  • 存储介质:SSD 或高性能云存储
  • 保留时间:7-30 天
  • 访问频率:高
  • 存储方案:Elasticsearch、Loki

冷数据存储

  • 存储介质:HDD 或低成本云存储
  • 保留时间:30-90 天
  • 访问频率:低
  • 存储方案:对象存储(S3、OSS 等)

归档存储

  • 存储介质:磁带或归档云存储
  • 保留时间:90 天以上
  • 访问频率:极低
  • 存储方案:对象存储归档层

日志管理

1. 日志轮转

TiDB 日志轮转

TiDB 日志自动轮转,可通过配置文件调整:

toml
[log]
# 日志文件大小限制(MB)
max-size = 1024
# 日志文件保留天数
max-days = 7
# 日志文件保留数量
max-backups = 10

TiKV 日志轮转

toml
[logger]
# 日志文件大小限制(MB)
rotation.size = 300
# 日志文件保留数量
rotation.keep = 10

2. 日志清理

手动清理

bash
# 清理过期日志
find /tidb-deploy/*/log/ -name "*.log.*" -mtime +7 -delete

# 清理超过指定大小的日志
find /tidb-deploy/*/log/ -name "*.log" -size +1024M -delete

自动清理

使用 crontab 定期清理日志:

bash
# 编辑 crontab
crontab -e

# 添加清理任务(每天凌晨 2 点执行)
0 2 * * * find /tidb-deploy/*/log/ -name "*.log.*" -mtime +7 -delete

3. 日志分析

使用 grep 分析

bash
# 查找错误日志
grep -i "error" /tidb-deploy/tidb-4000/log/tidb.log

# 查找慢查询
grep -A 5 -B 5 "Slow query" /tidb-deploy/tidb-4000/log/slow.log

# 统计错误数量
grep -c "error" /tidb-deploy/tikv-20160/log/tikv.log

使用 TiDB Dashboard 分析

  1. 登录 TiDB Dashboard
  2. 点击 "日志搜索" 菜单项
  3. 设置搜索条件(时间范围、组件、日志级别、关键词)
  4. 查看搜索结果并进行分析

使用 ELK Stack 分析

  1. 登录 Kibana
  2. 创建索引模式
  3. 使用 Discover 视图搜索和分析日志
  4. 创建可视化仪表板
  5. 设置告警规则

4. 日志安全

  • 访问控制:限制日志文件的访问权限,仅允许管理员访问
  • 加密传输:日志传输过程中使用 TLS 加密
  • 加密存储:敏感日志内容加密存储
  • 审计日志:记录日志访问和操作记录
  • 定期备份:重要日志定期备份到安全位置

最佳实践

1. 日志配置最佳实践

  • 生产环境建议使用 info 级别日志
  • 调试时临时调整为 debug 级别
  • 启用 json 格式日志,便于机器解析
  • 合理设置日志轮转策略,避免日志过大

2. 收集方案选择

  • 小规模集群:使用 TiUP 或 Filebeat
  • 大规模集群:使用 Fluentd 或 Logstash
  • 与 Prometheus 配合:使用 Loki
  • 需要强大搜索能力:使用 ELK Stack

3. 存储策略最佳实践

  • 采用分层存储策略,降低存储成本
  • 热数据使用高性能存储,冷数据使用低成本存储
  • 定期备份重要日志
  • 制定合理的日志保留策略

4. 性能优化

  • 日志收集过程中避免影响集群性能
  • 合理配置日志收集频率
  • 对日志进行压缩存储
  • 考虑使用采样机制减少日志量

常见问题(FAQ)

Q1: 如何查看 TiDB 慢查询日志?

A1: 可以通过以下方式查看慢查询日志:

bash
# 直接查看慢查询日志文件
tail -f /tidb-deploy/tidb-4000/log/slow.log

# 使用 TiDB Dashboard
# 登录 TiDB Dashboard -> 慢查询

# 使用 grep 过滤
grep -i "slow query" /tidb-deploy/tidb-4000/log/tidb.log

Q2: 如何调整 TiKV 日志级别?

A2: 可以通过以下方式调整 TiKV 日志级别:

  1. 修改配置文件,然后重启 TiKV:
toml
[logger]
level = "debug"
  1. 动态调整(需要 TiKV 版本 >= v5.0):
bash
# 通过 TiKV API 调整
tiup ctl tikv --host <tikv-address>:20160 modify-log-level debug

Q3: 如何处理日志过大的问题?

A3: 可以通过以下方式处理日志过大的问题:

  1. 调整日志级别,减少日志量
  2. 调整日志轮转策略,增加轮转频率
  3. 缩短日志保留时间
  4. 启用日志压缩
  5. 考虑使用采样机制

Q4: 如何将日志发送到多个目标?

A4: 可以使用 Fluentd 或 Filebeat 的多输出功能:

yaml
# Filebeat 多输出配置
output:
  elasticsearch:
    hosts: ["http://elasticsearch:9200"]
    index: "tidb-logs-%{+yyyy.MM.dd}"
  loki:
    urls: ["http://loki:3100/loki/api/v1/push"]
    tenant_id: "tidb"
    labels:
      job: "tidb-logs"

Q5: 如何监控日志收集系统?

A5: 可以通过以下方式监控日志收集系统:

  1. Filebeat 监控:启用 Filebeat 的监控功能,通过 Prometheus 收集指标
  2. Fluentd 监控:使用 fluent-plugin-prometheus 插件暴露指标
  3. Loki 监控:Loki 内置 Prometheus 指标
  4. 日志收集延迟监控:监控日志从产生到收集的延迟
  5. 日志丢失监控:监控日志收集过程中的丢失情况

Q6: 如何优化日志搜索性能?

A6: 可以通过以下方式优化日志搜索性能:

  1. 合理设计索引策略
  2. 使用合适的分片和副本配置
  3. 限制搜索时间范围
  4. 使用精确匹配代替模糊匹配
  5. 定期优化和合并索引

Q7: 如何实现日志的高可用性?

A7: 可以通过以下方式实现日志的高可用性:

  1. 日志收集组件部署多个实例
  2. 集中式存储采用集群部署
  3. 配置适当的副本数量
  4. 定期备份日志数据
  5. 实现跨可用区部署

Q8: 如何处理不同版本组件的日志格式差异?

A8: 可以通过以下方式处理:

  1. 使用灵活的日志解析规则,支持多种格式
  2. 在收集端进行日志标准化处理
  3. 制定统一的日志格式规范
  4. 升级组件时同步更新日志解析规则

Q9: 如何实现日志的合规性?

A9: 可以通过以下方式实现日志合规性:

  1. 制定明确的日志保留策略
  2. 实现日志的不可篡改性
  3. 记录日志的访问和操作审计
  4. 定期进行合规性检查
  5. 确保日志符合相关法规要求

Q10: 如何集成日志系统与告警系统?

A10: 可以通过以下方式集成:

  1. ELK Stack:使用 Kibana 告警或 Watcher
  2. Loki:使用 Grafana Alerting
  3. 自定义集成:编写脚本监控日志,触发告警
  4. 第三方工具:使用 Alertmanager 或 PagerDuty

Q11: 如何减少日志收集对集群性能的影响?

A11: 可以通过以下方式减少影响:

  1. 使用异步日志收集方式
  2. 合理配置日志收集频率
  3. 在非高峰期进行日志收集
  4. 对日志进行采样
  5. 优化日志收集组件的资源使用

Q12: 如何备份重要日志?

A12: 可以通过以下方式备份日志:

  1. 定期将日志复制到备份存储
  2. 使用备份工具(如 rsync、scp)
  3. 配置集中式存储的备份策略
  4. 考虑使用对象存储作为备份目标
  5. 定期验证备份的完整性

Q13: 如何处理敏感信息?

A13: 可以通过以下方式处理敏感信息:

  1. 日志脱敏:在收集或存储阶段对敏感信息进行脱敏
  2. 访问控制:限制敏感日志的访问权限
  3. 加密存储:对敏感日志进行加密存储
  4. 审计日志:记录敏感日志的访问情况
  5. 最小化敏感信息的记录

Q14: 如何实现日志的可追溯性?

A14: 可以通过以下方式实现:

  1. 在日志中包含唯一标识符(如 request ID)
  2. 关联不同组件的日志
  3. 实现日志的上下文传播
  4. 使用分布式追踪系统(如 Jaeger、Zipkin)
  5. 建立完善的日志关联机制

Q15: 如何选择合适的日志保留策略?

A15: 选择日志保留策略时考虑以下因素:

  1. 业务需求:根据业务需要确定保留时间
  2. 法规要求:满足相关法规的保留要求
  3. 存储成本:平衡保留时间和存储成本
  4. 访问频率:根据访问频率调整保留策略
  5. 备份策略:与备份策略相结合

Q16: 如何迁移日志系统?

A16: 可以通过以下步骤迁移日志系统:

  1. 在现有系统并行部署新的日志系统
  2. 验证新系统的功能和性能
  3. 逐步切换日志来源到新系统
  4. 监控新系统的运行情况
  5. 完全切换后,停用旧系统
  6. 迁移历史日志到新系统(可选)