搬瓦工部署 Jaeger 分布式追踪系统教程
Jaeger 是由 Uber 开发并捐赠给 CNCF 的分布式追踪系统,已成为 CNCF 毕业项目。它用于监控和排查微服务架构中的事务链路,帮助开发者发现性能瓶颈、分析服务依赖关系和定位故障根因。Jaeger 提供了直观的 Web UI 来展示追踪数据,是生产环境中最常用的追踪系统之一。本文将介绍如何在搬瓦工 VPS 上部署 Jaeger。部署前请确保已安装 Docker 和 Docker Compose。
一、Jaeger 功能特性
- 追踪可视化:瀑布图展示请求在各服务间的流转过程。
- 服务依赖图:自动生成服务间的调用关系拓扑图。
- 性能分析:识别耗时较长的 Span,定位性能瓶颈。
- 追踪对比:对比两条追踪链路的差异。
- OpenTelemetry 兼容:原生支持 OTLP 协议接入。
- 多种存储后端:支持 Elasticsearch、Cassandra、Kafka 等。
二、系统要求
- 操作系统:Ubuntu 20.04+ 或 Debian 11+。
- 内存:All-in-One 模式至少 512MB,生产环境建议 2GB+。
- 磁盘:至少 5GB 可用空间。
- Docker:已安装 Docker 和 Docker Compose。
选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享 6.77% 折扣,购买入口:bwh81.net。
三、快速部署(All-in-One 模式)
All-in-One 模式将所有组件打包在一个容器中,使用内存存储,适合开发和测试:
mkdir -p /opt/jaeger && cd /opt/jaeger
cat > /opt/jaeger/docker-compose.yml <<'EOF'
version: '3.8'
services:
jaeger:
image: jaegertracing/all-in-one:latest
restart: always
ports:
- "16686:16686" # Web UI
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "14268:14268" # Jaeger HTTP Thrift
- "14250:14250" # Jaeger gRPC
- "6831:6831/udp" # Jaeger Compact Thrift
environment:
COLLECTOR_OTLP_ENABLED: "true"
SPAN_STORAGE_TYPE: badger
BADGER_EPHEMERAL: "false"
BADGER_DIRECTORY_VALUE: /badger/data
BADGER_DIRECTORY_KEY: /badger/key
volumes:
- jaeger_data:/badger
volumes:
jaeger_data:
EOF
四、启动服务
cd /opt/jaeger
docker compose up -d
访问 http://your_server_ip:16686 进入 Jaeger Web UI。
五、生产环境部署(Elasticsearch 后端)
cat > /opt/jaeger/docker-compose-prod.yml <<'EOF'
version: '3.8'
services:
elasticsearch:
image: elasticsearch:8.11.0
restart: always
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- es_data:/usr/share/elasticsearch/data
jaeger-collector:
image: jaegertracing/jaeger-collector:latest
restart: always
ports:
- "4317:4317"
- "4318:4318"
- "14268:14268"
- "14250:14250"
environment:
SPAN_STORAGE_TYPE: elasticsearch
ES_SERVER_URLS: http://elasticsearch:9200
COLLECTOR_OTLP_ENABLED: "true"
depends_on:
- elasticsearch
jaeger-query:
image: jaegertracing/jaeger-query:latest
restart: always
ports:
- "16686:16686"
environment:
SPAN_STORAGE_TYPE: elasticsearch
ES_SERVER_URLS: http://elasticsearch:9200
depends_on:
- elasticsearch
volumes:
es_data:
EOF
六、应用接入示例(Python)
# pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
resource = Resource.create({"service.name": "my-python-app"})
provider = TracerProvider(resource=resource)
exporter = OTLPSpanExporter(endpoint="http://jaeger-host:4317", insecure=True)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("main-operation") as span:
span.set_attribute("user.id", "12345")
with tracer.start_as_current_span("sub-operation"):
pass # 业务逻辑
七、配置反向代理
cat > /etc/nginx/sites-available/jaeger <<'EOF'
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://127.0.0.1:16686;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
ln -s /etc/nginx/sites-available/jaeger /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d your_domain.com
八、常见问题
追踪数据未出现
确认 Collector 端口可访问,检查应用端的 Exporter 配置是否指向正确地址。
Elasticsearch 内存不足
减小 ES_JAVA_OPTS 参数,或配置索引的自动清理策略以控制数据量。
总结
Jaeger 是功能最完整的开源分布式追踪系统,Web UI 直观且功能丰富。如果你的团队已经在使用 Grafana,可以考虑更轻量的 Grafana Tempo;如果需要更简单的方案,参考 Zipkin。选购搬瓦工 VPS 使用优惠码 NODESEEK2026 可享 6.77% 折扣。