天天看點

鍊路追蹤skywalking

elasticsearch  官網  https://www.elastic.co/cn/

elasticsearch 下載下傳位址  https://www.elastic.co/cn/downloads/elasticsearch

skywalking 官網  http://skywalking.apache.org/

一 elasticsearch 安裝  

此處,我安裝的是 6.8.6 , 注意:es7 和 skywalking6 會有相容問題,啟動skywalking背景會失敗,且報錯:空指針

Elasticsearch 是一個分布式、RESTful 風格的搜尋和資料分析引擎,能夠解決不斷湧現出的各種用例。 作為 Elastic Stack 的核心,它集中存儲您的資料,幫助您發現意料之中以及意料之外的情況。

1. elasticsearch 下載下傳安裝

進入官網下載下傳位址,找到linux 版本,下載下傳 .tar.gz 壓縮包并解壓

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.6.tar.gz
tar -zxvf elasticsearch-6.8.6.tar.gz -C /usr/local/
cd /usr/local/elasticsearch-6.8.6/
           

vim /etc/profle  添加如下内容(根據官網說法必須要配 $ES_HOME, 實測發現不配也沒影響):

export ES_HOME=/usr/local/elasticsearch-6.8.6
           

添加完後 source /etc/profile

[[email protected] ~]# source /etc/profile
           

2. 建立普通使用者并啟動

啟動 elasticsearch 不能使用root使用者,否則啟動時報錯。

Caused by: java.lang.RuntimeException: can not run elasticsearch as root

建立普通使用者 

ElasticSerach要求以非root身份啟動,是以我們要建立一個使用者:

1>. 建立使用者組: groupadd devops           

2>. 建立使用者wudi加入使用者組: useradd wudi -g devops               (-g 後面跟的是使用者組)

鍊路追蹤skywalking

3>. 設定elasticSearch檔案夾為使用者wudi所有:chown -R wudi:devops /usr/local/elasticsearch-6.8.6/          (wudi:devops ---> OWNER:GROUP)

啟動elasticsearch -- 必須切換到普通使用者

su wudi

/usr/local/elasticsearch-6.8.6/bin/elasticsearch  前台啟動(不推薦,關閉視窗,服務會停止)

/usr/local/elasticsearch-6.8.6/bin/elasticsearch -d  背景啟動 (推薦)

如果使用elasticsearch 7啟動,有可能報 java版本低,需要java11,不用管 。建議用elasticsearch 6, 因為7會有各種問題,使用7,skywalking後端會啟動失敗,報空指針
鍊路追蹤skywalking
檢視程序,你會發現,elasticsearch 已經使用 java1.8 啟起來了(需要/etc/profile配置的有java環境變量 JAVA_HOME)
鍊路追蹤skywalking

啟動後,netstat -tlnp 會發現多了個9200 和 9300 端口

9200 端口 用于外部通訊,基于http協定

9300 端口 用于es叢集節點之間通信,遵循tcp協定,通過tcp協定通信

檢視日志指令: tail -f /usr/local/elasticsearch-6.8.6/logs/elasticsearch.log 

啟動 elasticsearch 後 檢查服務是否正常響應 curl 127.0.0.1:9200

如果想更改配置,比如端口等  對應配置檔案 elasticsearch-6.8.6/config/elasticsearch.yml

elasticsearch 的 jvm參數可在 /usr/local/elasticsearch-6.8.6/config/jvm.options 中修改

至此,ElasticSearch服務啟動成功.

此時 elasticsearch 9200端口隻能供本機通路

[[email protected] ~]$ curl 127.0.0.1:9200
{
  "name" : "rE2m-B5",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "7iZde3zTTR-JDHZZijzm7g",
  "version" : {
    "number" : "6.8.6",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "3d9f765",
    "build_date" : "2019-12-13T17:11:52.013738Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.2",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
[[email protected] ~]$ 
           

要想和skywalking配合使用還需要對 elasticsearch 進行配置

對應配置檔案 elasticsearch-6.8.6/config/elasticsearch.yml

預設 elasticsearch-6.8.6/config/elasticsearch.yml 配置檔案中的内容是全部注釋的。我們接下來進行如下設定

cluster.name: production-application

node.name: production-node-1

# 首次啟動會自動生成data目錄
path.data: /usr/local/elasticsearch-6.8.6/data
path.logs: /usr/local/elasticsearch-6.8.6/logs


bootstrap.memory_lock: false
bootstrap.system_call_filter: false

network.host: 192.168.158.130
http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.158.130"]
discovery.zen.minimum_master_nodes: 1
           

切記,cluster.name 名字要與 skywalking 中配置的一緻。

比如 , Set the bind address to a specific IP (IPv4 or IPv6):

network.host: 192.168.158.130                              # 注意,中間有個空格

鍊路追蹤skywalking

3. tail -f logs/production-application.log 遇到的警告或報錯:

報錯1:

Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file logs/gc.log due to No such file or directory

解決方案:

以wudi使用者建立gc.log

touch /usr/local/elasticsearch-6.8.6/logs/gc.log

報錯2:

max number of threads [3802] for user [wudi] is too low, increase to at least [4096]

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

[2]: max number of threads [3802] for user [wudi] is too low, increase to at least [4096]

解釋:

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]  意為:

每個程序最大同時打開檔案數太小,最大才4096

[2]: max number of threads [3802] for user [wudi] is too low, increase to at least [4096]  意為:

wudi 使用者的 最大使用者程序數太小,最大才3802 

查詢wudi 使用者和 root 使用者 ,每個程序最大同時打開檔案數的大小,可通過下面兩個指令檢視目前數量

ulimit -Hn
ulimit -Sn
           

wudi使用者

[[email protected] elasticsearch-6.8.6]$ ulimit -Hn
4096
[[email protected] elasticsearch-6.8.6]$ ulimit -Sn
1024
[[email protected] elasticsearch-6.8.6]$ ulimit -u
3802
           

root使用者

[[email protected] ~]# ulimit -Hn
4096
[[email protected] ~]# ulimit -Sn
1024
[[email protected] ~]# ulimit -u
3802
           

查詢 wudi 使用者 和root 使用者 的 最大使用者程序

wudi使用者

[[email protected] elasticsearch-6.8.6]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3802
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3802
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[[email protected] elasticsearch-6.8.6]$
           

可知,wudi 使用者,最大使用者程序為 3802 (也可切換到wudi使用者,ulimit -u 檢視)

root使用者

[[email protected] ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3802
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3802
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[[email protected] ~]#
           

可知,root 使用者,最大使用者程序為 3802  (也可直接 ulimit -u  檢視)

解決方案:

切換到root使用者,編輯 /etc/security/limits.conf 檔案,vim /etc/security/limits.conf,(/etc/security/limits.conf 檔案内容預設是全注釋了的)增加如下配置,使用者退出後重新登入生效

# 檔案描述符大小
root soft nofile 65535
root hard nofile 65535
* soft nofile 165535
* hard nofile 165535

# 使用者最大程序數修改
wudi soft nproc 4096
wudi hard nproc 4096
* soft nproc 8000
* hard nproc 8000
           

注意:

1:檢視現在的檔案描述符大小和使用者最大程序數

檢視全部

# ulimit -a

檢視檔案描述符大小,即最大打開的檔案數

# ulimit -n

檢視使用者最大程序數大小

# ulimit -u

2: 解釋

soft nofile:   可打開的檔案描述符的最大數(軟限制)

hard nofile:  可打開的檔案描述符的最大數 (硬限制)

soft nproc:   單個使用者可用的最大程序數量(軟限制)

hard nproc:  單個使用者可用的最大程序數量(硬限制)

*  :代表所有使用者(已明确指定的使用者除外後的其他所有使用者),也可以寫成你需要修改的使用者名

修改完配置檔案後不需要重新開機,但是要使用者退出重新登入才能生效。

wudi使用者

鍊路追蹤skywalking

root使用者

鍊路追蹤skywalking

報錯3:

[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解決方案:

檢視max_map_count值:more /proc/sys/vm/max_map_count

eg:

[[email protected] ~]# more /proc/sys/vm/max_map_count 
65530
           

使用 root 使用者執行以下指令:

修改 /etc/sysctl.conf 檔案(預設檔案内容是全部注釋了的),vim /etc/sysctl.conf  增加配置  

vm.max_map_count=262144
           

如圖:

鍊路追蹤skywalking

然後,執行  sysctl -p   指令使生效

如圖:

鍊路追蹤skywalking

此時,無論使用root使用者還是wudi使用者,檢視max_map_count 的值都已經變為了 262144

鍊路追蹤skywalking
鍊路追蹤skywalking

注意:

在 /etc/sysctl.conf 檔案中,其實還可以添加以下配置進行優化:sysctl中網絡的配置
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 262144
net.netfilter.nf_conntrack_max = 1048576
           
注意,需要執行  sysctl -p   指令使生效。
鍊路追蹤skywalking

報錯4:

在解決以上各種報錯後,啟動時報錯:

org.elasticsearch.transport.RemoteTransportException: [production-node-1][192.168.158.130:9300][internal:cluster/coordination/join]

Caused by: org.elasticsearch.cluster.coordination.CoordinationStateRejectedException: incoming term 1 does not match current term 2

原因:

該節點之前已經啟動過,有曆史資料沒有清理

解決方案:

檢視 config/elasticsearch.yml檔案中配置的path.data目錄,進入該目錄并删除。重新啟動即可。

--------------------------------------------------------------

二 skywalking安裝部署

1. skywaking 下載下傳安裝

wget http://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-6.6.0.tar.gz
tar -zxvf apache-skywalking-apm-6.6.0.tar.gz -C /usr/local/
cd /usr/local/apache-skywalking-apm-bin/
           

2. 配置修改

vim apache-skywalking-apm-bin/config/application.yml  ,主要修改以下子產品的配置:

核心子產品core主要修改以下配置:

core:
  default:
    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
    # Receiver: Receive agent data, Level 1 aggregate
    # Aggregator: Level 2 aggregate
    role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
    #restHost: ${SW_CORE_REST_HOST:0.0.0.0}
    restHost: 192.168.158.130
    #restPort: ${SW_CORE_REST_PORT:12800}
    restPort: 12800
    #restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
    restContextPath: /
    #gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
    gRPCHost: 192.168.158.130
    #gRPCPort: ${SW_CORE_GRPC_PORT:11800}
    gRPCPort: 11800
    downsampling:
      - Hour
      - Day
      - Month
           

資料存儲子產品storage 主要修改以下配置(預設使用h2存儲資料,此處我改為使用elasticsearch存儲資料,注意:需要把h2的配置全注釋掉):

storage:
  elasticsearch:
#    nameSpace: ${SW_NAMESPACE:""}
     nameSpace: production-application
#    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
     clusterNodes: 192.168.158.130:9200
#    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
#    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
#    user: ${SW_ES_USER:""}
#    password: ${SW_ES_PASSWORD:""}
#    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
     indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
#    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
     indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}

...................

#  h2:
#    driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
#    url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
#    user: ${SW_STORAGE_H2_USER:sa}
#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}

...................
           

3. 前端UI 配置修改

編輯webapp/ webapp.yml檔案,vim apache-skywalking-apm-bin/webapp/webapp.yml  修改如下:

server:
  port: 8080

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 10000
    # Point to all backend's restHost:restPort, split by ,
    listOfServers: 127.0.0.1:12800
           

改成

server:
  port: 9090

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 50000
    # Point to all backend's restHost:restPort, split by ,
    listOfServers: 192.168.158.130:12800
           

4. 啟動執行

/usr/local/apache-skywalking-apm-bin/bin/startup.sh    (windows啟動  bin/startup.bat)

(備注預設端口是8080, 如需修改端口可如下操作,如需修改,可在/usr/local/apache-skywalking-apm-bin/webapp/webapp.yml 檔案中修改)

starup.sh 會同時啟動skywalking 前端和後端。

也可以分開啟動:

啟動前端    apache-skywalking-apm-bin/bin/webappService.sh

啟動後端    apache-skywalking-apm-bin/bin/oapService.sh

首次啟動會進行初始化,往es 中建立所需庫表。

通路 192.168.158.130:9090 即可登入到 skywalking 的 UI 界面:

鍊路追蹤skywalking

三 配置 skywalking 用戶端

在 解壓後apache-skywalking-apm-bin 中有一個agent檔案夾,該檔案夾即為skywalking的用戶端

鍊路追蹤skywalking

設定skywalking用戶端配置,vim  apache-skywalking-apm-bin/agent/config/agent.config    設定如下

#agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
agent.service_name=production-application

# collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.158.130:11800}


# Logging file_name
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}   # 保持該預設值即可

# Logging level
logging.level=${SW_LOGGING_LEVEL:DEBUG}     # 保持該預設值即可
           

修改完後,可以将 apache-skywalking-apm-bin/agent  壓縮一下傳輸到用戶端伺服器上。

3.1 jar檔案 應用配置 skywalking 用戶端

在啟動應用的指令行添加  -javaagent 參數

nohup java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar &
           

比如,重新開機腳本 restart.sh  内容配置如下:

#!/bin/bash
ps aux | grep trace-provider-1.0.0.jar |grep -v grep|cut -c 9-15|xargs kill
echo "==================關閉完畢!=========================="

echo "---------------開始啟動jar服務-------------------------"
cd /home/work/trace-provider
nohup java -javaagent:/home/application/agent/skywalking-agent.jar -jar trace-provider-1.0.0.jar &
           

3.2 tomcat 應用配置 skywalking 用戶端

編輯 tomcat/bin/catalina.sh

首行添加如下代碼

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/home/work/skywalking-agent/skywalking-agent.jar"
           

繼續閱讀