外观
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 = 300TiKV 日志级别
toml
# TiKV 配置文件
[logger]
# 日志级别
level = "info"
# 日志格式
format = "text" # 可选:text, json
# 日志文件路径
file = "/tidb-deploy/tikv-20160/log/tikv.log"
# 日志文件大小限制(MB)
rotation.size = 300
# 日志文件保留数量
rotation.keep = 10PD 日志级别
toml
# PD 配置文件
[log]
# 日志级别
level = "info"
# 日志格式
format = "text" # 可选:text, json
# 日志文件路径
file = "/tidb-deploy/pd-2379/log/pd.log"
# 日志文件大小限制(MB)
max-size = 1024
# 日志文件保留天数
max-days = 72. 动态调整日志级别
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 filebeat3. 基于 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.log4. 基于 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 = 10TiKV 日志轮转
toml
[logger]
# 日志文件大小限制(MB)
rotation.size = 300
# 日志文件保留数量
rotation.keep = 102. 日志清理
手动清理
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 -delete3. 日志分析
使用 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 分析
- 登录 TiDB Dashboard
- 点击 "日志搜索" 菜单项
- 设置搜索条件(时间范围、组件、日志级别、关键词)
- 查看搜索结果并进行分析
使用 ELK Stack 分析
- 登录 Kibana
- 创建索引模式
- 使用 Discover 视图搜索和分析日志
- 创建可视化仪表板
- 设置告警规则
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.logQ2: 如何调整 TiKV 日志级别?
A2: 可以通过以下方式调整 TiKV 日志级别:
- 修改配置文件,然后重启 TiKV:
toml
[logger]
level = "debug"- 动态调整(需要 TiKV 版本 >= v5.0):
bash
# 通过 TiKV API 调整
tiup ctl tikv --host <tikv-address>:20160 modify-log-level debugQ3: 如何处理日志过大的问题?
A3: 可以通过以下方式处理日志过大的问题:
- 调整日志级别,减少日志量
- 调整日志轮转策略,增加轮转频率
- 缩短日志保留时间
- 启用日志压缩
- 考虑使用采样机制
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: 可以通过以下方式监控日志收集系统:
- Filebeat 监控:启用 Filebeat 的监控功能,通过 Prometheus 收集指标
- Fluentd 监控:使用 fluent-plugin-prometheus 插件暴露指标
- Loki 监控:Loki 内置 Prometheus 指标
- 日志收集延迟监控:监控日志从产生到收集的延迟
- 日志丢失监控:监控日志收集过程中的丢失情况
Q6: 如何优化日志搜索性能?
A6: 可以通过以下方式优化日志搜索性能:
- 合理设计索引策略
- 使用合适的分片和副本配置
- 限制搜索时间范围
- 使用精确匹配代替模糊匹配
- 定期优化和合并索引
Q7: 如何实现日志的高可用性?
A7: 可以通过以下方式实现日志的高可用性:
- 日志收集组件部署多个实例
- 集中式存储采用集群部署
- 配置适当的副本数量
- 定期备份日志数据
- 实现跨可用区部署
Q8: 如何处理不同版本组件的日志格式差异?
A8: 可以通过以下方式处理:
- 使用灵活的日志解析规则,支持多种格式
- 在收集端进行日志标准化处理
- 制定统一的日志格式规范
- 升级组件时同步更新日志解析规则
Q9: 如何实现日志的合规性?
A9: 可以通过以下方式实现日志合规性:
- 制定明确的日志保留策略
- 实现日志的不可篡改性
- 记录日志的访问和操作审计
- 定期进行合规性检查
- 确保日志符合相关法规要求
Q10: 如何集成日志系统与告警系统?
A10: 可以通过以下方式集成:
- ELK Stack:使用 Kibana 告警或 Watcher
- Loki:使用 Grafana Alerting
- 自定义集成:编写脚本监控日志,触发告警
- 第三方工具:使用 Alertmanager 或 PagerDuty
Q11: 如何减少日志收集对集群性能的影响?
A11: 可以通过以下方式减少影响:
- 使用异步日志收集方式
- 合理配置日志收集频率
- 在非高峰期进行日志收集
- 对日志进行采样
- 优化日志收集组件的资源使用
Q12: 如何备份重要日志?
A12: 可以通过以下方式备份日志:
- 定期将日志复制到备份存储
- 使用备份工具(如 rsync、scp)
- 配置集中式存储的备份策略
- 考虑使用对象存储作为备份目标
- 定期验证备份的完整性
Q13: 如何处理敏感信息?
A13: 可以通过以下方式处理敏感信息:
- 日志脱敏:在收集或存储阶段对敏感信息进行脱敏
- 访问控制:限制敏感日志的访问权限
- 加密存储:对敏感日志进行加密存储
- 审计日志:记录敏感日志的访问情况
- 最小化敏感信息的记录
Q14: 如何实现日志的可追溯性?
A14: 可以通过以下方式实现:
- 在日志中包含唯一标识符(如 request ID)
- 关联不同组件的日志
- 实现日志的上下文传播
- 使用分布式追踪系统(如 Jaeger、Zipkin)
- 建立完善的日志关联机制
Q15: 如何选择合适的日志保留策略?
A15: 选择日志保留策略时考虑以下因素:
- 业务需求:根据业务需要确定保留时间
- 法规要求:满足相关法规的保留要求
- 存储成本:平衡保留时间和存储成本
- 访问频率:根据访问频率调整保留策略
- 备份策略:与备份策略相结合
Q16: 如何迁移日志系统?
A16: 可以通过以下步骤迁移日志系统:
- 在现有系统并行部署新的日志系统
- 验证新系统的功能和性能
- 逐步切换日志来源到新系统
- 监控新系统的运行情况
- 完全切换后,停用旧系统
- 迁移历史日志到新系统(可选)
