如果我的能力,只能让我穷困潦倒,那么穷困潦倒就是我的价值。想干什么和能干什么,是两回事,这要根据自身的条件决定。只要不是我觉悟到的,你就给不了我,就算给了我,我也拿不住。只有自己觉到,悟到,才有可能做到,能做到的才是我的。
--《天道》
目录
### 1.4 elsearch用户启动elasticsearch时出现"failed to obtain node locks"错误
### 1.5 elsearch用户启动elasticsearch时端口占用错误分析
#### 3.2.1 Filebeat Module 配置读取nginx日志
###### 3.2.1.1.1 ELK激活nginx模块出现"Error loading piowing Elasticsearch plugins"错误
filebeat:占用内存少,启动快,作轻量级的日志采集。不是java开发,不支持"jps"命令,支持与logstash一起使用作功能性操作
logstash:笨重,启动慢,占用空间大。用的java后台开发,使用"jps"命令查看进程id
filebeat是用于"转发"和"集中日志数据"的轻量级数据采集器。
filebeat会监视指定的日志文件路径,收集日志事件并将数据转发到 elasticsearch,logstash, redis , kafka存储服务器。
Filebeat 包含两个主要组件, input( 输入 ) 和 Harvester( 收割器 ) ,两个组件协同工作将文件的尾部最新数据发送出去。
- Harveste组件: 负责逐行读取单个文件的内容,然后将内容发送到输出。如果文件在读取时被删除或重命名,Filebeat将继续读取文件。
- input组件: 输入负责管理收割机并找到所有要读取的源。该参数的源文件路径需要使用者手动配置。
- Spooler(缓冲区): 将Harvester组件采集的数据进行统一的缓存,并发往目的端,可以是 Elasticsearch, Logstash , kafka 和 Redis 等。
## 1. Filebeat原理
1. filebeat 启动后, filebeat 通过 Input 读取指定的日志路径 ;2. 为该文件日志启动收割进程 harvester, 每个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序 libbeat/spooler;3. libbeat/spooler 会聚合这些事件,并将聚合的数据发送到为 Filebeat 配置的输出。
### 1.1 filebeat关于保持文件状态
- Filebeat保持每个文件的状态,并经常将状态刷新到注册表文件(data/registry)中的磁盘。
- 该状态用于记住收割机读取的最后一个偏移量,并确保发送所有日志行。
如果无法访问输出(如Elasticsearch 或 Logstash ), Filebeat 将跟踪发送的最后一行,并在输出再次可用时继续读取文件。当 Filebeat 运行时,每个输入的状态信息也会保存在内存中。重新启动 Filebeat 时,注册表文件中的数据将用于重建状态,Filebeat 将每个 harvester 在从保存的最后偏移量继续读取。对于每个输入,Filebeat 会保存它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以标识文件。对于每个文件, Filebeat 存储唯一的标识符,以检测文件是否以前被获取。
Linux基础:Linux查找文件时不是直接查找文件(不同目录下文件名有可能重名),而是通过inode编号找到其所在位置打开文件。
### 1.2 filebeat确保一次交付
1. Filebeat 保证事件将至少传送到配置的输出一次并且不会丢失数据。2. Filebeat 能够实现这种行为,因为它将每个事件的传递状态存储在注册表文件中。在定义的输出被阻止且未确认所有事件的情况下,Filebeat 将继续尝试发送事件,直到输出确认其已接收到事件。如果Filebeat 在发送事件的过程中关闭,则在关闭之前不会等待输出确认所有事件。在关闭filebeat之前,不断重新更新 registry注册表,动态更新registry中的offset偏移量位置,达成动态更新。
### 1.3 top命令简述
Linux中的top命令主要用于实时监控系统的运行状态,包括系统负载、CPU利用分布、内存使用以及每个进程的资源使用情况。
top命令的格式为“top[参数]”,其参数包括:
- -b:批处理模式,用于将结果输出到文件或其它程序。
- -c:显示完整的命令行,而不是截断版本。
- -S:累积模式,用于显示多次更新结果。
- -s:安全模式,去除交互命令的潜在风险。
- -i:忽略闲置和僵死进程。
- -u<用户名>:指定显示特定用户的进程。
- -p<进程号>:指定显示特定进程的信息。
- -n<次数>:设置top命令循环显示的次数,然后退出。
- -d<秒数>:设置信息更新的周期。
- -f或F:从当前显示中添加或删除项目。
- -o或O:改变显示项目的顺序。
- -l:切换显示平均负载和启动时间信息。
- -m:切换显示内存信息。
- -t:切换显示进程和CPU状态信息。
- -q:退出程序。
- -r:重新安排一个进程的优先级别。
- -w或W:将当前设置写入~/.toprc文件,以保存用户偏好设置。
此外,top命令的输出主要包括三个部分,即顶部的系统状态显示、中间的任务列表、以及底部的输入/消息行,显示了系统的运行时间、负载平均值、任务数量和CPU状态等信息。
### 1.4 elsearch用户启动elasticsearch时出现"failed to obtain node locks"错误
原因分析:没有获得这个lock文件的操作权限,node.lock被其他进程使用了,这也是网上大多数的解释。解决方案:首先查看es的进程,然后杀掉。
# 使用解决方案前,可以先确认下node.lock是否被某个进程占用,命令如下
lsof /opt/es/elasticsearch-6.5.4/data/nodes/0/node.lock
## 查询结果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 4515 elsearch 62wW REG 8,2 0 9482913 /opt/es/elasticsearch-6.5.4/data/nodes/0/node.lock## 已知是java进程留存
# 查询僵尸进程或使用"top"命令查看
ps -ef |grep elasticsearch或者java
# 杀死进程
kill -9 端口
# 切换用于进行重启
su - elsearch
cd /opt/es/elasticsearch-6.5.4/
./bin/elasticsearch -d
### 1.5 elsearch用户启动elasticsearch时端口占用错误分析
原因分析:一台主机未成功启动后其他主机会不断尝试连接未成功启动主机的9200和9300端口,导致端口占用,无法启动。
注:也有可能是用yum安装了其他版本的elasticelsearch,请使用"systemctl stop elasticsearch"命令将其停掉再重启elasticelsearch。
解决方法:用"jps"命令查看三台主机Elasticsearch端口,用"kill -9 端口"命令将其杀死并全部同时重启,或将主机重启再重启elasticelsearch。
## 2. 部署Filebeat环境
主机 | ES启动用户 | kibana启动用户 | Filebeat启动用户 |
192.168.182.131 | elsearch | 超级用户 | 超级用户 |
192.168.182.153 | elsearch | 未下载 | 未下载 |
192.168.182.154 | elsearch | 未下载 | 未下载 |
### 2.1 安装Filebeat软件
下载(版本为: filebeat-6.5.4 ): https://www.elastic.c o/downloads/beats
# 创建安装目录
mkdir /opt/beats/
# 解压/root/下上传的压缩文件到创建目录
tar -xvf filebeat-6.5.4-linux-x86_64.tar.gz -C /opt/beats/
# 创建配置文件
cd /opt/beats/filebeat-6.5.4-linux-x86_64
vim beats.yml
## 配置文件内容如下:
filebeat.inputs:
- type: stdin
enabled: true
setup.template.settings:
index.number_of_shards: 3
output.console:
pretty: true
enable: true
# 启动filebeat
./filebeat -e -c beats.yml
启动成功及输出"hello"运行结果展示
filebeat相关参数解释:
-e:将日志输出到标准输出,并禁用系统日志和文件的输出,默认输出到syslog和logs下
-c:指定配置文件
-d:调试输出,输出debug信息
配置文件"stdin"解释:
stdin:标准输入,不需要定义path,从标准输入获取
filebeat参数介绍:
vim test.yml# 内容如下:filebeat.inputs:- type: stdinenabled: trueoutput.console:pretty: trueenable: true# 测试输出: ./filebeat -e -c test.yml -d "publish"
结果展示:
## 3. filebeat实例
### 3.1 读取自定义日志文件
# 配置读取文件项 beats-log.yml
# 先创建日志目录
mkdir /opt//beats/logs/
# 在编辑配置文件
vim beats-log.yml
## 内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/beats/logs/*.log
setup.template.settings:
index.number_of_shards: 3
output.console:
pretty: true
enable: true
# 启动filebeat
./filebeat -e -c beats-log.yml
# 复制一个终端,在/opt/beats/logs下创建a.log文件
cd /opt/beats/logs/
vim a.log
## 内容如下:
hello
nebula
#观察filebeat输出
#### 3.1.1 自定义字段
#配置读取文件项 beats-log-custom.yml
vim beats-log-custom.yml
## 内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/beats/logs/*.log
# 添加自定义tag,便于后续的处理
tags: ["web"]
# 添加自定义字段
fields:
from: nebula
# true为添加到根节点,false为添加到子节点中
fields_under_root: true
setup.template.settings:
index.number_of_shards: 3
output.console:
pretty: true
enable: true
# 启动filebeat
./filebeat -e -c beats-log-custom.yml
# 复制一个终端,在/opt/beats/logs下创建b.log文件
vim b.log
## 内容如下:
123
已检测到日志文件有更新,立刻会读取到更新内容,并输出到控制台
#### 3.1.2 输出到elasticsearch
# 配置文件编辑
vim beats-log-elasticsearch.yml
## 内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/beats/logs/*.log
tags: ["web"]
#添加自定义字段
fields:
from: nebula
fields_under_root: true
setup.template.settings:
#指定索引的分区数
index.number_of_shards: 3
output.elasticsearch :
hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
# 启动filebeat
./filebeat -e -c beats-log-elasticsearch.yml
# 复制一个终端,在#/opt/beats/logs追加a.log文件
vim a.log
## 内容如下:
123
# 在日志文件中输入新的内容进行测试:echo "abcdefg" >> a.log(或者指定绝对路径/opt/beats/logs/)
追加效果展示:
### 3.2 读取Nginx日志文件
# 配置文件编辑
vim beats-log-nginx.yml
## 内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/*.log
tags: ["nginx"]
setup.template.settings:
index.number_of_shards: 3
output.elasticsearch:
hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
# 启动
./filebeat -e -c beats-log-nginx.yml
浏览器地址输入http://192.168.182.131/多次请求,在如下页面可以看到多次请求
#### 3.2.1 Filebeat Module 配置读取nginx日志
在 Filebeat 中,有大量的 Module ,可以简化我们的配置,直接就可以使用,如下:
其中,内置了很多的module,但是都没有启用,如果需要启用需要进行enable
操作:./filebeat modules enable nginx # 启动./filebeat modules disable nginx # 禁用
##### 3.2.1.1 nginx module 配置
# 启用nginx模块
./filebeat modules enable nginx
启用之后modules.d目录下的模块会出现没有带.disabled的yml,这个文件就是我们
的模块配置文件cd /opt/beats/filebeat-6.5.4-linux-x86_64/modules.d打开nginx.yml
vim nginx.yml
# 内容如下:
- module: nginx
# Access logs
access:
enabled: true
var.paths: ["/usr/local/nginx/logs/access.log*"]
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
# var.paths:
# Error logs
error:
enabled: true
var.paths: ["/usr/local/nginx/logs/error.log*"]
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
# var.paths
配置filebeat
# 配置文件编辑
cd /opt/beats/filebeat-6.5.4-linux-x86_64
vim nebula-nginx.yml
## 内容如下:
filebeat.inputs:
#- type: log
# enabled: true
# paths:
# - /usr/local/nginx/logs/*.log
# tags: ["nginx"]
setup.template.settings:
index.number_of_shards: 3
output.elasticsearch:
hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# 启动
./filebeat -e -c nebula-nginx.yml
###### 3.2.1.1.1 ELK激活nginx模块出现"Error loading piowing Elasticsearch plugins"错误
ELK之elasticsearch插件导致filebeat没有上传日志至elasticsearch解决办法--可能是插件未安装导致。
# 查看elasticsearch主机插件是否安装--集群内三台主机都要安装
/opt/es/elasticsearch-6.5.4/bin/elasticsearch-plugin list
# 安装插件
cd /opt/es/elasticsearch-6.5.4/
./bin/elasticsearch-plugin install ingest-user-agent
./bin/elasticsearch-plugin install ingest-geoip
## 若已经安装,卸载了重新安装一次即可(无需重启elasticsearch)
### 卸载
./bin/elasticsearch-plugin remove ingest-user-agent
./bin/elasticsearch-plugin remove ingest-geoip
### 安装
./bin/elasticsearch-plugin install ingest-user-agent
./bin/elasticsearch-plugin install ingest-geoip
# 切换用户重启elsearch
su - elsearch
cd /opt/es/elasticsearch-6.5.4/
./bin/elasticsearch -d
# 查看集群日志是否启动成功
tail -f logs/es-clusters.log
elasticsearch错误数据采集展示:
#### 3.2.2 EFK练习
# filebeat配置文件编辑
vim beats-log-nginx-dashboard.yml
## 内容如下:
filebeat.inputs:
setup.template.settings:
index.number_of_shards: 3
output.elasticsearch:
hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.kibana:
host: "192.168.182.131:5601"
setup.dashboards.enabled: true
# 启动
cd /opt/beats/filebeat-6.5.4-linux-x86_64
./filebeat -e -c beats-log-nginx-dashboard.yml
## 4. 总结
主要实现了用Elastic Stack的系列产品对Nginx日志进行数据采集,数据存储,和数据可视化。Filebeat用于监控、收集服务器日志文件,Elasticsearch用于收集nginx服务的访问数据,Kibana对 Elasticsearch 索引中的数据进行搜索、查看、交互操作,并且可视化展示出来。 每次nginx服务被访问都会产生日志,并实时记录,最后进行可视化展示出来。