第十二章:最佳实践
掌握 Loki 的性能优化、资源配置和运维最佳实践。
最后更新: 2024-01-26
页面目录
Loki 最佳实践
本章节汇总 Loki 的配置和运维最佳实践。
标签设计
好的标签设计
# ✅ 推荐:低基数标签
{job="api", namespace="production", service="user-service", instance="api-1"}
# ✅ 推荐:有限取值
{environment="prod", tier="frontend", region="us-east"}
避免的标签设计
# ❌ 避免:高基数标签
{user_id="12345"} # 用户 ID
{request_id="abc-123"} # 请求 ID
{timestamp="1705312800"} # 时间戳
{ip="192.168.1.1"} # IP 地址
# ❌ 避免:过多标签
{env="prod", app="myapp", ver="1.0", ns="default", pod="xyz", ip="...", host="..."}
标签指南
| 标签类型 | 示例 | 说明 |
|---|---|---|
| 服务标识 | job="api" |
标识服务 |
| 环境 | env="prod" |
环境区分 |
| 集群 | cluster="us-east-1" |
集群标识 |
| 命名空间 | namespace="default" |
K8s 命名空间 |
| 实例 | instance="web-1" |
实例标识 |
存储优化
对象存储选择
| 存储 | 适用场景 | 成本 |
|---|---|---|
| S3 | AWS 环境 | 低 |
| GCS | GCP 环境 | 低 |
| Azure Blob | Azure 环境 | 中 |
| MinIO | 私有环境 | 低 |
| 磁盘 | 开发测试 | - |
存储配置
# 生产环境存储配置
storage_config:
aws:
bucketnames: loki-chunks
region: us-east-1
s3forcepathstyle: false
http_config:
idle_conn_timeout: 90s
response_header_timeout: 0s
性能优化
1. 调整 Chunk 大小
ingester:
chunk_target_size: 1572864 # 1.5MB
chunk_encoding: gzip # 或 snappy
max_chunk_age: 1h
2. 启用写入缓冲
ingester:
wal:
enabled: true
dir: /var/loki/wal
flush_on_shutdown: true
3. 查询并行化
limits_config:
max_query_parallelism: 32
querier:
max_outstanding_per_tenant: 4096
4. 缓存配置
# 启用查询缓存
querier:
query_ingesters_within: 3h
采集优化
Promtail 优化
# Promtail 配置优化
client:
batchwait: 1s
batchsize: 102400
scrape_configs:
- job_name: system
pipeline_stages:
- docker: {} # 使用 docker 解析
relabel_configs:
- source_labels: ['__meta_kubernetes_pod_label_app']
target_label: service
日志格式
# 统一日志格式
# {"timestamp":"2024-01-15T10:00:00Z","level":"info","service":"api","message":"Request processed"}
pipeline_stages:
- json:
expressions:
timestamp: timestamp
level: level
service: service
message: message
- labels:
level:
service:
资源规划
组件资源需求
| 组件 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| Ingester | 1-2 核 | 2-4 GB | 10-50 GB |
| Querier | 1-2 核 | 2-4 GB | - |
| Compactor | 0.5 核 | 1-2 GB | 10-50 GB |
| Distributor | 0.5 核 | 512 MB | - |
容量计算
# 存储容量估算
每日日志量 = 采集速率 × 86400 秒 × 压缩比
示例:
- 10000 logs/s
- 平均日志大小:500 bytes
- 压缩比:10:1
- 保留天数:30
每日日志量 = 10000 × 500 × 86400 / 10 = 43.2 GB
30 天总容量 = 43.2 GB × 30 = 1296 GB ≈ 1.3 TB
监控指标
关键指标
| 指标 | 说明 | 阈值 |
|---|---|---|
loki_ingester_streams_created_total |
创建的流数 | - |
loki_ingester_chunk_entries |
Chunk 条目数 | - |
loki_distributor_bytes_received_total |
接收字节数 | - |
loki_query_errors_total |
查询错误数 | > 0 |
loki_query_duration_seconds |
查询延迟 | P99 < 5s |
告警规则
# 监控告警
- alert: LokiHighQueryLatency
expr: histogram_quantile(0.99, sum(rate(loki_query_duration_seconds_bucket[5m])) by (le)) > 5
for: 10m
labels:
severity: warning
annotations:
summary: "Loki query latency is high"
- alert: LokiHighMemoryUsage
expr: (container_memory_usage_bytes{pod=~"loki-.*"}) / (container_spec_memory_limit_bytes{pod=~"loki-.*"}) > 0.9
for: 5m
labels:
severity: warning
运维清单
部署前检查
- 存储配置正确
- 网络连通性正常
- 资源配额充足
- TLS 证书有效
日常检查
- 服务状态正常
- 磁盘空间充足
- 日志流正常
- 查询延迟正常
- 告警正常
定期维护
- 日志清理
- 证书更新
- 配置审计
- 性能调优
- 备份验证
下一步
接下来让我们学习故障排查。
👉 故障排查