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. 迁移历史日志到新系统(可选)