赞
踩
ELK是Elasticsearch、Logstash、Kibana的简称,这三者都是开源软件,通常配合使用
Elasticsearch -->存储数据
是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用Java语言编写,能对大容量的数据进行接近实时的存储、搜索和分析操作。
Logstash --> 收集数据
数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。
Kibana --> 展示数据
数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。
日志从生成到展示的流程
后端项目(生成日志)–>Logstash(负责收集日志)–> Elasticsearch(将日志插入es储存)–> Kibana(通过界面展示日志)
以下安装所需要的软件都在以下链接中:
链接:https://pan.baidu.com/s/1Ejfrx8dajNQ03Sz9OeNgMw
提取码:x51n
这个不再多说,不清楚具体怎么安装的,网上有很多教程。
将下载的JDK安装包上传至服务器/data/software目录,然后rpm直接安装JDK:
rpm -ivh /data/software/jdk-8u371-linux-x64.rpm
安装完成后 java -version //查看JDK版本号
如果没有显示版本信息,去/etc/profile 文件中配置下java环境变量
如果,当前机器已经安装过jdk,也可以跳过。
除了,上面的rpm安装方式,还可以选择.tar.gz的解压缩方式即免安装版本。使用tar -zxvf 包名.tar.gz。然后配置下jdk环境变量。
通过source /etc/profile 使修改的配置立即生效。
链接:https://pan.baidu.com/s/1-L3uLLJs-leR7pv2t9fRjA
提取码:d7de
通过上面的百度地址下载后,上传到/data/software目录下。
或者在cd /data/software 到此目录下。
执行
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.tar.gz
解压安装包到/data目录下。
tar -zxvf elasticsearch-6.8.10.tar.gz -C /data
注意:默认是解压到当前目录,可选项 -C ,使用 -C 目录指定解压后的文件夹所在的位置
解压完成后,ES的目录为/data/elasticsearch-6.8.10
创建数据目录、日志目录:
mkdir -p /data/elasticsearch-6.8.10/data
mkdir -p /data/elasticsearch-6.8.10/logs
注意: -p 选项 可以创建多级目录。路径中的目录没有的话就创建。有的话则忽略。
编辑elasticsearch.yml
vim /data/elasticsearch-6.8.10/config/elasticsearch.yml #配置文件最好编辑前先备份
文件中需要添加或修改的内容如下(配置文件中默认全都是备注掉的,需要添加)
path.data: /data/elasticsearch-6.8.10/data #ES集群数据目录
path.logs: /data/elasticsearch-6.8.10/logs #ES集群日志目录
network.host: 0.0.0.0 #配置0.0.0.0允许其他地址访问
http.port: 9200 #对外访问端口
transport.tcp.port: 9300
transport.tcp.compress: true
http.cors.enabled: true #允许跨域访问
http.cors.allow-origin: "*"
其他配置修改,主要是修改jvm的运行内存大小,可以根据实际情况按需修改
vim /data/elasticsearch-6.8.10/config/jvm.options
修改其中的以下两条,根据实际情况按需修改:
-Xms1g
-Xmx1g
系统参数修改:
vim /etc/security/limits.conf
在末尾增加以下内容:
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
修改/etc/sysctl.conf配置:
vim /etc/sysctl.conf
添加如下内容:
vm.max_map_count=655360
修改完成保存生效:
sysctl -p
由于ES集群不允许root用户运行,需要创建ES运行用户:
# 创建用户组
groupadd es
# 创建用户并添加至用户组
useradd es -g es
# 更改用户密码(输入 es)
passwd es
密码:es123#
修改目录权限:
sudo chown -R es:es /data/elasticsearch-6.8.10
-R 选项:表示递归,让其下的所有文件包括目录,及子子文件及子子目录的属主:属组都改为es:es
像上面这样如果是一个目录层级,则从最后的那个目录层开始修改属组和属主
像上面这样/data目录只需要x(执行权限就行,也就是可以cd /data/)
切换到es用户
su es
启动服务:
cd /data/elasticsearch-6.8.10/bin
./elasticsearch -d #-d是后台启动,第一次启动时可以不加-d,查看启动的日志情况
启动后输入jps可以查看到服务状态
通过jps命令可以看到Elasticsearch的服务进程,其确实是一个java项目。
[root@localhost bin]# jps
40052 Jps
39461 Elasticsearch
通过以下两种方式判断是否服务是否正常
curl http://172.16.57.103:9200/_cat/health?v #查看状态
或curl http://172.16.57.103:9200 #查看服务情况
要通过浏览器测试以上两个url 连接,需要关闭虚拟机的防火墙,或者添加访问策略。
直接关闭防火墙太暴力,也不安全
添加防火墙策略
[root@localhost bin]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"
解释一下:上面的策略的,接受 ip为172.16.57.17的地址,访问本机9200端口的服务
注意:–add-rich-rule= “策略内容”
这里的 source address=的值。这里源地址,不是服务端的目的ip地址,而是你打算访问服务端的物理机的地址。我的物理本机地址是:172.16.57.17。
然后让策略立即生效:
[root@localhost bin]# firewall-cmd –reload
然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。
然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。
注意
:上面–add是添加策略的意思。改成–remove 就是移除策略意思。
[root@localhost bin]# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"
然后让移除的策略立即生效,也是执行下面的命令:
[root@localhost bin]# firewall-cmd --reload
查询防火墙某一策略是否已配置:通过 --query 指令
[root@localhost bin]# firewall-cmd --permanent --query-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"
返回:yes,表明已配置。返回no,表明未配置
安装这个插件的目的是可以通过插件提供的web界面功能,可视化的管理(查看/修改)es中的索引信息。
首先安装node.js
注意运行完ES后要切换回root用户
安装依赖:(没安的话就安装)
yum -y install gcc gcc-c++ openssl-devel
下载安装包、解压至/data目录
wget http://nodejs.org/dist/v13.9.0/node-v13.9.0-linux-x64.tar.gz
tar -zxvf node-v13.9.0-linux-x64.tar.gz -C /data
配置Node全局环境变量并生效
vim /etc/profile
#在末尾加入以下内容
export PATH=$PATH:/data/node-v13.9.0-linux-x64/bin
#wq保存退出后,输入命令生效
source /etc/profile
验证,能看到输出版本号信息则成功
再安装ElasticSearch-Head插件
将网盘上下载的:elasticsearch-head 上传到服务器的 /data目录下
配置修改,vim编辑Gruntfile.js文件
#进入文件夹,编辑文件
cd /data/elasticsearch-head
vim Gruntfile.js
在此处添加内容:
hostname: '0.0.0.0',
还是 cd /data/elasticsearch-head
编辑_site/app.js文件,搜索9200,修改localhost为ES的访问地址
安装所需的npm依赖库
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
然后执行npm install命令进行安装
运行服务
nohup ./node_modules/grunt/bin/grunt server > es-head-start.log 2>&1 &
服务运行后,会启动在9100端口,然后就可以在浏览器中访问查看。
如果上面这个界面打不开。请在cd /data/elasticsearch-head目录下查看es-head-start.log日志文件。
请看开头的百度链接中的软件包kibana-6.8.10-x86_64.rpm。
将软件包上传到服务器的/data/software目录下
或者通过
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-x86_64.rpm
注意
: Kibana的版本需要与ElasticSearch版本一致
安装服务
rpm -ivh kibana-6.8.10-x86_64.rpm
修改配置文件,rpm方式安装的kibana配置文件路径是/etc/kibana/kibana.yml
vim /etc/kibana/kibana.yml
文件里面的配置默认是全部注释掉的,我们需要添加如下内容:
# 服务端口
server.port: 5601
# 服务器ip 本机
server.host: "0.0.0.0"
# Elasticsearch 服务地址
elasticsearch.hosts: ["http://localhost:9200"] #如果kibana和es在同一台机器可以,这里可以使用localhost。
# 设置语言为中文
i18n.locale: "zh-CN"
注
:配置文件中默认注释掉的内容里有很多配置,例如ES的登录用户密码配置等,如有需要可以按需配置。
systemctl start kibana #启动
systemctl status kibana #查看状态
systemctl enable kibana #设置开机自启
服务启动后,稍等一两分钟,然后就可以在浏览器中访问5601端口就可以看到界面了。
百度网盘上找logstash-6.8.10.rpm 软件包。
或者
cd /data/software
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.10.rpm
rpm -ivh logstash-6.8.10.rpm
进入cd /etc/logstash/
修改pipelines.yml配置文件
发现它里面引用的是/etc/logstash/conf.d目录下.conf文件。
这是rpm方式安装的造成的。
但是进入此目录却发现是空的。需要从上层目录下拷贝一份配置文件。
#复制配置文件模板到/etc/logstash/conf.d目录下
cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf
vim /etc/logstash/conf.d/logstash.conf
配置内容因人而异,可以按项目进行相关的配置,模板及部分配置项如下:
input { #beats { # port => 5044 #} tcp { mode => "server" host => "0.0.0.0" port => 9600 codec => json_lines } } output { stdout{ codec => rubydebug } elasticsearch { hosts => ["http://localhost:9200"] #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } }
上面的流水线配置先按这样来,后面再具体说里面的参数
Logstash服务自身的配置文件路径为/etc/logstash/logstash.yml,包含了端口、进程大小限制、日志文件路径等配置内容,可以按需进行配置。默认端口为9600。
vim /etc/logstash/logstash.yml
#这里采用默认的方式,不修改。
systemctl start logstash #启动
systemctl enable logstash #设置开机自启
systemctl status logstash #查看状态
查看端口监听状态
netstat -nlp | grep :9600
还可以通过 jps命令 查看 logstash 和 es 一样都是java项目
ELK平台的部署已经全部结束了,接下来可以做一次全流程的验证测试。
目的用来生产日志数据
从百度网盘链接里找到:StarterApi.rar
下载下来解压后导入IDEA中
这里为了简单起见,我们不采用docker容器进行部署了。
启动类是:
和Logstash相关的日志配置文件:
logback.xml
把配置文件中的mysql,redis服务地址都配上。
在数据库上首先手动创建一个数据库为starter。然后运行项目时,通过flyway,自动把数据库脚本初始化到starter里了。
这里说下如果通过ideal 进行编译打包。
没有报错的话,会在target目录下看到下面红框里的jar包,然后把这个jar包上传到服务器上。
将这个jar包 上传到 /data/ project 目录下:
进入/data目录里,执行以下命令:
java -Dfile.encoding=utf-8 -jar ./project/api-0.0.1-SNAPSHOT.jar > /dev/null &
通过jps命令查看服务是否已启动
数据库里的表和数据也都随着项目的启动通过flyway创建好了。
curl '172.16.57.103:9200/_cat/indices?v'
或者通过可视化的插件界面来查看:Chrome浏览器:http://172.16.57.103:9100
确认es中有日志数据后。
在kibana中,必须拥有默认索引模式,才能从es中检索数据。
现在默认的索引模式就切换过来了:如下
将时间戳转为具体的时间后,可以发现
索引logstash-2023.07.11 的创建时间为2023-07-11 12:07:08
因为它是我们首次启动logstash后,第一次logstash和es建立联系时es创建的。
索引logstash-2023.07.12 的创建时间为北京时间2023-07-12 08:00:00。
可以看出从第二天开始es创建索引的时间是北京时间早上08:00。
原因分析如下:
解决方案:
1、索引的创建时间或日志写入es的时间是根据默认的"@timestamp"字段来创建写入的,所以直接给"@timestamp"加上8小时即可;这样,索引生成的时间就是00:00了。
修改vim /etc/logstash/conf.d/logstash.conf
添加以下内容:
filter { date { match => ["log_time", "yyyy-MM-dd HH:mm:ss.SSS"] target => "@timestamp" } ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" } ruby { code => "event.set('@timestamp',event.get('timestamp'))" } mutate { remove_field => ["timestamp"] } } }
修改后观察第二天索引的创建时间戳已正常改为凌晨00:00。
2、 还有一点是需要将kibana的显示时间改为UTC,默认kibana是自动根据@timestamp字段按照浏览器"Browser"的时间所在时区来的,这样会导致我们现在的时间+8小时;当改为UTC后+8h正好符合我们现在的时间。
如果上面不指定UTC,而是默认的Browser的话,如果当前时区为东八区,那么kibana根据索引从es中查到的时间数据都+8小时。那么会出现比我们时间的北京时间超了8小时。所以这里选择UTC。相当于这里直接展示在插入ES时提前增加8小时后的那个时间了,也就是我们的北京时间了。
测试所用的springboot项目里的,application.yml文件
里面的注释是自己添加的。
max-size值可以设置大些,这里为了演示效果设置成了7KB,一般设置成10MB。
这里的.gz文件,超过7天的。只有在项目启动时,项目日志系统会定时去logs目录下扫描哪些符合被删除的归档文件。
我们这个项目的。日志 即在控制台打印,也保存到本地文件里,还把要日志传输到Logstash里。保存到本地文件里一份的这个也是必须的。因为把日志传输到Logstash端可能会失败,防止日志丢失。所以本地也要保存一份日志。
Logstash是怎么收集日志的,是和里面的logback.xml文件有关。
在application.xml中添加此配置路径,使配置生效
logging:
config: classpath:logback.xml
我们的logback.xml里没有指定logbash收集到的日志的日志格式。那么就采用默认的日志格式。
Logstash不仅可以获取实时日志。还可以从指定的日志文件里读取离线日志。
在input里添加上红框里的内容。然后重启Logstash。
但是有一点是。它会把读取的一条日志全部赋值给,message字段。
这里就要用到filter过滤器,对input进来的日志进行切割处理。
Logstash 里的 主要的三个组件就是:
input{
.....
}
filter{
.....
}
output{
.....
}
日志的流程处理顺序 input –-> filter – > output.
针对于RedHot下的CnetOS7:
下面分别说下常见的软件以下几种安装方式的校验合法性:
1.rpm -ivh 包全名/网络路径地址,
2.yum -y install 包名
3.还有一种是.tar.gz格式的。先wget 下载到本地再解压。(有可能是源码,也有可能是编译后的免安装的压缩版)
先说第一种:
我们先通过wget 命令把kibana-6.8.10-x86_64.rpm下载到服务器。
然后执行 rpm -ivh 进行安装
上面在安装时提示:
warning: kibana-6.8.10-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
或rpm -ivh 包的网络路径 #下载并安装
报 警告:/var/tmp/rpm-tmp.0SYa24: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
都是因为:我们的服务器端没有导入对应的公钥。
解决办法:
下载并安装签名公钥:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
也可以 先 通过 wget https://artifacts.elastic.co/GPG-KEY-elasticsearch 把公钥文件GPG-KEY-elasticsearch下载到服务器。
然后在此公钥文件所在目录执行 rpm --import GPG-KEY-elasticsearch。
说明一下:这个公钥是elastic所有部署包,这里就是说的rpm包,所共享的。
如果验证公钥已经导入成功了。
rpm -V 验证安装软件的修改 –这个我们先不用
rpm -K 验证软件包的数字签名 先导入机器的秘钥,再验证
在没有导入对应的rpm包的公钥时,使用rpm -K校验时就报上面这个问题。
或者在安装时警告提示上面的NOKEY。
使用上面的说的命令导入公钥后:
或者选择直接安装试试:
[root@localhost /]# wget https://artifacts.elastic.co/GPG-KEY-elasticsearch #下载下来
第二种通过 yum -y install kibana ,这种方式从yum源里获取资源。如果yum源里没有kibana软件包。
还有一个问题,如何保证这种安装时安装包的合法性。
官方给出的解决方法:
安装中会验证,没问题就没有提示。若有问题,会给出提示。
和手机上安装app一样。都要验证签名是否有效。
第三种 使用.tar.gz方式安装
还有一种是通过docker 容器安装的方式。这种方式docker pull 下来镜像到本地后,要对镜像进行验证签名。这个后面遇到再补充。
方式一:
方式二:
当然也有方式三:
即 Filebeat采集的日志 直接发送到es。中间不使用Logstash。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。