1.4 Skywalking介绍
2015年由个人吴晟(华为开发者)主导开源,作者是华为开发云监控产品经理,主导监控产品的规划、技术路线及相关研发工作,也是OpenTracing分布式追踪标准组织成员 ,该项目 2017年加入Apache孵化器,是一个分布式系统的应用程序性能监控工具(APM),专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
官方站点:http://skywalking.apache.org/
GitHub项目地址:https://github.com/apache/skywalking
Skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP系统。Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA, c++代理。支持Istio +特使服务网格
我们在学习Skywalking之前,可以先访问官方提供的控制台演示
演示地址:http://demo.skywalking.apache.org/ 账号:skywalking 密码:skywalking
1、SkyWalking 核心功能:
- 指标分析:服务,实例,端点指标分析
- 问题分析:在运行时分析代码,找到问题的根本原因
- 服务拓扑:提供服务的拓扑图分析
- 依赖分析:服务实例和端点依赖性分析
- 服务检测:检测慢速的服务和端点
- 性能优化:根据服务监控的结果提供性能优化的思路
- 链路追踪:分布式跟踪和上下文传播
- 数据库监控:数据库访问指标监控统计,检测慢速数据库访问语句(包括SQL语句)
- 服务告警:服务告警功能
名词解释:
- 服务(service):业务资源应用系统
- 端点(endpoint):应用系统对外暴露的功能接口
- 实例(instance):物理机
2、SkyWalking 特点:
- 多语言自动探针,支持 Java、.NET Code 等多种语言。
- 为多种开源项目提供了插件,为 Tomcat、 HttpClient、Spring、RabbitMQ、MySQL 等常见基础设施和组件提供了自动探针。
- 微内核 + 插件的架构,存储、集群管理、使用插件集合都可以进行自由选择。
- 支持告警。
- 优秀的可视化效果。
3、Skywalking架构图:
skyWalking整体可分为:客户端,服务端
客户端:agent组件
基于探针技术采集服务相关信息(包括跟踪数据和统计数据),然后将采集到的数据上报给skywalking的数据收集器
服务端:又分为OAP,Storage,WebUI
- OAP:observability analysis platform可观测性分析平台,负责接收客户端上报的数据,对数据进行分析,聚合,计算后将数据进行存储,并且还会提供一些查询API进行数据的查询,这个模块其实就是我们所说的链路追踪系统的Collector收集器
- Storage:skyWalking的存储介质,默认是采用H2,同时支持许多其他的存储介质,比如:ElastaticSearch,mysql等
- WebUI:提供一些图形化界面展示对应的跟踪数据,指标数据等等
2 Skywalking安装
Skywalking数据存储方式有2种,分别为H2(内存)和elasticsearch,如果数据量比较大,建议使用后者,工作中也建议使用后者。
Skywalking自身提供了UI管理控制台,我们安装的组件:
1:elasticsearch,建议使用elasticsearch7.x 2:elasticsearch-hq,elasticsearch的管理工具,更方便管理elasticsearch 3:Skywalking 4:Skywalking-UI
2.1 elasticsearch安装
1)系统资源配置修改
elasticsearch占用系统资源比较大,我们需要修改下系统资源配置,这样才能很好的运行elasticsearch,修改虚拟机配置,vi /etc/security/limits.conf
,追加内容:
* soft nofile 65536 * hard nofile 65536
修改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: 最小主节点个数 12345
安装完成后,重启容器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 1
安装完成后,访问控制台地址 http://192.168.200.129:5000/#!/clusters/elasticsearch
2.2 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 12
参数说明:
--link elasticsearch:elasticsearch:存储服务使用elasticsearch -e SW_STORAGE=elasticsearch7:存储服务elasticsearch的版本 -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200:存储服务elasticsearch的链接地址 123
接下来安装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 1
安装完成后,我们接下来访问Skywalking控制台:http://192.168.200.129:8080
关于SkywalkingUI的使用,我们在下一节知识点详细讲解。
2.3 Skywalking生产环境问题
1)ES分片数量上限
如果此时访问http://192.168.200.129:8080/ 出现500错误,错误如下,此时其实是Elasticsearch出了问题:
"com.netflix.zuul.exception.ZuulException","message":"GENERAL" 1
我们可以查看skywalking
的日志docker logs --since 30m skywalking
,会报如下错误:
Failed: 1: this action would add [2] total shards, but this cluster currently has [1000]/[1000] maximum shards open;] 1
这种错误一般是生产环境中Elasticsearch分片数量达到了峰值,es集群的默认最大分片数是1000,我们需要调整Elasticsearch的默认分片数量,修改方式有多种,最常用的是直接修改elasticsearch.yml
配置文件:
#进入elasticsearch容器 docker exec -it elasticsearch /bin/bash #编辑 vi /usr/share/elasticsearch/config/elasticsearch.yml #添加如下配置 cluster.max_shards_per_node: 10000000 123456
保存配置后,记得删除data/nodes
数据包,再重启elasticsearch,此时就可以正常访问了。
2)磁盘清理
如果此时能打开skywalking-ui
界面,但是没有数据,则需要清理磁盘空间,可能是磁盘空间满了,如果是docker容器,可以使用docker system prune
命令实现清理,docker system prune
命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a
命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
2.4 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.3.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.3.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/