分布式请求追踪系统分析

1、什么是分布式追踪

链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

2、痛点

  • 某个核心服务挂了,导致上游出现大量报警,如何快速确定哪个服务出了问题?
  • 某个核心服务挂了,导致大量报错,如何快速确定哪里出了问题?
  • 应用程序有性能瓶颈,怎样确定瓶颈在哪里?
  • App端请求响应延迟高,怎样确定是有哪些服务导致的?
  • 线上发布了服务,怎么知道它一切正常,比如发布8台服务器,如何直观了解是否有请求进来,访问一切正常?

微服务调用

在这里插入图片描述

3、解决痛点

需要一些可以帮助开发人员理解系统行为,快速定位问题的工具,分布式追踪系统应运而生

4、分布式追踪系统产品

分布式追踪系统是2014年Google在《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》中提出,目前市面上很多开源的APM都参考Google Dapper

APM工具 可视化 埋点方式 开发者 支持语言 特点 社区活跃度(相对)
CAT 侵入式 美团点评 JAVA、php、.NET 基于Java语言开发,提供多种语言的客户端,监控数据全量统计,对代码侵入性强
hydra 非侵入式 京东 JAVA、.NET 多协议支持 。Hydra支持多种协议,用户可以根据实际情况选择适用的协议进行密码破解。 高效快速 。Hydra使用并发技术,可以同时进行多个密码破解尝试,提高破解速度。 灵活性 。Hydra提供了丰富的选项和参数,用户可以根据需要进行定制化配置。 广泛应用 。Hydra可以应用于各种场景,包括渗透测试、密码破解等。
Zipkin 侵入式 Twitter Java、Go 由Java语言开发,侵入性相对于CAT较低,需要对web.xml等配置文件进行修改
Pinpoint 非侵入式 韩国团队 Java、php、nodeJs 采用字节码增强技术,对代码无侵入,支持Java和PHP语言,底层采用HBase存储数据,不支持trace查询
SkyWalking 非侵入式 国人开源 Java 支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,采用字节码注入方式实现代码无侵入,探针采集数据粒度粗但性能表现优秀,对云原生支持较好,并且对jvm支持监控、告警,性能损失低

详细产品对比分析

5、skywalking服务端部署

服务端部署主要分为oap-server和ui,k8s部署参考如下:

5.1、oap部署

镜像可直接从Apache镜像仓库拉去

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalking-oap-svr
  namespace: apm
  labels:
    app: skywalking-oap-svr
  annotations:
    deployment.kubernetes.io/revision: '8'
    kubesphere.io/creator: admin
spec:
  replicas: 3
  selector:
    matchLabels:
      app: skywalking-oap-svr
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalking-oap-svr
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{"skywalking-oap-svr":"aics-aic-image-secret"}'
        kubesphere.io/restartedAt: '2023-08-10T06:27:45.920Z'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
      containers:
        - name: skywalking-oap-svr
          image: >-
            sky.test.cn/snapshot-docker-local/skywalking-oap-server:9.3.0
          ports:
            - name: http-0
              containerPort: 11800
              protocol: TCP
            - name: http-1
              containerPort: 12800
              protocol: TCP
            - name: http-2
              containerPort: 9421
              protocol: TCP
          env:
            - name: SW_STORAGE
              value: elasticsearch
            - name: SW_STORAGE_ES_CLUSTER_NODES
              value: '10.143.164.5:9200'
            - name: SW_HEALTH_CHECKER
              value: default
            - name: SW_ES_USER
              value: elastic
            - name: SW_ES_PASSWORD
              value: KvavH!GaP%xn
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: aics-aic-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

5.2、ui部署

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalking-ui
  namespace: apm
  labels:
    app: skywalking-ui
  annotations:
    deployment.kubernetes.io/revision: '8'
    kubesphere.io/creator: admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalking-ui
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{"skywalking-ui":"aics-aic-image-secret"}'
        kubesphere.io/restartedAt: '2023-08-10T06:43:46.709Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: volume-wp616w
          secret:
            secretName: aics-aic-image-secret
            defaultMode: 420
      containers:
        - name: skywalking-ui
          image: >-
            sky.test.cn/snapshot-docker-local/skywalking-ui:9.3.0
          ports:
            - name: http-0
              containerPort: 8080
              protocol: TCP
          env:
            - name: SW_OAP_ADDRESS
              value: 'http://127.0.0.1:31069'
            - name: SW_ZIPKIN_ADDRESS
              value: 'http://127.0.0.1:30983'
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: aics-aic-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

服务接入skywalking

获取skywalking agent,获取agent两种方式,可直接从Apache镜像仓库直接拉去,或者自己打镜像,后者可参考:agent镜像制作

服务接入agent采用sidecar的方式将agent镜像作为初始化容器,参考如下:

**注意:**服务镜像需要将java agent参数已变量的形式提供:例如:

环境变量:

在这里插入图片描述

启动参数:

在这里插入图片描述

服务部署:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: telecom-ai-base
  namespace: ct-aics-dialog
  labels:
    name: telecom-ai-base
  annotations:
    deployment.kubernetes.io/revision: '11'
spec:
  replicas: 1
  selector:
    matchLabels:
      name: telecom-ai-base
  template:
    metadata:
      creationTimestamp: null
      labels:
        name: telecom-ai-base
      annotations:
        kubesphere.io/restartedAt: '2023-08-10T07:49:05.901Z'
    spec:
      volumes: #挂载共享存储
        - name: side-car-share-volume
          emptyDir: {}
      initContainers: #sidecar方式:初始化agent容器
        - name: skywalking-java-agent
          image: >-
            skywalking.agent.cn/snapshot-docker-local/skywalking-java-agent:8.16.0-alpine	#agent镜像仓库地址
          command:
            - sh
          args:
            - '-c'
            - >-
              mkdir -p /data/paasops/sk/agent/ && cp -r /skywalking/agent/*
              /data/paasops/sk/agent/
          resources: {}
          volumeMounts: #共享存储定义
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      containers: #服务容器
        - name: telecom-ai-base
          image: >-
            skywalking.test.cn/snapshot-docker-local/telecom-ai-base-api:20230810     #服务镜像仓库地址
          command:
            - /bin/bash
            - '-c'
            - chmod +x bin/* && ./bin/start.sh
          ports:
            - name: web-port
              containerPort: 8088
              protocol: TCP
          env:
            - name: NACOS_ADDR
              value: 'http://127.0.0.1:8808'
            - name: NACOS_USERNAME
              value: nacos
            - name: NACOS_PASSWORD
              value: nacos123456
            - name: NACOS_NAMESPACE
              value: 98dd1ba4-27e1-4502-a33d-bbead14da5c5
            - name: knife4j.switch
              value: 'true'
            - name: JAVA_AGENT_OPS #设置java agent启动参数
              value: >-
                -javaagent:/data/paasops/sk/agent/skywalking-agent.jar
                -Dskywalking.agent.service_name=sky-log-test
                -Dskywalking.collector.backend_service=127。0.0.1:32128
          resources: {}
          volumeMounts: #设置共享存储
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      imagePullSecrets:
        - name: ct-aics-dialog-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐