Zipkin 开源的分布式跟踪系统

发布时间: 更新时间: 总字数:1327 阅读时间:3m 作者: IP上海 分享 网址

zipkin 是一个分布式跟踪系统,它有助于收集服务架构中排除延迟问题所需的定时数据,其功能包括收集和查询这些数据。

介绍

  • Zipkin 是一个开源的分布式跟踪系统,由 Twitter 开发并开源。它的主要作用是帮助开发者收集、存储、查询和可视化微服务架构中不同服务之间的请求链路信息。在复杂的分布式系统中,一个请求可能经过多个服务,每个服务又可能调用其他服务,这使得排查问题变得非常困难。Zipkin 就像是一个侦探,追踪请求的整个生命周期,为你呈现清晰的调用关系图,让你能快速定位性能瓶颈和故障点。
  • zipkin 使用 Java 开发,推荐使用 Jaeger
zipkin architecture

上图转载自,要理解 Zipkin,需要先了解几个核心概念:

  • Zipkin Collector Zipkin 收集器,用于收集/管理链路的追踪信息
  • Storage Zipkin 数据存储,支持 Cassandra、ElasticSearch 和 MySQL 等第三方存储
  • Zipkin Query Service 数据存储并建立索引后,用于查找和检索跟踪信息
  • Web UI 数据查询与前端界面展示
  • Span (跨度):Zipkin 中的基本工作单元,代表了一个逻辑工作单元,比如一次远程调用、一个方法执行或一次数据库查询。一个 Span 包含操作名称、时间戳、持续时间以及一些元数据(如 IP 地址、端口等)。每个 Span 都有一个唯一的 ID。
  • Trace (追踪):由一系列有父子关系的 Span 组成的树状结构,代表了从一个请求进入系统到最终返回的完整调用链路。所有的 Span 共享同一个 Trace ID。
  • Annotation (注解):用于记录时间事件,提供了更精细的上下文信息。例如,cs (Client Send, 客户端发送请求)、cr (Client Receive, 客户端接收响应)、sr (Server Receive, 服务端接收请求) 和 ss (Server Send, 服务端发送响应) 等。

Zipkin 的工作原理

Zipkin 的工作流程通常分为以下几个步骤:

  1. 数据采集 (Data Collection):当一个请求进入分布式系统时,在每个服务中,埋点(Instrumentation)库会为这个请求创建一个新的 Span,并与 Trace ID 关联起来。
  2. 数据传输 (Data Transport):Span 数据被异步发送到 Zipkin Collector(收集器)。通常使用 HTTP 或 Kafka 等方式。
  3. 数据存储 (Data Storage):Collector 接收到 Span 数据后,将其存储到后端存储中,如 Elasticsearch、Cassandra 或 MySQL。
  4. 数据查询 (Data Query):Zipkin 的 API 服务器提供查询接口,允许用户根据 Trace ID、服务名称或时间范围等条件查询特定的 Trace。
  5. 数据可视化 (Data Visualization):Zipkin UI 提供了一个直观的 Web 界面,将查询到的 Trace 数据以图形化的方式展示出来,比如甘特图,清晰地显示出每个服务调用的时间线和依赖关系。

Zipkin 的作用和优势

  • 性能分析:通过查看调用链中每个 Span 的持续时间,你可以轻松找出哪个服务或操作是性能瓶颈。
  • 故障排查:当某个请求失败时,通过 Trace ID 追溯整个调用链路,可以快速定位是哪个服务出了问题。
  • 服务依赖分析:Zipkin 可以生成服务依赖图,让你清楚地看到服务之间的调用关系,这对于理解复杂的微服务架构非常有帮助。
  • 架构透明性:为开发者提供了一个黑盒的可视化窗口,让原本不可见的内部调用变得透明化。

安装

jar

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

docker

docker run -d -p 9411:9411 openzipkin/zipkin

kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zipkin
  namespace: istio-system
  labels:
    app: zipkin
spec:
  selector:
    matchLabels:
      app: zipkin
  template:
    metadata:
      labels:
        app: zipkin
        sidecar.istio.io/inject: "false"
    spec:
      containers:
        - name: zipkin
          image: openzipkin/zipkin-slim:3.4.0
          env:
            - name: STORAGE_METHOD
              value: "mem"
          readinessProbe:
            httpGet:
              path: /health
              port: 9411
            initialDelaySeconds: 5
            periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: tracing
  namespace: istio-system
  labels:
    app: zipkin
spec:
  type: ClusterIP
  ports:
    - name: http-query
      port: 80
      protocol: TCP
      targetPort: 9411
  selector:
    app: zipkin
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: zipkin
  name: zipkin
  namespace: istio-system
spec:
  ports:
    - port: 9411
      targetPort: 9411
      name: http-query
  selector:
    app: zipkin
kubectl apply -f samples/addons/extras/zipkin.yaml

参考

  1. https://zipkin.io/
  2. https://istio.io/latest/docs/ops/integrations/zipkin/#installation
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics