SRE生产实践:日志聚合与分析

文档日期:2026-03-25
适用场景:中大型分布式系统运维
难度等级:中级 ⭐⭐⭐


一、概述与背景

1.1 问题背景

在微服务架构下,一个用户请求可能跨越数十个服务节点。当系统出现故障时,工程师需要在海量日志中快速定位问题根源。传统的单机日志查看方式已无法满足需求:

  • 日志分散:每个服务实例都有独立日志文件
  • 数据量巨大:日均数TB级别的日志数据
  • 查询困难:无法快速关联多个服务的日志链路
  • 成本高昂:存储和计算成本不断上升
  • 可观测性缺失:无法实时了解系统运行状态

1.2 日志聚合的价值

  • 快速故障定位:秒级查询,毫秒级响应
  • 链路追踪:通过TraceID关联完整请求链路
  • 趋势分析:发现系统潜在问题
  • 合规审计:满足安全审计和数据合规要求
  • 成本优化:集中存储和管理,降低总体成本

二、核心原理

2.1 日志聚合架构

┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│  Service A  │  │  Service B  │  │  Service C  │
│   (Logs)    │  │   (Logs)    │  │   (Logs)    │
└──────┬──────┘  └──────┬──────┘  └──────┬──────┘
       │                │                │
       └────────────────┼────────────────┘
                        │
                   ┌────▼─────┐
                   │ Collector │ (Filebeat/Fluentd)
                   │ (Agent)   │
                   └────┬─────┘
                        │
        ┌───────────────┼───────────────┐
        │               │               │
   ┌────▼────┐   ┌─────▼──────┐  ┌────▼────┐
   │ Kafka   │   │ Message Q  │  │ Direct  │
   │ (Buffer)│   │ (Optional) │  │ (Fast)  │
   └────┬────┘   └─────┬──────┘  └────┬────┘
        │               │              │
        └───────────────┼──────────────┘
                        │
                   ┌────▼──────────┐
                   │ Elasticsearch │
                   │ (Storage)     │
                   └────┬──────────┘
                        │
        ┌───────────────┼───────────────┐
        │               │               │
   ┌────▼────┐   ┌─────▼──────┐  ┌────▼────┐
   │ Kibana  │   │ Grafana    │  │ Custom  │
   │ (UI)    │   │ (Dashboard)│  │ Apps    │
   └─────────┘   └────────────┘  └─────────┘

2.2 核心组件

2.2.1 日志收集层(Collection)

Filebeat(推荐用于容器环境)

  • 轻量级Agent,内存占用<50MB
  • 支持多行日志、JSON解析
  • 内置背压处理,不丢日志

Fluentd(推荐用于复杂场景)

  • 灵活的插件生态
  • 支持复杂的日志处理规则
  • 可作为中央日志处理器

Logstash(推荐用于复杂转换)

  • 强大的日志处理能力
  • 支持Grok正则表达式
  • 但资源消耗较大

2.2.2 消息队列层(Optional)

使用Kafka/RabbitMQ的优势:

  • 解耦:收集端和存储端独立扩展
  • 缓冲:应对存储端突发流量
  • 重放:支持日志重新处理
  • 多消费:支持多个下游系统

2.2.3 存储层(Storage)

Elasticsearch(业界标准)

  • 倒排索引,查询性能优异
  • 支持复杂的聚合分析
  • 自动分片和副本机制
  • 生态完善(Kibana、Beats等)

其他选择

  • Loki(Prometheus生态,成本低)
  • ClickHouse(OLAP分析,成本低)
  • S3+Athena(云原生,成本最低)

2.2.4 查询展示层(Visualization)

  • Kibana:Elasticsearch官方UI,功能最全
  • Grafana:通用可视化平台,支持多数据源
  • 自建系统:满足特定业务需求

2.3 关键技术点

2.3.1 日志结构化

{
  "timestamp": "2026-03-25T09:20:15.123Z",
  "level": "ERROR",
  "service": "payment-service",
  "instance": "payment-service-pod-123",
  "trace_id": "550e8400-e29b-41d4-a716-446655440000",
  "span_id": "f7461d1186919d51",
  "user_id": "user_12345",
  "request_id": "req_98765",
  "message": "Payment processing failed",
  "error": "timeout",
  "duration_ms": 5000,
  "tags": {
    "env": "production",
    "region": "cn-east-1",
    "version": "v2.1.0"
  }
}

结构化的好处

  • 支持精确字段查询
  • 便于聚合统计
  • 易于告警规则配置
  • 提高查询性能

2.3.2 采样策略

在高流量场景下,采样可显著降低成本:

采样率 = min(1, 10 / QPS)

例如:
- QPS = 100,000 → 采样率 = 0.0001(1/10000)
- QPS = 1,000 → 采样率 = 0.01(1/100)
- QPS = 100 → 采样率 = 0.1(1/10)

采样原则

  • 错误日志100%采样
  • 慢查询日志100%采样
  • 正常日志按比例采样
  • 关键业务链路100%采样

2.3.3 日志保留策略

日志级别    保留时间    存储位置
ERROR      30天        热存储(ES)
WARN       14天        热存储(ES)
INFO       7天         热存储(ES)
DEBUG      3天         热存储(ES)
TRACE      1天         本地/不存储

冷存储:
- 超过30天的日志归档到S3/OSS
- 保留1年用于审计

三、主要功能与应用场景

3.1 故障诊断

场景:用户反馈支付失败

1. 通过request_id快速定位请求
2. 查看trace_id关联的完整链路
3. 发现payment-service超时
4. 查看该服务的错误日志
5. 发现数据库连接池耗尽
6. 定位根本原因:某个查询性能下降

3.2 性能分析

查询:service:payment-service AND duration_ms:[1000 TO *]
结果:找出所有耗时>1秒的请求
分析:
- 哪些接口最慢?
- 慢查询的特征是什么?
- 是否与特定用户/数据量相关?

3.3 安全审计

查询:action:delete AND user_id:* AND timestamp:[now-7d TO now]
结果:过去7天所有删除操作
用途:
- 审计谁删除了什么
- 何时删除
- 是否有异常操作

3.4 容量规划

聚合查询:
- 日均日志量趋势
- 存储增长率
- 查询QPS分布
- 峰值流量预测

决策:
- 何时需要扩容
- 是否需要调整采样率
- 是否需要优化存储

3.5 告警规则

规则1:错误率告警
条件:error_count / total_count > 1% in 5min
动作:发送告警到On-Call

规则2:慢查询告警
条件:duration_ms > 5000 AND count > 100 in 5min
动作:发送告警到开发团队

规则3:异常模式检测
条件:同一user_id在1分钟内出现>10次错误
动作:可能是攻击,发送安全告警

四、部署与安装步骤

4.1 前置要求

# 检查系统环境
- Linux内核 >= 4.15
- Docker >= 20.10
- Docker Compose >= 1.29
- 磁盘空间 >= 100GB(日志存储)
- 内存 >= 16GB(ES集群)

4.2 快速部署(Docker Compose)

步骤1:创建目录结构

mkdir -p /opt/log-stack/{elasticsearch,filebeat,kibana}
cd /opt/log-stack

步骤2:创建docker-compose.yml

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data
    networks:
      - log-stack
    healthcheck:
      test: curl -s http://localhost:9200 >/dev/null || exit 1
      interval: 10s
      timeout: 5s
      retries: 5

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - log-stack

  filebeat:
    image: docker.elastic.co/beats/filebeat:8.11.0
    container_name: filebeat
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: filebeat -e -strict.perms=false
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - log-stack

volumes:
  es_data:

networks:
  log-stack:
    driver: bridge

步骤3:创建filebeat.yml配置

filebeat.inputs:
- type: container
  enabled: true
  paths:
    - '/var/lib/docker/containers/*/*.log'
  processors:
    - add_docker_metadata:
        host: "unix:///var/run/docker.sock"
    - add_kubernetes_metadata:
        in_cluster: true

processors:
  - add_host_metadata:
  - add_process_metadata:

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

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644

步骤4:启动服务

# 启动所有服务
docker-compose up -d

# 检查服务状态
docker-compose ps

# 查看日志
docker-compose logs -f elasticsearch

# 验证Elasticsearch
curl http://localhost:9200/_cluster/health

# 访问Kibana
# 浏览器打开:http://localhost:5601

4.3 Kubernetes部署

步骤1:创建Namespace

kubectl create namespace logging

步骤2:部署Elasticsearch

# elasticsearch-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: transport
        env:
        - name: cluster.name
          value: "k8s-logs"
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: discovery.seed_hosts
          value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"
        - name: cluster.initial_master_nodes
          value: "elasticsearch-0,elasticsearch-1,elasticsearch-2"
        - name: ES_JAVA_OPTS
          value: "-Xms2g -Xmx2g"
        - name: xpack.security.enabled
          value: "false"
        resources:
          requests:
            memory: "2Gi"
            cpu: "500m"
          limits:
            memory: "4Gi"
            cpu: "2000m"
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi

---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  namespace: logging
spec:
  clusterIP: None
  selector:
    app: elasticsearch
  ports:
  - port: 9200
    name: http
  - port: 9300
    name: transport

步骤3:部署Filebeat DaemonSet

# filebeat-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: logging
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:8.11.0
        args: ["-c", "/etc/filebeat.yml", "-e"]
        env:
        - name: ELASTICSEARCH_HOST
          value: elasticsearch.logging.svc.cluster.local
        - name: ELASTICSEARCH_PORT
          value: "9200"
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        securityContext:
          runAsUser: 0
        resources:
          requests:
            memory: "100Mi"
            cpu: "100m"
          limits:
            memory: "200Mi"
            cpu: "500m"
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: dockersock
          mountPath: /var/run/docker.sock
      volumes:
      - name: config
        configMap:
          name: filebeat-config
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: dockersock
        hostPath:
          path: /var/run/docker.sock

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
  namespace: logging

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
rules:
- apiGroups: [""]
  resources:
  - namespaces
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: filebeat
subjects:
- kind: ServiceAccount
  name: filebeat
  namespace: logging

步骤4:部署Kibana

# kibana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: logging
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:8.11.0
        ports:
        - containerPort: 5601
        env:
        - name: ELASTICSEARCH_HOSTS
          value: http://elasticsearch.logging.svc.cluster.local:9200
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "1000m"

---
apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: logging
spec:
  type: LoadBalancer
  selector:
    app: kibana
  ports:
  - port: 5601
    targetPort: 5601

步骤5:部署

# 创建ConfigMap
kubectl create configmap filebeat-config \
  --from-file=filebeat.yml \
  -n logging

# 部署所有组件
kubectl apply -f elasticsearch-statefulset.yaml
kubectl apply -f filebeat-daemonset.yaml
kubectl apply -f kibana-deployment.yaml

# 检查部署状态
kubectl get pods -n logging
kubectl get svc -n logging

# 查看日志
kubectl logs -n logging -l app=elasticsearch -f

4.4 生产级配置建议

4.4.1 Elasticsearch集群配置

# elasticsearch.yml
cluster.name: production-logs
node.name: ${HOSTNAME}

# 内存配置(重要!)
# 设置为物理内存的50%,但不超过31GB
-Xms16g
-Xmx16g

# 磁盘配置
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch

# 网络配置
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300

# 集群配置
discovery.seed_hosts: ["es-node1", "es-node2", "es-node3"]
cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"]

# 性能优化
indices.memory.index_buffer_size: 40%
thread_pool.write.queue_size: 1000
thread_pool.search.queue_size: 1000

# 索引配置
index.number_of_shards: 5
index.number_of_replicas: 1
index.refresh_interval: 30s

4.4.2 索引生命周期管理(ILM)

# 自动删除30天前的日志
PUT _ilm/policy/logs-policy
{
  "policy": "logs-policy",
  "phases": {
    "hot": {
      "min_age": "0d",
      "actions": {
        "rollover": {
          "max_primary_shard_size": "50GB",
          "max_age": "1d"
        }
      }
    },
    "warm": {
      "min_age": "7d",
      "actions": {
        "set_priority": {
          "priority": 50
        }
      }
    },
    "cold": {
      "min_age": "14d",
      "actions": {
        "set_priority": {
          "priority": 0
        }
      }
    },
    "delete": {
      "min_age": "30d",
      "actions": {
        "delete": {}
      }
    }
  }
}

五、常见问题与排查

5.1 安装部署问题

问题1:Elasticsearch启动失败 - "max virtual memory areas vm.max_map_count too low"

原因:Linux系统限制

解决方案

# 临时修改
sysctl -w vm.max_map_count=262144

# 永久修改
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

问题2:Filebeat无法连接Elasticsearch

排查步骤

# 1. 检查网络连接
telnet elasticsearch 9200

# 2. 查看Filebeat日志
docker logs filebeat | grep -i error

# 3. 检查Elasticsearch状态
curl http://elasticsearch:9200/_cluster/health

# 4. 验证配置文件
docker exec filebeat filebeat test config

问题3:磁盘空间不足导致Elasticsearch只读

症状

"reason":"[FORBIDDEN/12/index read-only / allow delete (api)]"

解决方案

# 1. 清理旧索引
curl -X DELETE "localhost:9200/logs-2026-03-01"

# 2. 解除只读状态
curl -X PUT "localhost:9200/_all/_settings" -H 'Content-Type: application/json' -d'
{
  "index.blocks.read_only_allow_delete": null
}
'

# 3. 扩容磁盘或调整保留策略

5.2 性能问题

问题4:查询响应缓慢

排查步骤

# 1. 检查集群状态
curl http://localhost:9200/_cluster/stats

# 2. 检查索引大小
curl http://localhost:9200/_cat/indices?v

# 3. 查看慢查询日志
curl http://localhost:9200/_search/slow

# 4. 优化查询
# 使用filter而不是query(filter会被缓存)
# 避免通配符查询
# 使用时间范围限制

优化建议

// 不好的查询
{
  "query": {
    "match": {
      "message": "*error*"
    }
  }
}

// 好的查询
{
  "query": {
    "bool": {
      "filter": [
        { "range": { "timestamp": { "gte": "now-1h" } } },
        { "term": { "level": "ERROR" } },
        { "match": { "message": "error" } }
      ]
    }
  }
}

问题5:内存溢出(OOM)

原因

  • Elasticsearch JVM堆内存设置过小
  • 查询返回结果过多
  • 聚合操作消耗内存过大

解决方案

# 1. 增加JVM堆内存
# 修改 -Xms 和 -Xmx,设置为物理内存的50%

# 2. 限制查询结果
# 使用 size 参数限制返回数量
# 使用 scroll API 处理大结果集

# 3. 优化聚合
# 避免深层嵌套聚合
# 使用 composite aggregation 处理大量聚合

5.3 数据问题

问题6:日志丢失

可能原因

  1. Filebeat缓冲区满
  2. Elasticsearch写入失败
  3. 网络中断

预防措施

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/*.log
  # 启用本地队列
  queue.mem:
    events: 4096
    flush.min_events: 512
    flush.timeout: 1s

# 启用持久化队列(防止丢失)
queue.disk:
  path: "${path.data}/queue"
  max_size: 10GB
  segment_size: 100MB
  write_timeout: 30s

output.elasticsearch:
  hosts: ["localhost:9200"]
  # 重试配置
  max_retries: 3
  backoff.init: 1s
  backoff.max: 60s

问题7:日志重复

原因

  • Filebeat重启导致重新读取
  • 多个Filebeat实例读取同一文件

解决方案

# 启用registry文件持久化
filebeat.registry.path: /var/lib/filebeat/registry

# 使用唯一的source标识
processors:
  - add_fields:
      target: ''
      fields:
        source_host: ${HOSTNAME}
        source_file: %{[log.file.path]}

5.4 告警规则问题

问题8:告警频繁误触发

原因

  • 阈值设置过低
  • 没有考虑业务波动

解决方案

// 使用动态阈值
{
  "trigger": {
    "schedule": {
      "interval": "5m"
    }
  },
  "input": {
    "search": {
      "request": {
        "indices": ["logs-*"],
        "body": {
          "query": {
            "range": {
              "timestamp": {
                "gte": "now-5m"
              }
            }
          },
          "aggs": {
            "error_rate": {
              "avg": {
                "script": "doc['is_error'].value ? 1 : 0"
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.aggregations.error_rate.value": {
        "gt": 0.01  // 错误率>1%
      }
    }
  }
}

六、生产实践建议

6.1 架构设计

6.1.1 高可用部署

┌─────────────────────────────────────────┐
│         Kubernetes Cluster              │
├─────────────────────────────────────────┤
│                                         │
│  ┌──────────────┐  ┌──────────────┐   │
│  │ Filebeat Pod │  │ Filebeat Pod │   │
│  │  (DaemonSet) │  │  (DaemonSet) │   │
│  └──────┬───────┘  └──────┬───────┘   │
│         │                 │            │
│         └────────┬────────┘            │
│                  │                     │
│         ┌────────▼────────┐            │
│         │  Kafka Cluster  │            │
│         │  (3 replicas)   │            │
│         └────────┬────────┘            │
│                  │                     │
│    ┌─────────────┼─────────────┐      │
│    │             │             │      │
│ ┌──▼──┐  ┌──────▼──┐  ┌──────▼──┐   │
│ │ ES  │  │   ES    │  │   ES    │   │
│ │Node1│  │  Node2  │  │  Node3  │   │
│ └──┬──┘  └──────┬──┘  └──────┬──┘   │
│    │            │            │      │
│    └────────────┼────────────┘      │
│                 │                    │
│         ┌───────▼────────┐           │
│         │  Kibana (HA)   │           │
│         └────────────────┘           │
│                                      │
└──────────────────────────────────────┘

6.1.2 容量规划

假设:
- 日均请求量:1亿
- 平均日志大小:1KB
- 日均日志量:100GB
- 副本数:1(总存储:200GB)
- 保留时间:30天

所需存储:200GB × 30 = 6TB

Elasticsearch节点配置:
- 节点数:3(高可用)
- 每个节点磁盘:2TB
- 总磁盘:6TB
- 内存:每个节点16GB(总48GB)
- CPU:每个节点8核(总24核)

6.2 运维最佳实践

6.2.1 监控指标

关键指标:
1. 集群健康状态
   - cluster.status (green/yellow/red)
   - active_shards / total_shards

2. 索引性能
   - indexing.index_total (索引速率)
   - search.query_total (查询速率)
   - search.query_time_in_millis (查询延迟)

3. 资源使用
   - jvm.mem.heap_used_percent
   - fs.total_in_bytes / fs.available_in_bytes
   - cpu.percent

4. 日志收集
   - filebeat.harvester.open_files
   - filebeat.harvester.running
   - filebeat.input.log.files.truncated

6.2.2 备份策略

# 创建快照仓库
curl -X PUT "localhost:9200/_snapshot/backup" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/mnt/backup/elasticsearch"
  }
}
'

# 创建快照
curl -X PUT "localhost:9200/_snapshot/backup/snapshot-2026-03-25" -H 'Content-Type: application/json' -d'
{
  "indices": "logs-*",
  "ignore_unavailable": true,
  "include_global_state": false
}
'

# 恢复快照
curl -X POST "localhost:9200/_snapshot/backup/snapshot-2026-03-25/_restore"

6.2.3 定期维护

# 每周任务
1. 检查集群健康状态
   curl http://localhost:9200/_cluster/health

2. 检查磁盘使用率
   curl http://localhost:9200/_cat/nodes?v

3. 验证备份完整性
   curl http://localhost:9200/_snapshot/backup/_all

# 每月任务
1. 优化索引
   curl -X POST "localhost:9200/logs-*/_forcemerge?max_num_segments=1"

2. 清理过期索引
   curl -X DELETE "localhost:9200/logs-2026-02-*"

3. 更新ILM策略
   # 根据实际情况调整保留时间

6.3 成本优化

6.3.1 存储优化

优化方向:
1. 调整采样率
   - 错误日志:100%
   - 关键业务:100%
   - 普通日志:10-50%
   - 调试日志:1-5%

2. 压缩
   - 启用Elasticsearch压缩
   - 使用更高效的日志格式

3. 分层存储
   - 热数据:SSD(7天)
   - 温数据:HDD(14天)
   - 冷数据:对象存储(30天+)

预期成本降低:50-70%

6.3.2 查询优化

优化技巧:
1. 使用filter而不是query
   - filter会被缓存
   - 性能提升10倍

2. 避免通配符查询
   - 使用term查询
   - 使用match查询

3. 限制返回字段
   - 只返回需要的字段
   - 减少网络传输

4. 使用聚合而不是脚本
   - 聚合性能更好
   - 支持缓存

七、参考资料

7.1 官方文档

7.2 相关技术

  • 分布式追踪:Jaeger、Zipkin
  • 指标监控:Prometheus、Grafana
  • 告警管理:AlertManager、PagerDuty
  • 日志处理:Fluentd、Logstash

7.3 推荐阅读

7.4 开源项目


八、总结

日志聚合与分析是现代SRE体系的基础设施。通过建立完善的日志系统,我们可以:

快速定位故障:从数TB日志中秒级找到问题
深入理解系统:通过数据驱动的决策优化系统
提升可靠性:及时发现和处理潜在问题
降低成本:通过采样和分层存储优化成本
满足合规:完整的审计日志和追踪能力

关键成功因素

  1. 从一开始就设计结构化日志
  2. 建立清晰的采样和保留策略
  3. 投入足够的资源进行运维
  4. 持续优化和改进

文档版本:v1.0
最后更新:2026-03-25
维护者:SRE Team

results matching ""

    No results matching ""