分布式请求追踪系统分析
1、什么是分布式追踪
链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
2、痛点
- 某个核心服务挂了,导致上游出现大量报警,如何快速确定哪个服务出了问题?
- 某个核心服务挂了,导致大量报错,如何快速确定哪里出了问题?
- 应用程序有性能瓶颈,怎样确定瓶颈在哪里?
- App端请求响应延迟高,怎样确定是有哪些服务导致的?
- 线上发布了服务,怎么知道它一切正常,比如发布8台服务器,如何直观了解是否有请求进来,访问一切正常?
微服务调用
3、解决痛点
需要一些可以帮助开发人员理解系统行为,快速定位问题的工具,分布式追踪系统应运而生
4、分布式追踪系统产品
分布式追踪系统是2014年Google在《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》中提出,目前市面上很多开源的APM都参考Google Dapper
- open source
- 大众点评CAT
- 京东Hydra
- Twitter Zipkin
- Apache SkyWalking
- Pinpoint
APM工具 | 可视化 | 埋点方式 | 开发者 | 支持语言 | 特点 | 社区活跃度(相对) |
---|---|---|---|---|---|---|
CAT | 有 | 侵入式 | 美团点评 | JAVA、php、.NET | 基于Java语言开发,提供多种语言的客户端,监控数据全量统计,对代码侵入性强 | 高 |
hydra | 有 | 非侵入式 | 京东 | JAVA、.NET | 多协议支持 。Hydra支持多种协议,用户可以根据实际情况选择适用的协议进行密码破解。 高效快速 。Hydra使用并发技术,可以同时进行多个密码破解尝试,提高破解速度。 灵活性 。Hydra提供了丰富的选项和参数,用户可以根据需要进行定制化配置。 广泛应用 。Hydra可以应用于各种场景,包括渗透测试、密码破解等。 | 低 |
Zipkin | 有 | 侵入式 | 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