随着业务越来越复杂,企业应用也进入了分布式服务化的阶段,随着模块的不断增多,一次请求可能会涉及到十几个甚至几十个服务的协同处理,那么如何准确快速的定位到线上故障和性能瓶颈,便成为我们不得不面对的棘手问题,传统的日志监控等方式无法很好达到跟踪调用,排查问题等需求。
目前有很多优秀的分布式链路跟踪系统架构可有效针对以上问题,如skywalking、pinpoint、cat及zipkin等。此文章主要针对 skywalking 和 pinpoint 做技术选型对比,并介绍 skywalking 的部署及简单使用。
| 对比内容 | pinpoint | skywalking |
|---|---|---|
| 依赖 | Java 6,7,8 maven3+ Hbase0.94+ | Java 6,7,8 maven3.0+ nodejs zookeeper elasticsearch |
| 实现方式 | java探针,字节码增强 | java探针,字节码增强 |
| 颗粒度 | 方法级 | 方法级 |
| 编程语言 | Java,PHP | Java,C#,PHP,Node.js |
| 页面UI | ***** | **** |
| 存储选择 | Hbase | Elasticsearch,H2,mysql |
| 通信方式 | Thrift | GRPC |
| MQ监控 | 不支持 | RocketMq,Kafka |
| 全局调用统计 | 支持 | 支持 |
| Trace查询 | 不支持 | 支持 |
| 报警 | 支持 | 支持 |
| JVM监控 | 支持 | 支持 |
| 性能损耗 | 高 | 低 |
| 优点 | 完全无侵入, 仅需修改启动方式,界面完善,功能细致。 | 完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。 功能比较完善 |
| 缺点 | 不支持查询单个调用链, 对外表现的是整个应用的调用生态。 二次开发难度较高 | 3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少。 依赖较多 |
| 文档 | 文档完善 | 文档完善 |
| 开发者 | Naver | 吴晟(华为开发者) ,目前已经加入Apache孵化器 |
| 使用公司 | Naver | 华为,alibaba cloud,天源迪科,当当网,京东金融 |
- 在Liunx环境下载
wget https://mirrors.huaweicloud.com/elasticsearch/7.10.1/elasticsearch-7.10.1-linux-x86_64.tar.gz
- 解压文件
tar -zxvf elasticsearch-7.10.1-linux-x86_64.tar.gz
- 赋予文件夹及子文件可执行权限
chmod -R +x elasticsearch-7.10.1
- 创建elasticsearch启动用户(elasticsearch必须使用非ROOT用户启动)
adduser es
- 更改文件夹(elasticsearch-7.10.1)的所属用户
chown -R es elasticsearch-7.10.1
- 赋予用户(es)该文件夹(elasticsearch-7.10.1)的执行权限
chmod -R +x es elasticsearch-7.10.1
- 切换到config目录文件
cd elasticsearch-7.10.1/config/
- 编辑 elasticsearch.yml
cluster.name: elasticsearch node.name: node-1
- 切换到bin目录文件
cd elasticsearch-7.10.1/bin/
- 切换用户(es),使用用户(es)后台启动elasticsearch
su es ./elasticsearch -d
- 访问链接,查看启动效果
curl http://localhost:92002. mysql搭建
- 在Liunx环境下载
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
- 解压文件
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
- 修改目录
mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql-5.7.36
- 赋予文件夹及子文件可执行权限
chmod -R +x mysql-5.7.36
- 添加系统mysql组和mysql用户
groupadd mysql useradd -r -g mysql mysql
- 创建data 和 tmp目录并赋权
cd mysql-5.7.36/ mkdir data tmp chmod -R +x data tmp
- 配置mysql服务
cp support-files/mysql.server /etc/init.d/mysql
- 修改mysql服务
vi /etc/init.d/mysql
- 修改配置文件my.cnf
vi /etc/my.cnf
拷贝内容如下,按需调整参数
[mysqld] #skip-name-resolve #skip-external-locking skip-external-locking #shared-memory # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=/usr/local/dev/mysql/mysql-5.7.36 # 设置mysql数据库的数据的存放目录 datadir=/usr/local/dev/mysql/mysql-5.7.36/data #指定临时文件目录 tmpdir=/usr/local/dev/mysql/mysql-5.7.36/tmp # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password #跳过密码验证 skip-grant-tables user=mysql
- 初始化mysql服务
--initialize--user=mysql --basedir=/usr/local/dev/mysql/mysql-5.7.36 --datadir=/usr/local/dev/mysql/mysql-5.7.36/data
- 启动服务
service mysql start
- 修改mysql密码
mysql -u root -p mysql> use mysql mysql> update user set Update_priv='Y' where user='root'; #这时候我们需要给root以更新的权限 mysql> update user set Grant_priv ='Y' where user ='root'; #然后是设置权限的权限 mysql> flush privileges; #刷新权限 mysql> grant all privileges on *.* to root@'localhost' identified by "123" with grant option; #123是密码 mysql> flush privileges;
- 修改配置文件关闭跳过密码验证
vi /etc/my.cnf
#跳过密码验证 #skip-grant-tables
- 重启mysql,创建数据库
service mysql restart #重启服务 mysql -u root -p #连接mysql Enter password: mysql> create database swtest; #skywalking需要连接的库名3. skywalking 部署
- 在Liunx环境下载
wget https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-es7-8.2.0.tar.gz
- 解压文件
tar -zxvf apache-skywalking-apm-es7-8.1.0.tar.gz
- 赋予文件夹及子文件可执行权限
chmod -R +x apache-skywalking-apm-bin-es7
- 更改文件所属用户组为root 若是默认为root则略过此步骤
chown -R root apache-skywalking-apm-bin-es7 chgrp root apache-skywalking-apm-bin-es7
- 切换config目录文件
cd apache-skywalking-apm-bin-es7/config
- 编辑 application.yml 文件
#以elasticsearch7做存储
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:"elasticsearch"} #同elasticsearch的cluster.name一致
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} #elasticsearch服务器ip:post
#以mysql做存储
storage:
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://192.168.27.129:3306/swtest?useSSL=false"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
numOfSearchablevaluesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}
若是以mysql做存储需要下载mysql驱动包(5.1.48)到 /usr/local/dev/skywalking/apache-skywalking-apm-bin-es7/oap-libs/ 目录下
- 编辑 webapp.yml 文件
vi apache-skywalking-apm-bin-es7/webapp/webapp.yml
server: port: 8080 #可修改访问端口(避免端口冲突)
- 启动skywalking
.oapServiceNoInit.sh:单独启动后台
.webappService.sh:单独启动前台
.startup.sh:前后一起启动
./apache-skywalking-apm-bin-es7/bin/startup.sh
- 查看skywalking监控页面 链接为配置的(skywalking部署服务器的映射ip)ip:post 默认:127.0.0.1:8080
多个监控应用分别将skywalking目录下agent复制至被监听同级目录,并配置修改项目名字、日志打印级别、skywalking的服务地址等配置
agent/config/agent.config配置示例
# 命名空间,用于隔离跨进程传播的header。如果进行了配置,header将为HeaderName:Namespa
agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}
# 展示界面中现实服务名称
agent.service_name=${SW_AGENT_NAME:emr-server}
# 鉴权是否开启取决于后端的配置,可查看application.yml的详细描述。对于大多数的场景,需要后端对鉴权进行扩展。目前仅实现了基本的鉴权功能。
# agent.authentication = ${SW_AGENT_AUTHENTICATION:xxxx}
# 单个线段中的最大跨距量。
# 通过这个配置项,SkyWalking可以估计应用程序内存开销。
# agent.span_limit_per_segment=${SW_AGENT_SPAN_LIMIT:150}
# 如果为true,则SkyWalking代理将在“/debugging”文件夹中保存所有检测到的类文件。
# SkyWalking可能会要求这些文件,以解决兼容问题。
# agent.is_open_debugging_class = ${SW_AGENT_OPEN_DEBUG:true}
# 如果为true,SkyWalking代理将把所有检测到的类文件缓存到内存或磁盘文件中(由类缓存模式决定),
# 允许其他javaagent增强那些由SkyWalking agent增强的类。
# agent.is_cache_enhanced_class = ${SW_AGENT_CACHE_CLASS:false}
# 插入指令的类缓存模式:内存或文件
# 内存:将类字节缓存到内存中,如果插入指令的类太多或太大,则可能会占用更多内存
# 文件:在“/class cache”文件夹中缓存类字节,当应用程序退出时自动清理缓存的类文件
# agent.class_cache_mode = ${SW_AGENT_CLASS_CACHE_MODE:MEMORY}
# 操作名称最大长度
# 注意,在目前的实践中,我们不建议长度超过190。
# agent.operation_name_threshold=${SW_AGENT_OPERATION_NAME_THRESHOLD:150}
# The agent use gRPC plain text in default.
# If true, SkyWalking agent uses TLS even no CA file detected.
# agent.force_tls=${SW_AGENT_FORCE_TLS:false}
# 如果为true,则当用户创建新的配置文件任务时,skywalking代理将启用配置文件。否则禁用配置文件。
# profile.active=${SW_AGENT_PROFILE_ACTIVE:true}
# 并行监视器段计数
# profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5}
# 最大监视段时间(分钟),如果当前段监视时间超出限制,则停止它。
# profile.duration=${SW_AGENT_PROFILE_DURATION:10}
# 最大转储线程堆栈深度
# profile.dump_max_stack_depth=${SW_AGENT_PROFILE_DUMP_MAX_STACK_DEPTH:500}
# 快照传输到后端缓冲区的大小
# profile.snapshot_transport_buffer_size=${SW_AGENT_PROFILE_SNAPSHOT_TRANSPORT_BUFFER_SIZE:0}
# skywalking后端服务地址。
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.27.129:11800}
# 日志文件名
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api-emrServer.log}
# 日志记录级别
logging.level=${SW_LOGGING_LEVEL:INFO}
# 日志文件存储目录
# logging.dir=${SW_LOGGING_DIR:""}
# 日志文件最大值, default: 300 * 1024 * 1024 = 314572800
# logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:314572800}
# 最大历史记录日志文件。当发生滚动时,如果日志文件超过这个数字,
# 然后删除最旧的文件。默认情况下,负数或零表示禁用。
# 如果不限制个数可能到只日志文件过大,磁盘爆满
# logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:-1}
# 忽略异常,有些异常属于业务需要,不用在sw中标示出来
# statuscheck.ignored_exceptions=${SW_STATUSCHECK_IGNORED_EXCEPTIONS:}
# 异常链路的跟踪深度,最好不要高于10,对性能有影响
# statuscheck.max_recursive_depth=${SW_STATUSCHECK_MAX_RECURSIVE_DEPTH:1}
# 增加agent下特定文件夹下的支持插件
plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations,bootstrap-plugins}
# 不加载某些支持插件,名称参考Plugin-list.md
plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:dubbo,motan}
# 忽略指定后缀的请求收集
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
# 每3秒的采样率,负数代表100%
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# 是否获取mysql操作sql的参数
# plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:false}
# Kafka producer configuration
# plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
# 跟踪Spring中的bean,需要耗费更多的资源
plugin.springannotation.classname_match_regex=${SW_SPRINGANNOTATION_CLASSNAME_MATCH_REGEX:}
- 基于Tomcat的服务(SpringMvc)
在tomcat的bin目录下的catalina.sh首行增加如下命令行,例如:
--Tomcat7 添加如下命令 CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/project/project/agent/skywalking-agent.jar" export CATALINA_OPTS --Tomcat8添加如下命令 set JAVA_OPT = -javaagent:usr/local/project/project/agent/skywalking-agent.jar
- 基于JAR file的服务(SpringBoot)
在启动应用程序命令行中添加参数,并确保在-jar参数之前添加它,例如:
java -javaagent:/usr/local/project/emr_server/agent/skywalking-agent.jar -Dskywalking.agent.service_name=emr-server -Dskywalking.collector.backend_service=192.168.27.129:11800 -jar emr_server/hiop.emr.server-1.1.0.jar
- NodeJs接入skywalking
安装 nodejs module
npm install skyapm-nodejs@latest --save
app.js内添加初始化代码
require('skyapm-nodejs').start({
// 应用名称
serviceName: 'hiop-web',
// Skywalking后端暴露的agent_gRPC/grpc service地址
directServers: '192.168.27.129:11800'
});
如果对本篇文章有什么意见或建议,欢迎在评论区交流。



