OpenTelemetry分布式链路追踪服务器集群部署实操指
适用场景与核心概念
当你管理多台服务器(比如微服务集群),想追踪一次请求经过哪些服务、每个环节耗时多少,就需要分布式链路追踪。
OpenTelemetry 是当前主流的可观测性标准,它提供统一的 SDK 和 Collector 组件,负责从应用采集链路数据,再上报给后端(如 Jaeger、Zipkin 或 Prometheus)。
本文重点讲的是 Collector 在集群中的部署与配置,让零基础用户也能快速用起来。
环境准备:三台服务器就够
实操前准备以下资源:
- 三台 Linux 服务器(推荐 CentOS 7+ 或 Ubuntu 20.04+),IP 分别为 192.168.1.10、192.168.1.11、192.168.1.12。
- 后端存储:可以在一台服务器上部署 Jaeger All-in-One 作为演示。
- 开放端口:每台 Collector 需要 4318(HTTP)或 4317(gRPC)用于接收应用数据;后端 Jaeger 需要 16686(Web UI)和 14250(gRPC)。
如果你没有现成集群,可以用同一台服务器的不同端口模拟,不过集群部署的优势是数据分散接收、避免单点故障。
下载并启动 OpenTelemetry Collector
1. 下载 Collector 二进制文件
登录每一台服务器(这里以 192.168.1.10 为例),执行:
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/latest/download/otelcol_linux_amd64.tar.gz
tar -xzf otelcol_linux_amd64.tar.gz
sudo mv otelcol /usr/local/bin/
注意:如果服务器是 ARM 架构,下载 otelcol_linux_arm64.tar.gz。版本号可以查看最新 release,但不要编造具体版本号,直接使用 latest 链接(实际会跳转到当前最新)。
2. 编写 Collector 配置文件
在 /etc/otelcol/config.yaml 中写入(集群中每台服务器的配置基本一致,只有 service 部分的 pipelines 自定义):
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
grpc:
endpoint: 0.0.0.0:4317
exporters:
otlp:
endpoint: "192.168.1.10:4317" # 假设 Jaeger 部署在 192.168.1.10
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp]
关键说明:
receivers部分定义 Collector 如何接收数据(来自应用的 OTLP 协议)。exporters定义数据发送到哪个后端。这里用另一台 Collector 的 gRPC 端口(如果 Jaeger 直接接收,则 endpoint 指向 Jaeger 的 14250 端口)。- 在实际集群中,可以配置多个 exporter 实现负载或高可用,新手先配置一个固定后端。
3. 启动 Collector 服务
创建 systemd 服务文件 /etc/systemd/system/otelcol.service:
[Unit]
Description=OpenTelemetry Collector
After=network.target
[Service]
ExecStart=/usr/local/bin/otelcol --config=/etc/otelcol/config.yaml
Restart=always
User=root
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl start otelcol
sudo systemctl enable otelcol
sudo systemctl status otelcol
看到 active (running) 即成功。
配置数据上报到 Jaeger(后端验证)
在 Collector 所在服务器(也可以是单独一台)部署 Jaeger All-in-One 用于验证:
docker run -d --name jaeger \
-e COLLECTOR_OTLP_ENABLED=true \
-p 16686:16686 \
-p 14250:14250 \
-p 4317:4317 \
-p 4318:4318 \
jaegertracing/all-in-one:latest
然后修改 Collector 的 exporters 配置,
将 endpoint 指向 Jaeger 的 gRPC 地址(如 192.168.1.10:),
4317
重启 Collector。
验证链路是否采集成功
- 确保至少有一个应用(如一个简单的 Python Flask 服务)已经接入 OpenTelemetry SDK,并将 OTLP 数据发送到 Collector 的 4318 或 4317 端口。
- 在浏览器访问
http://192.168.1.10:16686进入 Jaeger UI。 - 选择服务名称,点击 Find Traces,如果能搜到链路记录,说明整个集群链路端到端打通。
也可以直接在 Collector 日志中查看是否有数据接收:
journalctl -u otelcol -f
出现 Everything is ready. 以及 otelcol Collector is up and running. 表示运行正常。
常见问题与避坑
Q1: Collector 启动报错 “failed to load config”
检查 YAML 格式是否合法(空格缩进必须一致),可用 otelcol --validate --config /etc/otelcol/config.yaml 验证。
Q2: 应用端发送数据后 Collector 日志无输出
- 确认应用端 OTLP endpoint 配置的 IP 和端口与 Collector 的 receiver 一致。
- 检查防火墙是否开放 4317/4318 端口:
sudo ufw status或firewall-cmd --list-ports。 - 在 Collector 所在服务器用
tcpdump抓包确认数据是否到达。
Q3: 集群中多台 Collector 如何避免数据重复?
OpenTelemetry Collector 本身不持久化数据,只做转发。
如果每台 Collector 都指向同一个后端,应用端通常只向一个 Collector 发送数据(应用侧配置一个 Collector 的地址)。
若想高可用,可以配置 Collector 之间的转发(如使用 Load Balancing Exporter),但新手建议先单点部署,集群需求明确后再升级。
避坑说明
- 不要在生产环境直接使用 latest 标签的 Collector 二进制,应锁定具体版本。本文使用 latest 仅作演示。
- 如果 Jaeger 与 Collector 在同一台服务器,endpoint 可以用
localhost提高性能。 - 注意时区:链路中的时间戳默认是 UTC,前端界面可调整。
总结
本文演示了在服务器集群中部署 OpenTelemetry Collector 的核心步骤,从下载、配置到对接 Jaeger 验证。
关键点是正确填写 receiver 和 exporter 地址,并确保端口可达。
对于零基础用户,建议先在一台服务器上跑通整个流程,再复制到其他节点。
实际生产环境中,还可以加入 Prometheus、Elasticsearch 等更多后端,让可观测性体系更完善。
如果遇到其他报错,优先检查配置文件语法和网络连通性。
如果你正在处理 OpenTelemetry 分布式链路追踪服务器集群部署,建议按本文步骤完整执行,再根据自己的环境微调 exporter 和后端地址。
遇到异常时,回看避坑和高频问题部分,大部分问题都能定位。