skywalking+elasticsearch
一、skywalking介绍
1.1 分布式链路追踪
1.1.1 可观测的监控系统
可观测的监控领域主要有下面三种
-
基于 Metrics(指标)监控
-
基于 Logging(日志)的监控
-
基于 Tracing(调用链)监控

1.1.2 常见的分布式链路追踪系统
分布式链路追踪Tracing主流的系统有:
skywalking、OpenTelemetry、OpenTracing、OpenCensus、CAT(大众点评)、Jaeger(Uber)、Zipkin(Twitter)、Pinpoint(韩国)
- Trace:
追踪Trace是一系列相关的跟踪数据的集合,代表了一个请求在分布式系统中的完整路径全局唯一的链路标识 Traceld,是最具代表的一个属性。通过 Traceld 我们才能将同一个请求分散在不同节点的链路数据准确的关联起来,实现请求粒度的“确定性关联”价值。Trace 追踪通常由一系列的多个跟踪段 Span 组成的有向无环图 DAG
- Span:
仅有 Traceld 还不够的,还需要了解每一个请求在每一跳的接口方法上执行了什么动作,耗时多久执行状态是成功还是失败?
承载这些信息的基础对象就是 Span,跟踪段(跨度)Span是追踪中的具有开始时间和执行时长的基本的逻辑运行单元,代表了请求在系统中的一个特定操作或组件上的执行。每个跟踪段表示一个操作的时间片段,记录了操作的开始和结束时间、操作名称、标签等信息。 Span 之间通过顺序排列或者嵌套建立逻辑前后调用关系例如,一个HTTP请求、数据库查询等都可以是一个跟踪段。这些跟踪段在分布式系统中串联起来,形成完整的调用链路。
通常一个完整的 Span 具有如下属性:
①Operation Name:描述了当前接口的行为语义,比如 /api/createOrder 代表执行了一次创建订单的动作。
②Spanld/ParentSpanld:接口调用的层级标识,用于还原 Trace 内部的层次调用关系
③Start/FinishTime:接口调用的开始和结束时间,二者相减就是该次调用的耗时。
④StatusCode:响应状态,标识当次调用是成功或失败。
⑤Tags & Events:调用附加信息
- Context Propagation :
分布式系统中的请求通常会经过多个不同的服务和组件,为了能够在整个调用链中追踪请求,需要共享上下文信息。
上下文传递确保在请求跨越不同服务时,相关信息如请求ID、时间戳等能够被正确传递,以便在后续的调用中能够识别并追踪这个请求且保持一致性。
- Tag(标签):
Tag 是用于在 Span 中添加元数据的机制,表现为多个key/value形式,
Tag主要用于对Span进行注解和补充,一般可以用来记录操作的相关信息,如请求参数、响应状态等。
Tag 是没有时间戳信息的
- 分布式链路追踪的实现流程:
1.客户端发起请求,并生成一个唯-的 Trace ID.
2.Trace ID 会在整个请求过程中传递,并在每个服务中记录下来。
3.每个服务会记录请求的开始时间、结束时间、调用参数、返回值等信息,并将其与 Trace lD 关联起来。
4.所有的 Span 信息会被收集到一个集中存储系统中。
5.用户可以通过査询系统,查看完整的请求链路,并分析系统的性能和排查故障。
1.2 SkyWalking
关于APM
APM(Application Performance Management)即应用性能管理系统,是对企业系统进行实时监控,以实现对应用程序性能管理和故障管理的系统化的解决方案。
APM 应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本,APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
官网:
https://skywalking.apache.org/
1.3 SkyWalking组成
https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/
https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/


SkyWalking分成四个组成部分
- SkyWalking OAP:即Observation Application Platform,负责接收Agent发送的Tracing数据信息,然后进行分析Analysis Core,存储到外部存储器Storage,最终提供查询Query功能
- SkyWalking UI:负责提供控台,查看链路等等
- Storage:Tracing数据存储。目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器。SkyWalking默认使用H2内存存储,无法持久化保存,Skywalking开发团队自己的生存环境采用ES为主,生产建议采用ES
- Agent:负责从应用中,收集链路信息,发送给SkyWalking OAP服务器。目前支持SkyWalking、Zikpin、Jaeger等提供的Tracing数据信息。
1.4 SkyWalking生产架构
Agent上报数据给OAP端,有grpc通道和Kafka通道,数据量如果很大,grpc通道可能撑不住,可以选择Kafka通过来削峰;Kafka通道是在8版本加入的

1.5 SkyWalking相关概念
Service服务:即一个应用,6.0后改名为Service
Endpoint端点:即一个API接口,表示传入请求的服务中的路径,例如HTTP URI路径或gRPC服务类+方法签名。比如:/Order/queryAll
Instance实例:即一个进程或者一个Pod容器,通常表现为一个应用对应的:IP:Port
Segment:是SkyWalking中提出的概念,表示一次请求在某个服务内的执行链路片段的合集,一个请求在多个服务中先后产生的Segment串起来构成一个完整的Trace,如下图所示:

二、Skywalking服务器部署
SkyWalking服务器包括可观测性分析平台(OAP)服务器和本机UI服务器两个组件
支持多种安装方法
二进制
docker容器
docker compose
kubernetes集群内部署
2.1 基于二进制安装
2.1.1 二进制安装说明
https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-setup/
Skywalking 9.x安装要求:
Requirement: JDK11 or JDK17.
PS:如果安装ES,建议内存不能低于8G
下载链接
https://archive.apache.org/dist/skywalking/
2.1.2 二进制安装SkyWalking服务器
2.1.2.1 安装JAVA环境
wget https://www.oracle.com/java/technologies/downloads
root@wang:~# tar -xvf /usr/local/tmp/jdk-11.0.14_linux-x64_bin.tar.gz -C /usr/local/
root@wang:~# ln -sv /usr/local/jdk-11.0.14 /usr/local/jdk
'/usr/local/jdk' -> '/usr/local/jdk-11.0.14'
root@wang:~# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
root@wang:~# . /etc/profile.d/jdk.sh
root@wang:~# java -version
java version "11.0.14" 2022-01-18 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.14+8-LTS-263)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.14+8-LTS-263, mixed mode)
2.1.2.2 安装skywalking服务器
#官网下载
root@wang:~# wget https://archive.apache.org/dist/skywalking/8.9.0/apache-skywalking-apm-8.9.0.tar.gz
root@wang:~# tar xvf apache-skywalking-apm-8.9.0.tar.gz -C /usr/local/
root@wang:/usr/local# ln -sv apache-skywalking-apm-bin skywalking
'skywalking' -> 'apache-skywalking-apm-bin'
cat /usr/local/skywalking/webapps/application.yml
serverPort: ${SW_SERVER_PORT:-8080}
oapServices: ${SW_OAP_ADDRESS:-http://localhost:12800}
#elasticsearch存储配置
root@wang:/usr/local# vim /usr/local/skywalking/config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:"wang-test"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:500}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes
# Super data set has been defined in the codes, such as trace segments.The following 3 config would be improve es performance when storage super size data in es.
superDatasetDayStep: ${SW_SUPERDATASET_STORAGE_DAY_STEP:-1} # Represent the number of days in the super size dataset record index, the default value is the same as dayStep when the value is less than 0
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
superDatasetIndexReplicasNumber: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER:0} # Represent the replicas number in the super size dataset record index, the default value is 0.
indexTemplateOrder: ${SW_STORAGE_ES_INDEX_TEMPLATE_ORDER:0} # the order of index template
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:5000} # Execute the async bulk record data every ${SW_STORAGE_ES_BULK_ACTIONS} requests
# flush the bulk every 10 seconds whatever the number of requests
# INT(flushInterval * 2/3) would be used for index refresh period.
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:15}
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
oapAnalyzer: ${SW_STORAGE_ES_OAP_ANALYZER:"{\"analyzer\":{\"oap_analyzer\":{\"type\":\"stop\"}}}"} # the oap analyzer.
oapLogAnalyzer: ${SW_STORAGE_ES_OAP_LOG_ANALYZER:"{\"analyzer\":{\"oap_log_analyzer\":{\"type\":\"standard\"}}}"} # the oap log analyzer. It could be customized by the ES analyzer configuration to support more language log formats, such as Chinese log, Japanese log and etc.
advanced: ${SW_STORAGE_ES_ADVANCED:""}
root@wang:/usr/local# /usr/local/skywalking/bin/startup.sh
2.1.2.3 使用elasticsearch存储
skywalking默认使用h2内存存储,如果使用ES存储需要先安装ES
2.1.2.3.1 安装elasticsearch
#elasticsearch版本与系统和Java版本的支持关系
# https://www.elastic.co/cn/support/matrix#matrix_jvm
安装jdk环境 见 2.1.2.1
安装elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz
tar -xf /usr/local/tmp/elasticsearch-7.12.1-no-jdk-linux-x86_64.tar.gz -C /usr/local/
ln -sv /usr/local/elasticsearch-7.12.1 /usr/local/elasticsearch
groupadd elasticsearch
useradd elasticsearch -g elasticsearch
chown -R elasticsearch:elasticsearch elasticsearch/
root@wang:/usr/local# vim /usr/local/elasticsearch/config/jvm.options
-Xms4g #建议取消这两个参数注释,默认启动为1024m
-Xmx4g #建议取消这两个参数注释,默认启动为1024m
root@wang:/usr/local# vim /etc/sysctl.conf
vm.max_map_count=262144
fs.file-max = 1000000
root@wang:/usr/local# sysctl -p
vm.max_map_count=262144 #服务启动最小值
fs.file-max = 1000000
[root@Tomcat01 ~]# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root@wang:/usr/local# vim /usr/local/elasticsearch/config/elasticsearch.yml
#cluster.name: my-application #集群配置,集群名称默认为elasticsearch
#node.name: node-1 #集群配置,该node节点名称
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
network.host: 192.168.65.10
http.port: 9200 #对外地址
discovery.seed_hosts: ["192.168.65.10"] #如需配置集群需要所有节点都加入
#cluster.initial_master_nodes: ["node-1", "node-2","node-3"]#集群配置,参加选举主节点配置,如需写主机名称需要配置host解析
root@wang:/usr/local# su elasticsearch
elasticsearch@wang:/usr/local$ /usr/local/elasticsearch/bin/elasticsearch >/dev/null 2>&1 &
###elasticsearch不能使用root账号启动会报错
root@wang:/usr/local# /usr/local/elasticsearch/bin/elasticsearch
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
warning: no-jdk distributions that do not bundle a JDK are deprecated and will be removed in a future release
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
warning: no-jdk distributions that do not bundle a JDK are deprecated and will be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[2025-06-17T08:29:00,826][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [wang] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
本文来自博客园,作者:原味玉米烙,转载请注明原文链接:https://www.cnblogs.com/yml2024/p/18936502

浙公网安备 33010602011771号