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
[root@nginx ~]# 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 后面跟的是用户组)
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后端会启动失败,报空指针
查看进程,你会发现,elasticsearch 已经使用 java1.8 启起来了(需要/etc/profile配置的有java环境变量 JAVA_HOME)
启动后,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端口只能供本机访问
[wudi@nginx ~]$ 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"
}
[wudi@nginx ~]$
要想和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 # 注意,中间有个空格
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用户
[wudi@nginx elasticsearch-6.8.6]$ ulimit -Hn
4096
[wudi@nginx elasticsearch-6.8.6]$ ulimit -Sn
1024
[wudi@nginx elasticsearch-6.8.6]$ ulimit -u
3802
root用户
[root@nginx ~]# ulimit -Hn
4096
[root@nginx ~]# ulimit -Sn
1024
[root@nginx ~]# ulimit -u
3802
查询 wudi 用户 和root 用户 的 最大用户进程
wudi用户
[wudi@nginx 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
[wudi@nginx elasticsearch-6.8.6]$
可知,wudi 用户,最大用户进程为 3802 (也可切换到wudi用户,ulimit -u 查看)
root用户
[root@nginx ~]# 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
[root@nginx ~]#
可知,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用户
root用户
报错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:
[root@nginx ~]# more /proc/sys/vm/max_map_count
65530
使用 root 用户执行以下命令:
修改 /etc/sysctl.conf 文件(默认文件内容是全部注释了的),vim /etc/sysctl.conf 增加配置
vm.max_map_count=262144
如图:
然后,执行 sysctl -p 命令使生效
如图:
此时,无论使用root用户还是wudi用户,查看max_map_count 的值都已经变为了 262144
注意:
在 /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 命令使生效。
报错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 客户端
在 解压后apache-skywalking-apm-bin 中有一个agent文件夹,该文件夹即为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"