前言
由于工作需要,前段时间抽口研究了一下APM相关技术。 大的互联网公司都有自己的分布式跟踪系统,比如Google的Dapper,Twitter的zipkin,淘宝的鹰眼,新浪的Watchman,京东的Hydra等,当然还有一些收费的工具。由于技术栈、项目规模以及方便且容易上手的原因,最终还是选择Pinpoint,本文是为了记录Pinpoint详细的搭建过程。
架构图
优点
- 分布式事务跟踪,跟踪跨分布式应用的消息
- 自动检测应用拓扑,帮助你搞清楚应用的架构
- 水平扩展以便支持大规模服务器集群
- 提供代码级别的可见性以便轻松定位失败点和瓶颈
- 代码零侵入,运用JavaAgent字节码增强技术,只需要加启动参数即可
Why
随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络,那现在的问题是一个请求经过了这些服务后其中出现了一个调用失败的问题,只知道有异常,但具体的异常在哪个服务引起的就需要进入每一个服务里面看日志,这样的处理效率是非常低的。
链路跟踪系统的功能
- 故障快速定位
- 各个调用环节的性能分析
- 数据分析等
- 生成服务调用拓扑图
搭建环境
机器 | 安装 | 功能 |
---|---|---|
192.168.1.180(8080,9994,9995,9996) | pinpoint hbase | pinpointweb面板、控制器以及hbase数据库 |
192.168.1.190 | pinpoint-agent 分布式项目 | 采集分布式项目数据,发送给collector |
由于下面使用了Docker环境,相关软件已经上传至映射目录。
工具说明 | |
---|---|
Pinpoint-Web | 将收集到的数据显示成WEB网页形式 |
Pinpoint-Collector | 收集各种性能数据 |
Pinpoint-Agent | 和自己运行的应用关联起来的探针 |
HBase Storage | 收集到的数据存到HBase中 |
hbase_scripts | Pinpoint初始化数据库 |
jdk-1.8 | Java运行环境 |
apache-tomcat-8.0 | Tomcat运行容器 |
HBase脚本介绍
- hbase-create.hbase - 创建pinpoint必须的表。
- hbase-drop.hbase - 删除pinpoint必须的所有表
- hbase-flush-table.hbase - 刷新所有表
- hbase-major-compact-htable.hbase- 压缩主要的所有表
Docker环境
这里,我们使用Docker进行测试,下载一个纯净版的centos:
代码语言:javascript复制docker pull docker.io/centos
创建测试环境:
代码语言:javascript复制docker run -it --name pinpoint -v /home/software/:/mnt/app -p 9901:8080 -p 9994:9994 -p 9995:9995 -p 9996:9996 -p 16010:16010 docker.io/centos
安装JDK
由于oracle官网设置了必须认证才可以下载JDK,这里我们使用事先下载好的JDK8进行安装。
代码语言:javascript复制# 解压
tar -xvf jdk-8u131-linux-x64.tar.gz
# 移动路径
mv jdk1.8.0_131/ /usr/java/jdk1.8
# 配置环境变量
vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# 使生效
source /etc/profile
安装Hbase
解压,并放入指定目录:
代码语言:javascript复制tar -zxvf hbase-1.2.6-bin.tar.gz
mv hbase-1.2.6/ /usr/local/hbase
配置JDK环境变量位置:
代码语言:javascript复制cd /usr/local/hbase/conf/
vi hbase-env.sh
导入以下配置:
代码语言:javascript复制export JAVA_HOME=/usr/java/jdk1.8/
修改Hbase的配置信息:
代码语言:javascript复制vi hbase-site.xml
指定Hbase存储数据路径,建议为宿机目录:
代码语言:javascript复制<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///mnt/app/hbase_data</value>
</property>
</configuration>
最后,启动hbase:
代码语言:javascript复制cd /usr/local/hbase/bin/
./start-hbase.sh
查看Hbase是否启动成功,如果启动成功的会看到"HMaster"的进程:
代码语言:javascript复制[root@c0931ce16a8a bin]# jps
489 Jps
172 HMaster
启动成功以后,我们可以通过以下网址访问:
http://192.168.1.180:16010/master-status
不出意外,应该是这个样子:
初始化Hbase的pinpoint库:
代码语言:javascript复制./hbase shell /mnt/app/hbase_scripts/hbase-create.hbase
代码语言:javascript复制[root@c0931ce16a8a bin]# ./hbase shell /mnt/app/hbase_scripts/hbase-create.hbase
2018-05-09 08:48:25,931 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
0 row(s) in 1.5670 seconds
0 row(s) in 4.2500 seconds
0 row(s) in 4.2440 seconds
0 row(s) in 1.2200 seconds
0 row(s) in 1.2210 seconds
0 row(s) in 1.2220 seconds
0 row(s) in 1.2220 seconds
0 row(s) in 1.2210 seconds
0 row(s) in 1.2260 seconds
0 row(s) in 8.2590 seconds
0 row(s) in 1.2260 seconds
0 row(s) in 2.2270 seconds
0 row(s) in 1.2290 seconds
0 row(s) in 1.2240 seconds
0 row(s) in 2.2340 seconds
TABLE
AgentEvent
AgentInfo
AgentLifeCycle
AgentStatV2
ApiMetaData
ApplicationIndex
ApplicationMapStatisticsCallee_Ver2
ApplicationMapStatisticsCaller_Ver2
ApplicationMapStatisticsSelf_Ver2
ApplicationStatAggre
ApplicationTraceIndex
HostApplicationMap_Ver2
SqlMetaData_Ver2
StringMetaData
TraceV2
15 row(s) in 0.0430 seconds
登录web,来查看HBase的数据是否初始化成功:
安装pinpoint
解压Tomcat8,将Tomcat8移动到指定位置:
代码语言:javascript复制tar -xvf apache-tomcat-8.0.36.tar.gz
mv apache-tomcat-8.0.36 /usr/local/tomcat8
为了方便省事,我们把pinpoint-web 和 pinpoint-collector 都撸进一个Tomcat中:
代码语言:javascript复制mv pinpoint-collector-1.7.2.war /usr/local/tomcat8/webapps/
mv pinpoint-web-1.7.2.war /usr/local/tomcat8/webapps/
# 把web重命名以下
mv pinpoint-web-1.7.2.war pinpoint
启动Tomcat:
代码语言:javascript复制./startup.sh
前面的步骤ok,基本不会出现问题,你也可以查看日志是否启动成功:
代码语言:javascript复制tail -f catalina.out
最后,访问以下地址:
http://192.168.1.180:9901/pinpoint
测试收集
配置Pinpoint-agent
解压Pinpoint-agent:
代码语言:javascript复制tar - xvf pinpoint-agent-1.7.2.tar.gz
配置pinpoint.config:
代码语言:javascript复制# 这是指pinpoint-collector的地址,默认为127.0.0.1,这里修改为以下
profiler.collector.ip=192.168.1.180
这里需要特别注意的是collector的端口一共有3个。
9994是tcp端口9995,9996是udp端口,要保证这些是通的。初始化创建Docker的时候我们已经做了映射。
普通项目部署
修改应用所在tomcat的/bin/catalina.sh:
代码语言:javascript复制# 修改为自己的目录
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/home/software/pinpoint-agent-1.7.2/pinpoint-bootstrap-1.7.2.jar"
# 这里的agentId必须唯一,标志一个jvm
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=myapp"
# applicationName表示同一种应用:同一个应用的不同实例应该使用不同的agentId,相同的applicationName
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=MyTestPP"
保存以后,启动项目即可。
springboot项目部署
代码语言:javascript复制nohup java -javaagent:/home/software/pinpoint-agent-1.7.2/pinpoint-bootstrap-1.7.2.jar -Dpinpoint.agentId=itstyle-myapp -Dpinpoint.applicationName=itstyle-MyTestPP -jar myapp.jar &
效果演示
当然,这只是个空统计,并没有进行测试:
分享一下真实测试场景:
总结
至此,整个环境已经搭建完毕,当然了还有一些大家需要注意的地方
- Hbase使用的是默认自带的zookeeper,你也可以自行安装。
- Dcoker下部署Hbase,切记要把数据放置在宿机,放置数据丢失。
- 创建Docker容器是,记得映射 8080,9994,9995,9996,16010 相关端口,这里为了省事,把Hbase和pinpoint装在了一起。
- 如果zookeeper安装在独立机器上,这里需要修改一下pp-colletor 和 pp-web的配置文件pinpoint-collector.properties,pinpoint-web.properties,不然会导致俩个模块启动失败。
- 思考:官网上说损耗在百分之几,这个还没有详细的测试,网上有人说相对高并发下,性能损失能达到30%~50%之间;也有人说可能是配置参数的问题,待研究。
参考文章
https://github.com/naver/pinpoint
https://skyao.io/learning-pinpoint/installation/quickstart.html
https://cloud.tencent.com/developer/article/1549713
http://www.tangrui.net/2016/zipkin-vs-pinpoint.html