使用 Jaeger 在 Ceph 中进行分布式追踪

Deepika Upadhyay

像 Ceph 这样的分布式系统由于没有单一故障点,因此调试起来可能是一场噩梦。为了解决这个问题,我们一直在致力于添加标准的分布式追踪解决方案 Jaeger 到 Ceph。Jaeger 是一个分布式追踪开源库,也是 CNCF 下的一个项目。Jaeger 将提供更多关于 Ceph 分布式后台进程的可视性,并帮助用户识别异常,从而“使 Ceph 更加透明”。

这篇博客提供了一个学习如何使用追踪来调试 Ceph 的机会 - 非常适合那些希望识别性能瓶颈、延迟优化和分布式事务中异常的人。

我们很高兴地宣布在 Ceph 的 Pacific 版本中对 Jaeger 的初步支持!

它是如何工作的?

Jaeger(追踪后端)以及 Opentracing(API)为分布式系统提供现成的追踪服务,并且由于其简单性而正在成为一种广泛使用的事实标准。

Jaeger 负责收集 spans。这些 spans 是使用智能指针创建的。它们包括时间戳、TraceID 和其他元信息,例如与 span 关联的特定标签/日志,以便在整个分布式系统中唯一标识。然后将它们关联起来生成请求生命周期的可视化(trace)。

images/image1.png

credits: jaeger documentation

让我们尝试一下!

让我们看一下追踪 Ceph 输入/输出事务中涉及的核心函数。如果您已经设置了用于与 Ceph 配合使用的 jaeger 后端,请跳过下一节。

有关如何设置它的信息,请参阅文档:https://docs.ceph.net.cn/en/latest/dev/developer_guide/jaegertracing/

部署 Jaeger 服务

我们将使用 vstart 来开始追踪。

为此,请确保您已

  1. 使用 WITH_JAEGER=ON 编译 Ceph。
  2. 部署了 jaeger 后端服务 - 要使用 vstart 开发集群部署 Jaeger 后端服务,您只需要传递 --jaeger 选项。
$ ../src/vstart.sh --jaeger

通过执行上述步骤,您应该能够设置所有 Jaeger 服务,并在 https://:16686 处访问 JaegerUI。

更多信息:https://jaeger.golang.ac.cn/docs/1.20/getting-started/#all-in-one

images/image10.png

(JaegerUI 在 https://:16686)

如果由于某种原因您无法访问 JaegerUI,请尝试手动运行 Jaeger 服务使用

$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.20

追踪核心服务

现在我们已经启动并运行了 Jaeger 服务,让我们看一下 Ceph 的核心服务追踪。

Ceph 当前可以追踪 OSD I/O 路径中的操作,我们将在演示这里

我们将执行一个简单的写入操作,为此我们使用 rados bench write。您可以使用任何其他可用的写入接口。

[ideepika@vossi03 build]$ bin/ceph osd pool create test; //create a pool
[ideepika@vossi03 build]$ bin/rados -p test bench 5 write --no-cleanup //perform a rados bench write for 5 sec

在刷新 JaegerUI (https://:16686) 时,您应该能够在 services 字段中看到 osd-services,它指定了请求生命周期中追踪的 OSD 进程。

images/image4.gif

images/image8.png

紧接着是 Operations 字段,其中列出了收集到的 spans,单击它将显示包含它的 traces。

images/image5.png

我们看到一个列表,其中包含我们最近的写入操作收集到的 traces,以及一个 x(时间)-y(持续时间)图,其中 traces 作为数据点。

images/image3.gif

images/image2.png

当您单击任何 trace 时,它应该会展开到其中存储的所有 spans 和元数据中。

images/image6.gif

我们可以在创建 span 时以标签和日志的形式存储 Ceph 的元数据,如下所示;logs 字段携带 Ceph 的相关元数据。

images/image9.png

这就是您可视化的内部流程!

将 Traces 导出为 JSON

这些 traces 是可移植的!它们可以转换为 JSON 输出,可以使用 JaegerUI 在其他系统上渲染。

images/image7.png

演示

接下来会发生什么

这个项目仍在进行中,但是通过协调正确的实时 traces 信息,我们将拥有端到端追踪,这将使调试更容易,从而了解 Ceph 的内部结构!

我们期待改进 Ceph 的整体可观察性。

我们有一些任务排队以改进追踪支持,扩展对客户端(RGW、CephFS、RBD)的追踪支持,以及与 OSD traces 的集成,改进始终在线监控高级 traces 的部署策略。

如果这让您感到兴奋,我们欢迎以 PR 的形式进行贡献!

请随时通过 dev@ceph.io 或 OFTC 上的 #ceph-devel IRC 提出问题!