十分钟快速搭建 SkyWalking 服务分析

你猜 阅读:463 2021-04-01 12:18:22 评论:0

1、SkyWalking是什么

官网地址:http://skywalking.apache.org/

SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8S、Mesos)架构而设计;
SkyWalking是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;

2、SkyWalking功能

SkyWalking是一个开源APM系统,包括对Cloud Native体系结构中的分布式系统的监视,跟踪,诊断功能。 核心功能如下。

  • 服务,服务实例,端点指标分析
  • 根本原因分析
  • 服务拓扑图分析
  • 服务,服务实例和端点依赖关系分析
  • 检测到慢速服务和端点
  • 性能优化
  • 分布式跟踪和上下文传播
  • 数据库访问指标。 检测慢速数据库访问语句(包括SQL语句)。
  • 报警
  • SkyWalking支持从多种来源和多种格式收集遥测(跟踪和度量)数据,包括
  • SkyWalking格式的Java,.NET Core,NodeJS和PHP自动仪器代理
  • SkyWalking格式的手动仪器Go代理。
  • Istio遥测格式
  • 由Istio控制的服务网格中的Envoy gRPC访问日志服务(ALS)格式
  • 特使指标服务格式
  • Zipkin v1 / v2格式
  • Jaeger gRPC格式

3、整体架构

在这里插入图片描述
整个架构,分成上、下、左、右四部分:
考虑到让描述更简单,我们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。

  • 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
  • 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
  • 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
  • 左部分 SkyWalking UI :负责提供控台,查看链路等等。

SkyWalking 的中文文档: https://github.com/SkyAPM/document-cn-translation-of-skywalking

4、SkyWalking实战

我们实战搭建一下SkyWalking单机环境
在这里插入图片描述

4.1 ElasticSearch搭建

SkyWalking数据持久化支持多种数据源,这里数据源选择使用ElasticSearch,版本为V7.4.0

【注】如果项目中也使用ElasticSearch,不建议SkyWalking与项目使用同一个ElasticSearch。因为SkyWalking会在ES中创建大量索引并且比较消耗内存。

ES搭建建议大家使用Docker进行安装
1、配置参数

sysctl -w vm.max_map_count=262144 && 
grep vm.max_map_count /etc/sysctl.conf 

2、下载镜像

docker pull elasticsearch:7.4.0 

3、启动容器

docker run --name elasticsearch -d \ 
-v /home/elk/elasticsearch/data:/usr/share/elasticsearch/data \ 
-p 9200:9200 \ 
-p 9300:9300 \ 
elasticsearch:7.4.0 

4、配置目录权限
由于容器目录映射到宿主机目录,需要给宿主机目录授权。我这里就省事配置777了。

chmod 777 /home/elk/elasticsearch/data 

5、验证

curl http://127.0.0.1:9200 

看到如下结果证明安装成功

{
    
  
    "name": "0a50cb561c04", 
    "cluster_name": "docker-cluster", 
    "cluster_uuid": "DFu_C31fQwqhzLyTko6wGg", 
    "version": {
    
        "number": "7.4.0", 
        "build_flavor": "default", 
        "build_type": "docker", 
        "build_hash": "b7e28a7", 
        "build_date": "2019-04-05T22:55:32.697037Z", 
        "build_snapshot": false, 
        "lucene_version": "8.0.0", 
        "minimum_wire_compatibility_version": "6.7.0", 
        "minimum_index_compatibility_version": "6.0.0-beta1" 
    }, 
    "tagline": "You Know, for Search" 
  
} 

4.2 安装配置SkyWalking

官方下载地址:http://skywalking.apache.org/downloads/

【注】需要注意版本,我开始使用SkyWalking7.0.0版本,发现无法监控到我的服务,后来我切换到最新 的8.0.1解决了问题。

下载最新版本V8.0.1Binary Distribution for ElasticSearch 7版本

 wget https://mirror.bit.edu.cn/apache/skywalking/8.0.1/apache-skywalking-apm-es7-8.0.1.tar.gz 

修改/apache-skywalking-apm-bin-es7/config/application.yml配置文件中的数据源,默认使用H2,我们切换成ES。

storage: 
  # 切换数据源 
  selector: ${
   SW_STORAGE:elasticsearch7} 
  elasticsearch: 
    nameSpace: ${
   SW_NAMESPACE:""} 
    clusterNodes: ${
   SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} 
    protocol: ${
   SW_STORAGE_ES_HTTP_PROTOCOL:"http"} 
    trustStorePath: ${
   SW_STORAGE_ES_SSL_JKS_PATH:""} 
    trustStorePass: ${
   SW_STORAGE_ES_SSL_JKS_PASS:""} 
    user: ${
   SW_ES_USER:""} 
    password: ${
   SW_ES_PASSWORD:""} 
    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} # The index shards number is for store metrics data rather than basic segment record 
    superDatasetIndexShardsFactor: ${
   SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces. 
    indexReplicasNumber: ${
   SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} 
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html 
    bulkActions: ${
   SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests 
    flushInterval: ${
   SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests 
    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} 
    advanced: ${
   SW_STORAGE_ES_ADVANCED:""} 
  elasticsearch7: 
  	# 配置自己安装ES的nameSpace 
    nameSpace: ${
   SW_NAMESPACE:"docker-cluster"} 
    # 配置ES的连接信息 
    clusterNodes: ${
   SW_STORAGE_ES_CLUSTER_NODES:192.168.0.4:9200} 
    protocol: ${
   SW_STORAGE_ES_HTTP_PROTOCOL:"http"} 
    #trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""} 
    #trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""} 
    dayStep: ${
   SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index. 
    #user: ${SW_ES_USER:""} 
    #password: ${SW_ES_PASSWORD:""} 
    secretsManagementFile: ${
   SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool. 
    indexShardsNumber: ${
   SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # The index shards number is for store metrics data rather than basic segment record 
    superDatasetIndexShardsFactor: ${
   SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces. 
    indexReplicasNumber: ${
   SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} 
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html 
    bulkActions: ${
   SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests 
    flushInterval: ${
   SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests 
    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} 
    advanced: ${
   SW_STORAGE_ES_ADVANCED:""} 

由于SkyWalking UI的默认地址是8080,与很多中间件有冲突,建议大家修改一下

修改apache-skywalking-apm-bin-es7/webapp/webapp.yml

server: 
  port: 18080 

修改agent配置,apache-skywalking-apm-bin-es7/agent/config/agent.config

collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.0.4:11800} 
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1} 

**

采样率修改

agent.sample_n_per_3_secs配置详解:

在访问量较少时,链路全量收集不会对系统带来多少负担,同时能够完整的观测到系统的运行状况。但是在访问量较大时,全量的链路收集,对链路收集的客户端(应用)、服务端(例如说 SkyWalking OAP Collector)、存储器(例如说 Elastcsearch)都会带来较大的性能开销,甚至会影响应用的正常运行。

因此,在访问量级较大的情况下,我们往往会选择抽样采样,只选择收集部分链路信息。SkyWalking Agent 在 agent/config/agent.config 配置文件中,定义了 agent.sample_n_per_3_secs 配置项,设置每 3 秒可收集的链路数据的数量。

启动SkyWalking

apache-skywalking-apm-bin-es7/bin/startup.sh 

访问:http://127.0.0.1:18080 看到下图内容代表搭建完成。由于还没有配置服务,因为没有服务的监控信息。
在这里插入图片描述

5、服务添加至SkyWalking

搭建完成SkyWalking,我们需要将我们的应用服务添加到SkyWalking中。这个也非常简单。对代码无任何侵入性。

Idea 配置
如果我们是本地启动的项目,开发工具使用的IDEA,我们只需要在如下图所示地方配置启动附加信息即可。

javaagent配置的是agent对应的jar位置。
service_name配置建议使用服务的spring.application.name方便区分。

-javaagent:D:\Develop\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar 
-Dskywalking.agent.service_name=leimingtech-admin-api 

在这里插入图片描述
jar启动配置
我们的应用最终肯定是部署在服务器上的,因为我们需要在jar启动的时候配置SkyWalking连接信息。

java -javaagent:/opt/skywalking/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=leimingtech-operation-api -Xms256m -Xmx256m -Xmn250m  -jar leimingtech-operation-api.jar 

一般生产环境多个服务肯定是部署在不同机器上,这时候可能会有疑问,我是需要在全部机器上都搭建SkyWalking么?肯定不是的!我们只需要把SkyWalking中的agent模块复制到另一台机器即可。

6、SkyWalking UI查看

启动完成项目,由于SkyWalking采用懒加载收集模式,我们需要先请求接口才能被SkyWalking监控到。
任意访问一个接口地址。查看SkyWalking UI。

APM视图:
在这里插入图片描述
拓扑图
在这里插入图片描述
链路追踪
在这里插入图片描述
链路追踪-SQL查看
在这里插入图片描述

参考文献

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号