您當前的位置:首頁 > 收藏

5分鐘搭建SkyWalking監控系統

作者:由 程式碼狂魔 發表于 收藏時間:2021-01-24

5分鐘搭建SkyWalking監控系統

背景

公司專案採用微服務的架構,服務很多,人工監控是不可能的,專案的訪問量很大,想透過日誌查詢某個方法中效能的問題也是非常困難的。但是系統的效能問題是不能忽視的。目前有幾個比較好的開源APM(Application Performance Management)檢測工具。

常見的監控工具對比

SkyWalking:中國人吳晟(華為)開源的一款分散式追蹤,分析,告警的工具,現在是Apache旗下開源專案,對雲原生支援,目前增長勢頭強勁,社群活躍,中文文件沒有語言障礙。

Zipkin:Twitter公司開源的一個分散式追蹤工具,被Spring Cloud Sleuth整合,使用廣泛而穩定,需要在應用程式中埋點,對程式碼侵入性強

Pinpoint:一個韓國團隊開源的產品,探針收集的資料粒度非常細,但效能損耗大,因其出現的時間較長,完成度很高。

Cat:美團大眾點評開源的一款分散式鏈路追蹤工具。需要在應用程式中埋點,對程式碼侵入性強。

專案不想侵入其他的程式碼,工具儘量損耗效能低,工具的社群活越,文件完善也是考慮的必要條件,經過以下表格部分引數對比,相對來說,SkyWalking更佔優,因此團隊採用SkyWalking作為APM工具。

5分鐘搭建SkyWalking監控系統

SkyWalking架構

5分鐘搭建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

,如下圖所示

5分鐘搭建SkyWalking監控系統

本次下載安裝的是

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,如果能訪問,說明啟動成功

5分鐘搭建SkyWalking監控系統

開啟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

&

效果檢視

儀表盤

5分鐘搭建SkyWalking監控系統

拓撲圖

5分鐘搭建SkyWalking監控系統

鏈路追蹤

5分鐘搭建SkyWalking監控系統

安裝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就沒有問題了

參考

標簽: Elasticsearch  usr  local  SkyWalking