文章目录
背景
随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。
我们思考下这些问题:
1:一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方?
2:如何计算每个节点访问流量?
3:流量波动的时候,增加哪些节点集群服务?
这些问题要想得到解决,一定是有数据支撑,绝不是靠开发人员或者运维人员的直觉。为了解决分布式应用、微服务系统面临的这些挑战,APM系统(Application Performance Management,即应用性能管理)应运而生。
分布式追踪系统的原理
分布式追踪系统大体分为三个部分,数据采集、数据持久化、数据展示。
数据采集是指在代码中埋点,设置请求中要上报的阶段,以及设置当前记录的阶段隶属于哪个上级阶段。
数据持久化则是指将上报的数据落盘存储,
数据展示则是前端查询与之关联的请求阶段,并在界面上呈现。
Trace
一个 Trace 代表一个事务、请求或是流程在分布式系统中的执行过程。
OpenTracing 中的一条 Trace调用链,由多个 Span 组成,一个 Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 一般会有一个名称,一条 Trace中 Span 是首尾连接的。
Span
Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 之间通过嵌套或者顺序排列建立逻辑因果关系。
Skywalking介绍
2015年由个人吴晟(华为开发者)主导开源,作者是华为开发云监控产品经理,主导监控产品的规划、技术路线及相关研发工作,也是OpenTracing分布式追踪标准组织成员 ,该项目 2017年加入Apache孵化器,是一个分布式系统的应用程序性能监控工具(APM),专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
Skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP系统。Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
官方站点:http://skywalking.apache.org/
GitHub项目地址:https://github.com/apache/skywalking
我们在学习Skywalking之前,可以先访问官方提供的控制台演示
演示地址: http://demo.skywalking.apache.org/
账号:skywalking 密码:skywalking
SkyWalking 核心功能
指标分析:服务,实例,端点指标分析
问题分析:在运行时分析代码,找到问题的根本原因
服务拓扑:提供服务的拓扑图分析
依赖分析:服务实例和端点依赖性分析
服务检测:检测慢速的服务和端点
性能优化:根据服务监控的结果提供性能优化的思路
链路追踪:分布式跟踪和上下文传播
数据库监控:数据库访问指标监控统计,检测慢速数据库访问语句(包括SQL语句)
服务告警:服务告警功能
日志监控:日志功能
名词解释:
服务(service):业务资源应用系统
端点(endpoint):应用系统对外暴露的功能接口
实例(instance):物理机
Skywalking架构图:
skyWalking整体可分为:客户端,服务端
客户端:agent组件
基于探针技术采集服务相关信息(包括跟踪数据和统计数据),然后将采集到的数据上报给skywalking的数据收集器
服务端:又分为OAP,Storage,WebUI
OAP:observability analysis platform可观测性分析平台,负责接收客户端上报的数据,对数据进行分析,聚合,计算后将数据进行存储,并且还会提供一些查询API进行数据的查询,这个模块其实就是我们所说的链路追踪系统的Collector收集器
Storage:skyWalking的存储介质,默认是采用H2,同时支持许多其他的存储介质,比如:ElastaticSearch,mysql等
WebUI:提供一些图形化界面展示对应的跟踪数据,指标数据等等
SkyWalking环境搭建
官方下载:http://skywalking.apache.org/downloads/
Skywalking数据存储方式有2种,分别为H2(内存)和elasticsearch,如果数据量比较大,建议使用后者,工作中也建议使用后者。
Skywalking自身提供了UI管理控制台,我们安装的组件:
1:elasticsearch,建议使用elasticsearch7.x
2:elasticsearch-hq,elasticsearch的管理工具,更方便管理elasticsearch
3:Skywalking
4:Skywalking-UI
elasticsearch安装
1)系统资源配置修改
elasticsearch占用系统资源比较大,我们需要修改下系统资源配置,这样才能
很好的运行elasticsearch,修改虚拟机配置, vi/etc/security/limits.conf ,追加内容:
soft nofile 65536
hard nofile 6553
修改 vi /etc/sysctl.conf ,追加内容 :
vm.max_map_count=655360
让配置立即生效:
/sbin/sysctl -p
2)安装elasticsearch
建议安装:elasticsearch7.x,我们这里选择7.6.2,并且采用容器的安装方式,安装如下:
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --
restart=always -e "discovery.type=single-node" -e
ES_JAVA_OPTS="-Xms84m -Xmx512m" -d elasticsearch:7.6.2
3)elasticsearch跨域配置
elasticsearch默认是没有开启跨域,我们需要配置跨域,并配置集群节点名字:
#进入容器
docker exec -it elasticsearch /bin/bash
修改容器中 /usr/share/elasticsearch/config/elasticsearch.yml 文件,添加配置如下:
cluster.name: "elasticsearch"
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
参数说明:
cluster.name:集群服务名字
http.cors.enabled:开启跨域
http.cors.allow-origin: 允许跨域域名,*代表所有域名
network.host: 外部访问的IP
discovery.zen.minimum_master_nodes: 最小主节点个数
安装完成后,重启容器 docker restart elasticsearch ,再访问http://192.168.200.129:9200/ 效果如下:
安装 ElasticSearch管理界面elasticsearch-hq
docker run -d --name elastic-hq -p 5000:5000 --restart always
elastichq/elasticsearch-hq
Skywalking安装
Skywalking的安装我们也采用Docker安装方式,同时我们需要为Skywalking指定存储服务:
#安装Skywalking
docker run --name skywalking -d -p 1234:1234 -p 11800:11800 -
p 12800:12800 --restart always --link
elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch7 -e
SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
apache/skywalking-oap-server
参数说明:
--link elasticsearch:elasticsearch:存储服务使用elasticsearch
-e SW_STORAGE=elasticsearch7:存储服务elasticsearch的版本
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200:存储服务
elasticsearch的链接地址
接下来安装Skywalking-UI,需要指定Skywalking服务名字:
docker run --name skywalking-ui -d -p 8080:8080 --link
skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 --
restart always apache/skywalking-ui
docker-compose部署
创建docker-compose.yml并配置如下
version: '3.3'
services:
elasticsearch:
image: elasticsearch:7.6.2
container_name: elasticsearch
restart: always
privileged: true
hostname: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
networks:
- skywalking
ulimits:
memlock:
soft: -1
hard: -1
elasticsearch-hq:
image: elastichq/elasticsearch-hq
container_name: elasticsearch-hq
restart: always
privileged: true
hostname: elasticsearch-hq
ports:
- 5000:5000
environment:
- TZ=Asia/Shanghai
networks:
- skywalking
oap:
image: apache/skywalking-oap-server:8.7.0-es7
container_name: oap
hostname: oap
privileged: true
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
TZ: Asia/Shanghai
volumes:
- ./config/alarm-settings.yml:/skywalking/config/alarm-settings.yml
networks:
- skywalking
ui:
image: apache/skywalking-ui:8.7.0
container_name: ui
privileged: true
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: oap:12800
TZ: Asia/Shanghai
networks:
- skywalking
networks:
skywalking:
driver: bridge
通过命令一键启动:
docker-compose up -d
启动成功后访问skywalking的webui页面:http://192.168.200.129:8080/
Skywalking应用
skywalking-collector:链路数据归集器,数据可以落地ElasticSearch/H2
skywalking-ui:web可视化平台,用来展示落地的数据
skywalking-agent:探针,用来收集和发送数据到归集器
agent下载
Skywalking-agent,它简称探针,用来收集和发送数据到归集器,我们先来学习下探针使用,探针对应的jar包在Skywalking源码中,我们需要先下载源码。
Skywalking源码下载地址: https://archive.apache.org/dist/skywalking/
agent目录结构如下:
agent应用
项目使用agent,如果是开发环境,可以使用IDEA集成,如果是生产环境,需要将项目打包上传到服务器。为了使用agent,我们同时需要将下载的 apacheskywalking-apm-bin 文件包上传到服务器上去。不过无论是开发环境还是生产环境使用agent,对项目都是无侵入式的。
应用名配置
我们需要用到 agent ,此时需要将 agent/config/agent.config 配置文件拷贝到每个需要集成Skywalking工程的resource目录下,
并修改其中的agent.service_name
IDEA集成使用agent
在运行的程序配置 jvm参数:
-javaagent:C:\developer\skywalking\apache-skywalking-apm\bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=test
生产环境使用agent
生产环境使用,因此我们需要将agent和每个项目的jar包上传到服务器上,上传 apache-skywalking-apm-bin 至/usr/local/server/skywalking ,再将 工程 中的项目打包,并分别上传到服务器上,如下三个工程:
hailtaxi-order-1.0-SNAPSHOT.jar
hailtaxi-gateway-1.0-SNAPSHOT.jar
hailtaxi-driver-1.0-SNAPSHOT.jar
1)启动hailtaxi-gateway
java -javaagent:/usr/local/server/skywalking/apacheskywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=hailtaxi-gateway -jar
hailtaxi-gateway-1.0-SNAPSHOT.jar &
2)启动hailtaxi-driver
java -javaagent:/usr/local/server/skywalking/apacheskywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=hailtaxi-driver -jar hailtaxidriver-1.0-SNAPSHOT.jar &
其他的类似