天天看点

链路追踪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"
           

继续阅读