pinpoint是韓國人開源的 APM (Application Performance Management/應用性能管理)工具 - Pinpoint。它基於google Dapper開發,目標就是爲n(n>=1)層架構開發新的跟蹤平臺,爲n層架構的系統提供解決方案。pinpoint能夠對基於java的大規模分佈式系統和應用做調用鏈的跟蹤。pinpoint提供了一個web頁面展示分佈式系統的拓撲圖以及系統這各個組件之間關係。pinpoint 有3個主要組件組成:日誌收集器[Collector]、控制檯[Web]、代理[Agent],採用HBase進行存儲。請結合下文的Pinpoin架構圖來理解各組件之間如何分工合作的。
Pinpoint的特點如下:
- 分佈式事務跟蹤,跟蹤跨分佈式應用的消息
- 自動檢測應用拓撲,幫助你搞清楚應用的架構
- 水平擴展以便支持大規模服務器集羣
- 提供代碼級別的可見性以便輕鬆定位失敗點和瓶頸
- 使用字節碼增強技術,添加新功能而無需修改代碼
- 安裝探針不需要修改哪怕一行代碼及trace server端部署簡單,支持hdfs存儲
- 具有簡單的閥值觸發報警功能
- 移植性比較強的,會比較討人喜歡(相比cat)
- 自定義插件功能(參考https://github.com/naver/pinpoint/wiki/Pinpoint-Plugin-Developer-Guide)
本文的部署方式也適用於最新的1.8.3版。
集羣角色規劃
IP address |
Hostname |
Service |
10.203.11.2 |
cdh-test-1-4 |
zk,nn1,zkfc,hmaster,pp_collector,pp_web |
10.203.11.3 |
cdh-test-1-5 |
zk,nn2,zkfc,hmaster,pp_agent |
10.203.11.4 |
cdh-test-1-1 |
zk,datanode,nm,hrs,jn |
10.203.11.5 |
cdh-test-1-3 |
datanode,nm,hrs,jn |
10.203.11.6 |
cdh-test-1-2 |
datanode,nm,hrs,jn |
Pinpoint collctor採集器和web服務部署在4號機:
pinpoint agent和測試用的項目(tomcat服務)部署在5號機:
Pinpoint部署步驟
1、在cdh-test-1-4主機配JDK、裝hbase、裝Pinpoint的collector和web組件
1.1 系統需要安裝Java環境
從oracle官網下載、安裝jdk-1.8.0後,在/etc/profile文件配置環境變量
export PATH=$PATH:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
export HADOOP_HOME=/tony_soft/hadoop-2.8.4
export HBASE_HOME=/tony_soft/hbase-1.4.9
export ZOOKEEPER_HOME=/tony_soft/zookeeper-3.4.14
使配置生效:source /etc/profile
1.2 安裝Hbase
解壓Hbase放入指定目錄
修改 /hbase/conf/hbase-env.sh 中的JAVA_HOME環境變量位置
export JAVA_HOME=/usr/java/jdk8/
在使用JDK8的情況下, hbase-env.sh中這兩行可以註釋,避免啓動警告。
修改Hbase的配置信息
[hadoop@cdh-test-1-4 ~]$ grep --color -C 3 "hbase.rootdir" $HBASE_HOME/conf/hbase-site.xml
-->
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://tony/hbase</value>
<description>指定hdfs上的HRegionServers共享目錄</description>
</property>
先啓動hbase(我這裏是hbase集羣模式) cd /tony_soft/hbase/bin && ./start-hbase.sh
再初始化Hbase的pinpoint庫: 執行pinpoint提供的Hbase初始化語句用於創建pinpoint所需的表
./hbase shell /home/pp_res/hbase-create.hbase
創建成功後進到hbase shell可看到16張表已建好:
在web UI也能看到HBase的16張表
1.3 安裝部署pinpoint的collector組件
解壓tomcat到指定位置,用於部署pinpoint-collector
cd /home/pp_res/
tar -zxvf apache-tomcat-8.5.40.tar.gz
mv apache-tomcat-8.5.40/ /tony_soft/pp_col
# 修改pp_col的Tomcat配置,修改端口,避免與下面部署的pp_web服務有關端口衝突。
cd /tony_soft/pp_col/conf/
sed -i 's/port="8005"/port="18005"/g' server.xml
sed -i 's/port="8080"/port="18080"/g' server.xml
sed -i 's/port="8443"/port="18443"/g' server.xml
sed -i 's/port="8009"/port="18009"/g' server.xml
sed -i 's/redirectPort="8443"/redirectPort="18443"/g' server.xml
解壓pinpoint的collector的war包
cd /home/pp_res/
rm -rf /tony_soft/pp_col/webapps/* # 清空默認配置
用unzip解壓pinpoint的collector組件:
unzip /tony_soft/pinpoint/resource/pinpoint-collector-1.7.3.war -d /tony_soft/pp_col/webapps/ROOT
(如果沒有unzip,執行yum -y install unzip安裝unzip)
啓動第一個Tomcat服務:cd /tony_soft/pp_col/bin/ && ./startup.sh
成功後可在/tony_soft/pp_col/logs目錄下的 catalina.out看到啓動日誌,查看啓動過程是否出現錯誤
1.4 部署pinpoint的web組件
再次解壓Tomcat後move到指定位置,這個tomcat用於部署pp_web
cd /home/pp_res/
tar -zxvf apache-tomcat-8.5.40.tar.gz
mv apache-tomcat-8.5.40/ /tony_soft/pp_web
# 同樣的,修改一下pp_web有關的端口號
cd /tony_soft/pp_web/conf/
sed -i 's/port="8005"/port="28005"/g' server.xml
sed -i 's/port="8080"/port="28080"/g' server.xml
sed -i 's/port="8443"/port="28443"/g' server.xml
sed -i 's/port="8009"/port="28009"/g' server.xml
sed -i 's/redirectPort="8443"/redirectPort="28443"/g' server.xml
解壓pinpoint web組件的war包
rm -rf /tony_soft/pp_web/webapps/* # 清空默認配置
unzip pinpoint的web組件
[root@cdh-test-1-4 classes]# unzip /tony_soft/pinpoint/resource/pinpoint-web-1.7.3.war -d /tony_soft/pp_web/webapps/ROOT
/tony_soft/pp_web/webapps/ROOT/WEB-INF/classes下的配置文件說明:
- hbase.properties:配置pp_web從哪個數據源獲取採集數據,這裏我只指定Hbase的zk地址(在4號機)
- jdbc.properties :pp_web連接自身Mysql數據庫的連接認證配置文件
- sql目錄 pp_web本身有些數據需要存放在MySQL數據庫中,需初始化表結構(執行兩個.sql腳本即可)
- pinpoint的web組件
- .properties :這裏pp_web集羣的配置文件(如果你需要pp_web集羣)
- applicationContext-* .xml :這些文件在未來調優中會用到
- log4j.xml :日誌相關配置
因爲我要在同一個主機下同時運行兩個Tomcat,需要先幹三件事——
第一件事,先停掉剛纔啓動的collector的tomcat服務,再去配置兩套環境變量:
使這兩組環境變量生效:source /etc/profile
第二件事,server.xml中配置端口不衝突(請參考上文步驟1.3)
第三件事,修改collector組件的Tomcat腳本startup.sh、shutdown.sh,在各自文件末尾都添加這幾行:
export JAVA_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_HOME
export CATALINA_BASE=$CATALINA_BASE
修改web組件的Tomcat的腳本startup.sh、shutdown.sh,在各自文件末尾都添加這幾行:
export JAVA_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_2_HOME
export CATALINA_BASE=$CATALINA_2_BASE
先啓動第一個Tomcat:cd /tony_soft/pp_col/bin/ && ./startup.sh
再啓動第二個Tomcat:cd /tony_soft/pp_web/bin/ && ./startup.sh
同樣的,可以打開catalina.out文件來查看啓動是否完成、啓動過程是否出現錯誤等
pp_col和pp_web啓動完成,可看到相關的端口處於LISTEN狀態,1開頭的端口號是pinpoint collector有關的服務端口,2開頭的是pinpoin web有關的:
去瀏覽器中進行訪問。輸入地址http://${yourIPaddress}:28080 進入PinPoint的Web頁面:
2、在cdh-test-1-5主機上部署測試項目及PinPoint-Agent組件
首先,也要把所需文件放到cdh-test-1-5主機上的的 /tony_soft/pp_test 目錄下,包括pinpoint-agent-1.7.3.tar.gz、jdk、tomcat、test.war
2.1 參考上文1.1的安裝、配置jdk
2.2 部署測試項目
解壓tomcat到指定目錄,用於部署測試項目
[root@cdh-test-1-5]# cd /tony_soft/pp_test
[root@cdh-test-1-5 pp_test]# tar -zxvf apache-tomcat-8.5.40.tar.gz
[root@cdh-test-1-5]# mv apache-tomcat-8.5.40 /tony_soft/pp_test/
從war包部署測試項目
cd /tony_soft/pp_test/
rm -rf /tony_soft/pp_test/webapps/*
[root@cdh-test-1-5 bin]# unzip /tony_soft/test.war -d /tony_soft/pp_test/webapps/ROOT
運行後直接訪問8080端口或者8080/test即可。其中/test是會發生異常的,方便後面的警報功能測試。
在繼續安裝pp_agent開始監控應用之前,做一個小結:
(1)如果Hbase不是和pp-web, pp-col裝在一臺機器,需要安裝zookeeper,只需安裝並確認在監聽2181端口
(2)如果zookeeper安裝在獨立機器上,需修改pp_col 和 pp_web的配置文件pinpoint-collector.properties和pinpoint-web.properties,否則會導致pp_col和pp_web模塊無法啓動
2.3 安裝配置pp_agent
cd /tony_soft/pp_test
mkdir -p /tony_soft/pp_agent
tar -zxvf pinpoint-agent-1.7.3.tar.gz -C /tony_soft/pp_agent
修改/tony_soft/pp_agent/pinpoint.config,把裏面的 profiler.collector.ip 的值改爲裝有pinpoint collector組件的ip地址。
再去修改啓動腳本/tony_soft/pp_test/bin/catalina.sh,通過添加下列三行來添加探針:
這些探針是爲了agent把被監控應用的相關數據發送到collector。三行代碼分別代表:
- pp_agent目錄下 pinpoint-bootstrap-1.7.3.jar包的絕對路徑
- pp_agent的唯一ID,不能與被監控的其他項目相同
- 被採集項目的名稱,pp_web頁面中下拉框選擇項目時顯示的名字
配置好後啓動測試項目
cd /tony_soft/pp_test/bin/ && ./startup.sh
3、Pinpoint的Alarm功能需要MySQL服務
如果要使用Pinpoint的Alarm功能需要MySQL服務支持,否則點擊pp web頁面右上角的齒輪後,其中一些功能(如編輯用戶、用戶組、報警等功能)會出現如圖所示的異常:
所以需要先使用pp_web組件自帶的sql文件創建有關的表
在MYSQL裏面建了兩張表以後,pp_web頁面仍然無法正常顯示User Group,解決辦法請看下文“2019-50-28第三次踩坑記錄”。
最後來看一下pinpoint的架構:
架構中各組件的角色:
pinpoint web UI顯示的內容來自於後端的pinpoint web服務,
pinpoint web服務會去hbase中取數,
collector會把來自於agent的數據採集上來,由collector存入hbase(本案例採用hbase集羣模式,不是單機HBASE)。
Demo展示時,可以把pp collector服務和pp web服務部署在同一個主機上,方便collector接收agent發來的數據後發給web服務,web服務再對hbase讀/寫;agent服務部署在應用端,方便將數據發送給collector。
======2019-05-27第一次踩坑=======
在重啓pp_col和pp_web時出現故障:pp_col能重啓,但是無法啓動pp_web
(1)重啓pp_col、pp_web,pp_col成功重啓、pp_web失敗重啓
(2)重啓pp_web、pp_col,pp_col成功重啓、pp_web失敗重啓
(3)查看相關日誌後發現有is very like to cause memory leak字樣
(4)原因:在4號機上同時啓動pp_col和pp_web服務會導致內存不足,導致了無法同時運行col服務和web服務。那麼改成pp_col在4號機啓動,pp_web在1號機啓動(http端口號是28080),之後發現在瀏覽器訪問28080端口頁面時打不開。原因很有可能是之前只是放行了從外網訪問4號機IP地址的28080端口,而沒有放行從外網訪問1號機IP地址的28080端口。
所以現在改成在4號機啓動pp_web服務,在1號機啓動pp_col服務。需要修改相關的/etc/profile(CATALINA_HOME、CATALINA_BASE環境變量)、/tony_soft/pp_col/conf/server.xml(有關端口)後成功啓動各自的pp_col、pp_web :
測試的項目日誌也表明啓動成功:
======2019-05-28第二次踩坑記錄======
【解決web頁不顯示應用問題】
昨天和今天都被一個問題困擾,就是web頁面不顯示已添加到pp_agent的java應用,下面是解決過程。
第一次嘗試——
先是分別重啓pp_collector、pp_web、pp_agent、pp_test(java應用程序),仍不顯示被agent打了探針的應用, 如截圖:
第二次嘗試——
檢查過各主機的/etc/hosts文件,檢查過主機間的網絡通信,都沒問題。
百思不得其解,再次查看pinpoint架構圖後突然靈光一閃!聯想到pp_web顯示數據的來源是hbase,hbase的數據來源是collector,而collector的數據由agent發來。既然agent已經隨着java的test應用啓動了,那麼agent是否將應用的數據成功發送到collector了呢?如果成功發送了應用的數據,那麼web頁應該顯示已添加的application呀!然後去檢查/tony_soft/pp_agent/pinpoint.config配置文件,發現配置項profiler.collector.ip寫的不是collector所在的IP地址。推測這個錯誤很可能是導致web頁面的application list下拉框不顯示已添加的application原因。改成collector所在主機的IP地址後,依次重啓pp_collector、pp_web服務、pp_agent、pp_test應用,再去查看web頁,證明推測是對的:
到pp_test也就是測試用的java應用的web頁面http://${yourIP}:8080/多訪問幾下,發現hbase的requests數目也大於0了,證實了推測正確:
===========2019-50-28第三次踩坑記錄==========
【web頁面用戶組管理頁問題】
現象——
爲了將來使用Alarm功能對指定用戶提供告警,需要配置用戶和用戶組。在web頁點擊右上角的齒輪後,發現查看User Group時發現錯誤提示,如截圖:
第一次排查——
進到pp_web服務所在的日誌目錄,查看最新的日誌catalina.out,發現有Unknow database ‘pinpoint’字樣:
2019-05-28 14:04:10 [ERROR](c.n.p.w.c.UserGroupController ) Exception occurred while trying to CRUD userGroup information
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Unknown database 'pinpoint')
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:289)
然後檢查$CATALINA_HOME//webapps/ROOT/WEB-INF/classes/jdbc.properties,發現日誌裏提到的庫名沒在mysql中:
原因是之前通過兩個.sql腳本初始化的數據庫表都沒在pinpoint庫名下。於是先到數據庫中創建pinpoint庫:
然後分別重啓pp_web、pp_col、test應用,再到web頁面查看User Group,仍然報錯。
第二次排查——
通過web頁面的User Group嘗試創建用戶,報錯:
再去查看最新的catalina.out日誌,發現有提示說pinpoint下面的puser表不存在:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'pinpoint.puser' doesn't exist
進到mysql shell檢查之前通過pp_web組件自帶的sql文件創建的表,發現puser表不屬於pinpoint庫
解決辦法是把那些表都拷貝到pinpoint庫下面:
拷貝完以後,不用重啓pp_web服務,到web頁面重新查看和操作用戶和用戶組,發現沒有報錯了:
再添加多個用戶以後,能在mysql shell中查看到該用戶了:
添加用戶組:
創建用戶組成功後,將用戶tony_test1添加到組裏:
=========下一步=========
需要加入更多的JAVA應用到pinpoint-agent當中,以便監控java作業運行情況、方便定位應用故障、方便發現應用的性能問題和大數據集羣的性能問題。
例如,在部署了pinpoint-web、pinpoint-collector、hbase集羣、pinpoint-agent的集羣上,如果想要監控一個通過jar包啓動的應用,那麼可以通過下列方式爲應用部署pinpoint-agent探針:
java -javaagent:/tony_soft/pp_agent/pinpoint-bootstrap-1.7.3.jar \
-Dpinpoint.agentId=pp_agentID_2019-05-28 -Dpinpoint.applicationName=monitor-service \
-jar monitor-service-0.0.1-SNAPSHOT.jar
應用啓動後,可以在web頁的應用列表裏看到:
監控其他java應用的做法也是類似的,就是通過在啓動java應用的時候像剛纔那樣添加啓動參數即可,不需要改java應用的代碼。
jar包monitor-service-0.0.1-SNAPSHOT.jar啓動之後,裏面的應用程序會去查mysql數據庫,那麼pinpoint-agent能跟蹤到,但是我的web頁中的拓撲圖沒顯示MySQL組件,如截圖:
但是,點擊頁面的Inspetor按鈕之後,就能在頁面底部Mysql有關信息,如截圖:
【未完, 待續。。。】