Jaeger单机部署指南:快速搭建分布式追踪系统

Jaeger单机安装部署全攻略:从零到一的完整指南

一、Jaeger单机部署的核心价值与适用场景

Jaeger作为CNCF孵化的开源分布式追踪系统,单机部署模式为开发测试环境和小型项目提供了轻量级解决方案。相较于集群部署,单机版具有资源占用低(约2GB内存)、部署简单(单节点运行全量组件)、成本可控(无需额外存储集群)三大优势。典型适用场景包括:本地开发环境追踪微服务调用链、CI/CD流水线中的性能测试、小型团队初期链路监控需求。

二、环境准备与依赖管理

1. 系统要求与资源分配

  • 操作系统:推荐Linux(Ubuntu 20.04+/CentOS 8+)或macOS(11.0+)
  • 硬件配置:最低2核CPU、4GB内存(生产环境建议4核8GB)
  • 存储空间:根据存储后端选择,Elasticsearch方案需预留20GB+磁盘空间

2. 依赖组件安装

  1. # Docker环境准备(以Ubuntu为例)
  2. sudo apt update
  3. sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  4. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. sudo apt install -y docker-ce docker-ce-cli containerd.io
  7. # Docker Compose安装(v2.0+)
  8. sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  9. sudo chmod +x /usr/local/bin/docker-compose

三、核心组件部署方案

1. 全量组件Docker部署(推荐)

  1. # docker-compose.yml
  2. version: '3.8'
  3. services:
  4. jaeger-collector:
  5. image: jaegertracing/jaeger-collector:1.48
  6. command: ["--es.server-urls=http://elasticsearch:9200", "--collector.zipkin.host-port=:9411"]
  7. ports:
  8. - "14250:14250" # 模型.proto/gRPC
  9. - "14268:14268" # 模型.proto/Thrift
  10. - "9411:9411" # Zipkin兼容
  11. depends_on:
  12. - elasticsearch
  13. jaeger-query:
  14. image: jaegertracing/jaeger-query:1.48
  15. command: ["--es.server-urls=http://elasticsearch:9200", "--query.base-path=/jaeger"]
  16. ports:
  17. - "16686:16686" # UI访问端口
  18. depends_on:
  19. - elasticsearch
  20. elasticsearch:
  21. image: docker.elastic.co/elasticsearch/elasticsearch:7.17.3
  22. environment:
  23. - discovery.type=single-node
  24. - ES_JAVA_OPTS=-Xms512m -Xmx512m
  25. ports:
  26. - "9200:9200"
  27. volumes:
  28. - es_data:/usr/share/elasticsearch/data
  29. volumes:
  30. es_data:
  31. driver: local

关键配置说明

  • 使用Elasticsearch 7.x作为存储后端,兼顾性能与稳定性
  • 暴露16686端口提供Web UI访问
  • 配置512MB堆内存防止ES容器OOM

2. 内存存储快速部署(开发环境)

  1. # 单命令启动(仅用于临时测试)
  2. docker run -d --name jaeger \
  3. -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  4. -p 5775:5775/udp \
  5. -p 6831:6831/udp \
  6. -p 6832:6832/udp \
  7. -p 5778:5778 \
  8. -p 16686:16686 \
  9. -p 14268:14268 \
  10. -p 14250:14250 \
  11. jaegertracing/all-in-one:1.48

适用场景:临时调试、功能演示,数据重启后丢失

四、存储后端选型与配置

1. Elasticsearch方案(生产推荐)

  • 版本兼容性:Jaeger 1.48支持ES 6.x-7.x
  • 索引管理
    1. # 创建索引模板(可选)
    2. curl -XPUT "http://localhost:9200/_template/jaeger-span" -H 'Content-Type: application/json' -d'
    3. {
    4. "index_patterns": ["jaeger-span-*"],
    5. "settings": {
    6. "number_of_shards": 1,
    7. "number_of_replicas": 0
    8. }
    9. }'
  • 数据保留策略:通过ILM(Index Lifecycle Management)自动管理索引生命周期

2. Cassandra方案(高写入场景)

  1. # docker-compose片段
  2. cassandra:
  3. image: cassandra:4.0
  4. ports:
  5. - "9042:9042"
  6. environment:
  7. - CASSANDRA_START_RPC=true
  8. volumes:
  9. - cassandra_data:/var/lib/cassandra
  10. # Jaeger配置需添加:
  11. # --cassandra.servers=cassandra
  12. # --cassandra.keyspace=jaeger_v1_test

五、验证与使用指南

1. 服务健康检查

  1. # 检查ES状态
  2. curl -XGET "http://localhost:9200/_cat/health?v"
  3. # 检查Jaeger服务
  4. curl -s http://localhost:14268 | grep "Jaeger Collector"

2. 示例应用接入(Go语言)

  1. package main
  2. import (
  3. "log"
  4. "time"
  5. "go.opentelemetry.io/otel"
  6. "go.opentelemetry.io/otel/exporters/jaeger"
  7. "go.opentelemetry.io/otel/sdk/resource"
  8. sdktrace "go.opentelemetry.io/otel/sdk/trace"
  9. semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
  10. )
  11. func initTracer() (*sdktrace.TracerProvider, error) {
  12. exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces")))
  13. if err != nil {
  14. return nil, err
  15. }
  16. tp := sdktrace.NewTracerProvider(
  17. sdktrace.WithBatcher(exp),
  18. sdktrace.WithResource(resource.NewWithAttributes(
  19. semconv.SchemaURL,
  20. semconv.ServiceNameKey.String("demo-service"),
  21. )),
  22. )
  23. otel.SetTracerProvider(tp)
  24. return tp, nil
  25. }
  26. func main() {
  27. tp, err := initTracer()
  28. if err != nil {
  29. log.Fatal(err)
  30. }
  31. defer func() {
  32. if err := tp.Shutdown(context.Background()); err != nil {
  33. log.Printf("Error shutting down tracer provider: %v", err)
  34. }
  35. }()
  36. tracer := otel.Tracer("demo-tracer")
  37. ctx, span := tracer.Start(context.Background(), "main-operation")
  38. defer span.End()
  39. time.Sleep(100 * time.Millisecond)
  40. log.Println("Operation completed")
  41. }

3. Web UI高级功能

  • 服务依赖图:通过”Dependencies”菜单可视化服务调用关系
  • Trace比较:支持多Trace并行对比分析
  • 高级搜索:支持标签过滤(如error=true)、耗时范围筛选

六、运维与优化建议

1. 性能调优参数

参数 默认值 推荐生产值 说明
--collector.num-workers 10 CPU核心数*2 处理并发请求
--es.max-num-spans 0(无限制) 10000 单次查询返回Span数
--query.timeout 30s 60s 查询超时时间

2. 持久化存储配置

  1. # 持久化卷配置示例
  2. volumes:
  3. jaeger_data:
  4. driver: local
  5. driver_opts:
  6. type: xfs
  7. device: /dev/sdb1
  8. o: bind

3. 安全加固措施

  • 启用HTTPS:通过Nginx反向代理配置SSL证书
  • 访问控制:集成OAuth2/JWT认证中间件
  • 数据加密:启用ES的TLS加密传输

七、常见问题解决方案

1. 数据写入失败排查

  1. 检查ES日志:docker logs elasticsearch
  2. 验证索引状态:curl -XGET "localhost:9200/_cat/indices?v"
  3. 调整批量大小:添加--es.bulk.size=1000参数

2. UI访问404错误

  • 确认查询服务端口映射正确
  • 检查--query.base-path配置是否与Nginx代理路径匹配
  • 清除浏览器缓存后重试

八、升级与迁移指南

1. 版本升级流程

  1. # 1. 备份数据
  2. docker exec elasticsearch curl -XGET "localhost:9200/_snapshot/my_backup/snapshot_1?pretty"
  3. # 2. 停止旧版本
  4. docker-compose down
  5. # 3. 修改镜像版本号
  6. # 在docker-compose.yml中更新image标签
  7. # 4. 启动新版本
  8. docker-compose up -d
  9. # 5. 验证索引兼容性
  10. curl -XGET "localhost:9200/_cat/indices?v" | grep jaeger

2. 存储后端迁移

  1. 使用Jaeger的jaeger-es-index-cleaner工具清理旧索引
  2. 通过Elasticsearch的reindex API迁移数据
  3. 更新Jaeger配置指向新存储

结语

Jaeger单机部署为开发者提供了快速验证分布式追踪能力的有效途径。通过合理配置存储后端、优化资源分配和实施运维监控,单机环境完全能够满足中小规模系统的链路追踪需求。建议定期进行数据备份和性能基准测试,确保系统稳定运行。对于生产环境,建议逐步向集群部署方案过渡,以获得更高的可用性和扩展性。