Sky+ES实现全链路监控
# SkyWalking+elasticsearch实现全链路监控
随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响。
面对以上情况, 我们就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。这时候分布式追踪系统就该闪亮登场了。
# 分布式追踪系统skywalking
1、什么是分布式追踪?
上图是常见的微服务的框架,4个实例,2个MySQL、1个Redis。实际上它有两次完全不同的请求进来:有一次的一个请求会访问 Redis,再去访问MySQL;另外一个可能走到另外的服务上,然后直接去MySQL。整个分布式追踪的目的是什么?是为了让我们最终在页面上、UI上、和数据上能够复现这个过程。我们要拿到整个完整的链路,包括精确的响应时间,访问的方法、访问的circle,访问的Redis的key等,这些是我们在做分布式追踪的时候需要展现的一个完整的信息。
2、skywalking简介
SkyWalking 是针对分布式系统的 APM 系统,也被称为分布式追踪系统
- 全自动探针监控,不需要修改应用程序代码。
- 支持手动探针监控, 提供了支持 OpenTracing 标准的SDK。覆盖范围扩大到 OpenTracing-Java 支持的组件。
- 自动监控和手动监控可以同时使用,使用手动监控弥补自动监控不支持的组件,甚至私有化组件。
- 纯 Java 后端分析程序,提供 RESTful 服务,可为其他语言探针提供分析能力。
- 高性能纯流式分析
SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。
# 部署前的准备工作
# 1.关闭selinux
[root@gpmall ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
[root@gpmall ~]# systemctl stop firewalld
# 2.使用下载好的安装包
注:SkyWalking 7.0.X目前只支持elasticsearch 7.x版本,版本需要一致。
[root@gpmall skywalking]# ll
total 624848
-rw-r--r-- 1 root root 142938066 Feb 10 02:34 apache-skywalking-apm-es7-8.0.0.tar.gz
-rw-r--r-- 1 root root 311388520 Feb 10 01:37 elasticsearch-7.17.0-linux-x86_64.tar.gz
drwxr-xr-x 3 root root 285 Feb 11 08:00 gpmall
-rw-r--r-- 1 root root 185515842 Jan 22 2021 jdk-8u144-linux-x64.tar.gz
# 3.查看java环境
当前我已经安装好java环境,提前部署一个java项目,然后停掉所有的jar包,在后面接入的时候再启动。
[root@gpmall gpmall]# cd
[root@gpmall ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
# 4.部署elasticsearch
如果只在目录中操作可以不添加变量到/etc/profile下。
这里使用elasticsearch的软连接来操作,需要将安装包解压到/usr/local/下面,在该目录下进行操作。
[root@gpmall skywalking]# tar zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz -C /usr/local/
[root@gpmall skywalking]# cd /usr/local/
[root@gpmall local]# mv elasticsearch-7.17.0/ elasticsearch
[root@gpmall local]# vim /etc/profile
export ES_HOME=/usr/local/elasticsearch/
export PATH=$ES_HOME/bin:$PATH
[root@gpmall local]# source /etc/profile
[root@gpmall local]# elasticsearch --version
Version: 7.17.0, Build: default/tar/bee86328705acaa9a6daede7140defd4d9ec56bd/2022-01-28T08:36:04.875279988Z, JVM: 17.0.1
创建elasticsearch特权用户
[root@gpmall local]# useradd els -p 123456
[root@gpmall local]# usermod -g root els
[root@gpmall local]# chown -R els:root /usr/local/elasticsearch/
添加系统文件打开数量 ,修改最大虚拟内存大小。
注意:退出重新登录当前窗口,生效limits.conf的配置文件。
[root@gpmall local]# vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
[root@gpmall local]# echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
[root@gpmall local]# sysctl -p
vm.max_map_count = 655360
修改elasticsearch的elasticsearch/config/elasticsearch.yml
配置文件,需要将以下的配置文件注释取消注释掉。
修改完配置文件需要切换到els用户去启动进程。使用-d参数
开启守护进程。
cluster.name
这是一个描述,后面的skywalking需要配置相同的名字
node.name
可以是当前主机的名称
path.data
这是当前的数据存放的目录
path.logs
这是当前的日志存放的目录,方便后续查看报错
network.host
这里使用elasticsearch的IP地址
http.port
开启使用http的9200端口
cluster.initial_master_nodes
配置内部的master节点名称
[root@gpmall local]# cat elasticsearch/config/elasticsearch.yml | grep -Ev "^$|^#"
cluster.name: my-application
node.name: gpmall
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
network.host: 192.168.1.106
http.port: 9200
cluster.initial_master_nodes: ["gpmall"]
[root@gpmall local]# su - els
[els@gpmall ~]$ source /etc/profile
[els@gpmall ~]$ elasticsearch -d
[els@gpmall skywalking]# ss -ntpl | grep 9200
LISTEN 0 128 ::ffff:192.168.1.106:9200 :::* users:(("java",pid=3412,fd=295))
这里有一个小细节:
elasticsearch是使用java包启动的, 如果出现如下的报错,显示内存不足,是因为java当中已经启动了elasticsearch
,再次启动会显示内存报错,其实并不是内存报错,是pid进程冲突
,不能同时存在两个一样的进程,所以只需要把之前的elasticsearch的jar进程杀掉就好了。
[els@gpmall ~]$ elasticsearch -d
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007fbff5b8a000, 97058816, 0) failed; error='Not enough space' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 97058816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid17760.log
[els@gpmall ~]$ jps
3412 Elasticsearch
3544 Jps
[els@gpmall ~]$ kill -9 3412
[els@gpmall ~]$ elasticsearch -d
[els@gpmall skywalking]# ss -ntpl | grep 9200
LISTEN 0 128 ::ffff:192.168.1.106:9200 :::* users:(("java",pid=3523,fd=295))
通过http://192.168.1.106:9200查看
# 5.部署SkyWalking
将编译好的skywalking压缩包解压到/usr/local/目录下工作。
[root@gpmall skywalking]# tar zxvf apache-skywalking-apm-es7-8.0.0.tar.gz -C /usr/local/
修改skywalking的apache-skywalking-apm-bin-es7/config/application.yml
配置文件。
- 可以在vim工作模式下输入如下
:%s/localhost/192.168.1.106
,将所有的localhost修改成192.168.1.106的ip地址。 - 将elasticsearch的默认的
cluster.name的名称
填入elasticsearch的nameSpace中
。
[root@gpmall skywalking]# cd /usr/local/
[root@gpmall local]# ls
apache-skywalking-apm-bin-es7 bin elasticsearch etc games include lib lib64 libexec sbin share src
[root@gpmall local]# cd apache-skywalking-apm-bin-es7/
[root@gpmall apache-skywalking-apm-bin-es7]# vim config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch7} #修改成elasticsearch7
elasticsearch:
nameSpace: ${SW_NAMESPACE:"my-application"} #这里需要修改
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.106: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:""}
dayStep: ${SW_STORAGE_DAY_STEP:1}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1}
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5}
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}
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10}
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2}
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:
nameSpace: ${SW_NAMESPACE:"my-application"} #这里需要修改
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.106:9200}
# 6.Java项目接入
skywalking支持很多项目,比如Java、.net、github、sample等,这里使用java的项目。修改agent/config/agent.config文件内容,只需要修改以下两行。
这里的java项目名称使用默认,将collector的127.0.0.1换成elasticsearch的ip地址
。
最后启动服务通过浏览器访问IP:8080。
注:agent.servicename是你的java项目的名称;collector.backendservice是项目连接skywalking的IP地址和端口号。
将agent打包并上传到java项目服务器上,在java程序启动时添加下面这个参数启动即可。
[root@gpmall apache-skywalking-apm-bin-es7]# vim agent/config/agent.config
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.1.106:11800}
[root@gpmall apache-skywalking-apm-bin-es7]# ./bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
[root@gpmall apache-skywalking-apm-bin-es7]# ss -ntpl | grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=14032,fd=19))
通过浏览器访问http://192.168.1.106:8080
# 7.启动java项目接入
当前的java项目是应用商城的网站。
通过启动java包的同时使用-javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
这个路径是skywalking下面的agent目录下的jar包。
这里并不使用后台启动jar包,因为需要边看日志边看是否正常接入skywalking。
[root@gpmall gpmall]# java -javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -jar shopping-provider-0.0.1-SNAPSHOT.jar &
[root@gpmall gpmall]# java -javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -jar user-provider-0.0.1-SNAPSHOT.jar &
[root@gpmall gpmall]# java -javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &
[root@gpmall gpmall]# java -javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -jar gpmall-user-0.0.1-SNAPSHOT.jar &
java的项目已经完全启动,再次查看skywalking的web可视化。
需要多次刷新几次就可以了,将时间调成1秒然后刷新。 通过对网站的疯狂测试之后以下内容可以查看skywalking的链路追踪情况。
注意: 如果此时的java包启动完成之后,elasticsearch有退出的情况,请重新启动elasticsearch。此时我的elasticsearch服务已经断开连接,所以我重启了服务。
[els@gpmall ~]$ source /etc/profile [els@gpmall ~]$ jps 15102 Jps [els@gpmall ~]$ elasticsearch -d [els@gpmall ~]$ ss -ntpl | grep 9200 LISTEN 0 128 ::ffff:192.168.1.106:9200 :::* users:(("java",pid=15298,fd=294)