背景介紹
隨著業務越來越復雜,企業應用也進入了分布式服務化的階段,隨著模塊的不斷增多,一次請求可能會涉及到十幾個甚至幾十個服務的協同處理,那么如何準確快速的定位到線上故障和性能瓶頸,便成為我們不得不面對的棘手問題,傳統的日志監控等方式無法很好達到跟蹤呼叫,排查問題等需求,
目前有很多優秀的分布式鏈路跟蹤系統架構可有效針對以上問題,如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,天源迪科,當當網,京東金融 |
skywalking搭建
1. elasticsearch搭建(資料源,elasticsearch和mysql選一種即可)
- 在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:9200
2. 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

4. 探針配置(Agent)
多個監控應用分別將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'
});
如果對本篇文章有什么意見或建議,歡迎在評論區交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345681.html
標籤:其他
