5分鐘搭建SkyWalking監控系統
5分鐘搭建SkyWalking監控系統
背景
公司專案採用微服務的架構,服務很多,人工監控是不可能的,專案的訪問量很大,想透過日誌查詢某個方法中效能的問題也是非常困難的。但是系統的效能問題是不能忽視的。目前有幾個比較好的開源APM(Application Performance Management)檢測工具。
常見的監控工具對比
SkyWalking:中國人吳晟(華為)開源的一款分散式追蹤,分析,告警的工具,現在是Apache旗下開源專案,對雲原生支援,目前增長勢頭強勁,社群活躍,中文文件沒有語言障礙。
Zipkin:Twitter公司開源的一個分散式追蹤工具,被Spring Cloud Sleuth整合,使用廣泛而穩定,需要在應用程式中埋點,對程式碼侵入性強
Pinpoint:一個韓國團隊開源的產品,探針收集的資料粒度非常細,但效能損耗大,因其出現的時間較長,完成度很高。
Cat:美團大眾點評開源的一款分散式鏈路追蹤工具。需要在應用程式中埋點,對程式碼侵入性強。
專案不想侵入其他的程式碼,工具儘量損耗效能低,工具的社群活越,文件完善也是考慮的必要條件,經過以下表格部分引數對比,相對來說,SkyWalking更佔優,因此團隊採用SkyWalking作為APM工具。
SkyWalking架構
搭建
本次搭建用ES作為儲存,最開始用H2作記憶體儲存,最後再接入ES,避免環節過多產生不可預知的錯誤
環境介紹:
本教程採用虛擬機器(CentOS7) + docker的方式搭建,這樣的好處是用docker容器分離各個容器,快速方便的模擬生產環境。
建立網路
docker network create ——subnet=172。18。0。0/16 mynet
建立容器,有三個角色,一個是SkyWalking AOP(監控資料收集),另一個和是ES(資料儲存),還有一個是Java WEB(被監控)
# SkyWalking APM
docker run -dit ——net mynet ——ip 172。18。0。30 -p 8090:8090 ——name sw ——privileged centos /usr/sbin/init
# Java App
docker run -dit ——net mynet ——ip 172。18。0。31 -p 8080:8080 ——name javaApp ——privileged centos /usr/sbin/init
# ES
docker run -dit ——net mynet ——ip 172。18。0。32 ——name es1 ——privileged centos /usr/sbin/init
安裝Java環境
由於ES和SkyWalking 都需要Java環境,所以安裝Java提出來放到最前面
# 安裝java
yum -y install java-1。8。0-openjdk java-1。8。0-openjdk-devel which
# 環境變數設定
cat > /etc/profile。d/java8。sh
< export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac))))) export PATH=\$PATH:\$JAVA_HOME/bin export CLASSPATH=。:\$JAVA_HOME/jre/lib:\$JAVA_HOME/lib:\$JAVA_HOME/lib/tools。jar EOF source /etc/profile。d/java8。sh 安裝SkyWalking OAP SkyWalking OAP 即架構圖中的下部分 SkyWalking Observability Analysis Platform ,如下圖所示 本次下載安裝的是 apache-skywalking-apm-es7-8。3。0。tar。gz ,其他版本請參考: http:// skywalking。apache。org/d ownloads/ 注意安裝之前一點要先安裝Java環境,否則啟動不成功但是啟動指令碼還是會顯示啟動成功。 yum install -y wget vim telnet cd ~ # 下載 wget https://downloads。apache。org/skywalking/8。3。0/apache-skywalking-apm-es7-8。3。0。tar。gz # 解壓 tar xf apache-skywalking-apm-es7-8。3。0。tar。gz -C /usr/local mv /usr/local/apache-skywalking-apm-bin-es7 /usr/local/skywalking-8。3。0 啟動OAP # 啟動OAP /usr/local/skywalking-8。3。0/bin/oapService。sh # 檢視日誌 tail -f /usr/local/skywalking-8。3。0/logs/skywalking-oap-server。log 檢視OAP監聽埠 grep ‘gRPCPort:’ /usr/local/skywalking-8。3。0/config/application。yml gRPCPort: ${ SW_CORE_GRPC_PORT : 11800 } gRPCPort: ${ SW_RECEIVER_GRPC_PORT : 0 } gRPCPort: ${ SW_RECEIVER_JAEGER_PORT : 14250 } 可以看到SkyWalking OAP預設監聽埠為11800,測試下埠是否通 telnet 127。0。0。1 11800 # 出現下面回顯說明埠通 Trying 127。0。0。1。。。 Connected to 127。0。0。1。 Escape character is ‘^]’ 。 啟動SkyWalking UI vim /usr/local/skywalking-8。3。0/webapp/webapp。yml SkyWalking UI預設埠為8080與很多中介軟體有衝突,改成其他的,本例為8090 server: port: 8090 啟動 # 啟動UI /usr/local/skywalking-8。3。0/bin/webappService。sh 訪問一下http://192。168。108。100:8090,如果能訪問,說明啟動成功 開啟SkyWalking Agent 所謂Agent是指SkyWalking從各個平臺(Java Python等)收集監控資料的代理,此處我們以為Java應用(Spring boot)為例,收集Java應用產生的各種監控資料 準備一個Jar包 隨便準備個Jar包能跑的就行,此處我的jar名字為 admin-2。0。1。RELEASE。jar 配置SkyWalking Java端的Agent Agent需要複製一份到收集的機器上,有多少臺機器就要複製多少次,此處我們用的docker容器所以需要複製到宿主機再複製到跑javaWeb的機器 # 複製agent到宿主機 docker cp sw:/usr/local/skywalking-8。3。0/agent /tmp # 再從宿主機複製到目標容器 docker cp /tmp/agent/ javaApp:/root/javaApp/agent 配置Agent vim /root/javaApp/agent/config/agent。config backend_service設定成OAP的ip和埠 sample_n_per_3_secs表示每3秒取樣一樣,配置說明:在訪問量較少時,鏈路全量收集不會對系統帶來太大負擔,能夠完整的觀測到系統的執行狀況。但是在訪問量較大時,全量的鏈路收集,對鏈路收集的客戶端(agent探針)、服務端(SkyWalking OAP)、儲存器(例如說 Elastcsearch)都會帶來較大的效能開銷,甚至會影響應用的正常執行。在訪問量級較大的情況下,往往會選擇抽樣取樣,只收集部分鏈路資訊。SkyWalking Agent 在 agent/config/agent。config 配置檔案中,定義了 agent。sample_n_per_3_secs 配置項,設定每 3 秒可收集的鏈路資料的數量。 collector。backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172。18。0。30:11800} agent。sample_n_per_3_secs=${SW_AGENT_SAMPLE:1} 執行jar包,指定 -javaagent 與 skywalking。agent。service_name ,後者就是SkyWalking UI上顯示的名字 nohup java -javaagent:/root/javaApp/agent/skywalking-agent。jar -Dskywalking。agent。service_name = admin -jar admin-2。0。1。RELEASE。jar > admin。log 2> & 1 & 效果檢視 儀表盤 拓撲圖 鏈路追蹤 安裝ES h2只是一個記憶體儲存系統,其目的是為了讓你能夠快速驗證快速響應,它還沒有強大到足以支撐線上系統執行。所以,線上一定得選用某個更可靠儲存。 一般地,ES會是個不錯的選擇,一來它以搜尋速度著稱而這正好符合後臺查詢的需求,二來es是分散式儲存,可以避免一定的大資料量問題。 參考: 安裝並執行 Elasticsearch 首先進入容器 docker exec -it es1 bash 常用工具安裝 yum install -y wget 在Download Elasticsearch選擇合適的平臺下載好包,我下載的是 elasticsearch-7。10。1-linux-x86_64。tar。gz # 下載 cd ~ && wget https://artifacts。elastic。co/downloads/elasticsearch/elasticsearch-7。10。1-linux-x86_64。tar。gz # 解壓 tar -zxvf elasticsearch-7。10。1-linux-x86_64。tar。gz # 複製 cp -r elasticsearch-7。10。1 /usr/local/ # 執行 /usr/local/elasticsearch-7。10。1/bin/elasticsearch 執行後此時你會得到一個報錯: java。lang。RuntimeException: can not run elasticsearch as root 原因很明顯,不能用root執行,那麼新建使用者再執行 # 新建使用者 adduser elasticsearch # 賦權 chown -R elasticsearch /usr/local/elasticsearch-7。10。1 # 切換使用者再執行 su elasticsearch /usr/local/elasticsearch-7。10。1/bin/elasticsearch # 後臺執行 /usr/local/elasticsearch-7。10。1/bin/elasticsearch -d 測試,如果 curl 127。0。0。1:9200 有類似以下回顯說明成功 { “name” : “74e37036a2ee” , “cluster_name” : “elasticsearch” , “cluster_uuid” : “L8xK0ZqZSUKn3dZ05NJfcg” , “version” : { “number” : “7。10。1” , “build_flavor” : “default” , “build_type” : “tar” , “build_hash” : “1c34507e66d7db1211f66f3513706fdf548736aa” , “build_date” : “2020-12-05T01:00:33。671820Z” , “build_snapshot” : false , “lucene_version” : “8。7。0” , “minimum_wire_compatibility_version” : “6。8。0” , “minimum_index_compatibility_version” : “6。0。0-beta1” }, “tagline” : “You Know, for Search” } 修改配置檔案及問題排查 此時發現只能用127。0。0。1訪問,不能用 curl 172。18。0。32:9200 訪問,因為沒設定 network。host ,下面設定一下,順便加上允許跨域的設定 http。cors。enabled 、 http。cors。allow-origin , sed -i ‘$a內容’ file 是在檔案末尾追加 sed -i ‘$ahttp。cors。enabled: true’ /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml sed -i ‘$ahttp。cors。allow-origin: “*”’ /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml sed -i ‘$anetwork。host: 172。18。0。32’ /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml 此時啟動es,發現啟動失敗,報錯如下: [2021-01-13T13:46:30,780][INFO ][o。e。t。TransportService ] [a622d8352de5] publish_address {172。18。0。12:9300}, bound_addresses {172。18。0。12:9300} [2021-01-13T13:46:31,039][INFO ][o。e。b。BootstrapChecks ] [a622d8352de5] bound or publishing to a non-loopback address, enforcing bootstrap checks [2021-01-13T13:46:31,066][ERROR][o。e。b。Bootstrap ] [a622d8352de5] node validation exception [2] bootstrap checks failed [1]: max virtual memory areas vm。max_map_count [65530] is too low, increase to at least [262144] [2]: the default discovery settings are unsuitable for production use; at least one of [discovery。seed_hosts, discovery。seed_providers, cluster。initial_master_nodes] must be configured [2021-01-13T13:46:31,069][INFO ][o。e。n。Node ] [a622d8352de5] stopping 。。。 [2021-01-13T13:46:31,094][INFO ][o。e。n。Node ] [a622d8352de5] stopped [2021-01-13T13:46:31,095][INFO ][o。e。n。Node ] [a622d8352de5] closing 。。。 [2021-01-13T13:46:31,116][INFO ][o。e。n。Node ] [a622d8352de5] closed [2021-01-13T13:46:31,119][INFO ][o。e。x。m。p。NativeController] [a622d8352de5] Native controller process has stopped - no new native processes can be started 注意看這句話:bound or publishing to a non-loopback address, enforcing bootstrap checks,繫結的不是本地迴環介面,強制進行啟動檢查,es認為繫結的不是127。0。0。1就是要用於生產環境,所以要啟動一下適用於生產環境的強制性檢查,檢查出不適合的條件就不讓啟動!所需需要修改如下錯誤: [1]: max virtual memory areas vm。max_map_count [65530] is too low, increase to at least [262144] [2]: the default discovery settings are unsuitable for production use; at least one of [discovery。seed_hosts, discovery。seed_providers, cluster。initial_master_nodes] must be configured [1] # 切換到root使用者執行 sed -i ‘$avm。max_map_count=262144’ /etc/sysctl。conf sysctl -p [2] # 追加這句配置 sed -i ‘$adiscovery。seed_hosts: [“172。18。0。32”]’ /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml [3] # 配置叢集名稱,後面OAP要用 sed -i ‘$acluster。name: my-application’ /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml 此時再次啟動就不會報錯了,如果還是報錯,請根據es的報錯提示進行更改 試一下用本機IP能訪問不: curl 172。18。0。32:9200 配置SkyWalking OAP接入ES vim /usr/local/skywalking-8。3。0/config/application。yml 主要配置storage,selector可以選擇,配置了要選定才生效,主要配置nameSpace和clusterNodes這兩個選項 nameSpace就是ES中配置的cluster。name,一定要一致 clusterNodes即為ES叢集的IP埠 storage: selector: ${SW_STORAGE:elasticsearch7} elasticsearch7: nameSpace: ${SW_NAMESPACE:“my-application”} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172。18。0。32:9200} indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes 啟動OAP # 啟動OAP /usr/local/skywalking-8。3。0/bin/oapService。sh # 檢視日誌 tail -f /usr/local/skywalking-8。3。0/logs/skywalking-oap-server。log SkyWalking OAP接入ES 問題排查 啟動後發現SkyWalking OAP報錯如下: 2021-01-23 08:12:58,935 - org。apache。skywalking。oap。server。starter。OAPServerBootstrap - 57 [main] ERROR [] - method [HEAD], host [http://172。18。0。32:9200], URI [/_template/my-application_alarm_record?master_timeout=30s], status line [HTTP/1。1 503 Service Unavailable] org。elasticsearch。ElasticsearchStatusException: method [HEAD], host [http://172。18。0。32:9200], URI [/_template/my-application_alarm_record?master_timeout=30s], status line [HTTP/1。1 503 Service Unavailable] at org。elasticsearch。client。RestHighLevelClient。parseResponseException(RestHighLevelClient。java:1767) ~[elasticsearch-rest-high-level-client-7。5。0。jar:7。5。0] 去看了下ES後臺,也報錯了 org。elasticsearch。discovery。MasterNotDiscoveredException: null at org。elasticsearch。action。support。master。TransportMasterNodeAction$AsyncSingleAction$2。onTimeout(TransportMasterNodeAction。java:230) [elasticsearch-7。10。1。jar:7。10。1] at org。elasticsearch。cluster。ClusterStateObserver$ContextPreservingListener。onTimeout(ClusterStateObserver。java:335) [elasticsearch-7。10。1。jar:7。10。1] 而且ES一直在提醒如下內容 [2021-01-23T08:25:07,993][WARN ][o。e。c。c。ClusterFormationFailureHelper] [3546a7854be2] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [master] to bootstrap a cluster: have discovered 這是ES主節點配置有問題,現在我們就一臺ES,所以配置這臺為主節點,加入如下配置 vi /usr/local/elasticsearch-7。10。1/config/elasticsearch。yml node。name: node-1 cluster。initial_master_nodes: [ “node-1” ] 再次依次重新啟動ES和OAP就沒有問題了 參考
下一篇:毛孔粗大怎麼改善捏?