ELK日志分析系统

ELK的概论

ELK是一套完整的日志集中处理方案

ELK是由三个开源软件简称组成

E:ElasticSearch简称ES是一个开源的,分布式的存储检索引擎索引型的非关系数据库)。作用是存储日志。是由Java代码开发的,基于Lucene结构开发的全文检索引擎。拥有一个web接口。用户可以通过浏览器的形式和ES组件进行通信

在ELK架构中的主要作用:存储,允许全文搜索,结构化搜索(索引点)。索引点可以支持大容量的日志数据。也可以搜索其他不同类型的文档。

L:Logstash是数据收集引擎。支持动态的(实时)从个各种服务应用收集日志资源,还可以对收集到的日志进行过滤、分析、丰富、统一格式等等操作。然后把数据同步到ES存储引擎。是由RUBY语言编写的,运行在Java虚拟机上的一个强大的数据处理工具。数据传输,格式化处理,以及格式化输出。主要用来处理日志

K:Kiabana是图形化界面。可以更好的分析存储在ES上的日志数据。提供了一个图形化的界面,来浏览ES上的日志数据。汇总、分析、搜索在Kiabana上都可以完成。

fliebeat和kafka、RabbitMQ都可以作为日志工具。

kafka、RabbitMQ属于中间件消息队列

fliebeat:轻量级的开源的,日志收集工具。收集速度较快,但是没有数据分析和过滤的能力。一般结合Logstash一起使用

ELK数据流向和工作流程图:

ELK日志分析系统_第1张图片

1、 logstash:分析、过滤、数据统一格式。logstash收集不同的日志数据,通过过滤并将格式统一化。分别发送到es1和es2主机上

2、 两台es主机会以分片索引的形式保存在ES上。两台es主机起高可用的作用。一旦一台机器发生故障,另外一台es主机也还可以提供索引服务

3、 将日志数据发送到kiabana主机,方便用户检索。

总结

ELK的作用:当我们管理一个大集群时,需要分析和定位的日志就会很多,每一台服务器分别去分析,将会耗时耗力。所以应运而生了一个集中统一的日志管理和分析系统。极大的提高了定位问题的效率。

日志系统的特征:

1、 收集,可以收集基本上市面上常用的软件日志。

2、 传输,收集到的日志需要发送到ES上

3、 存储,ES负责存储数据

4、 UI:图形化界面(kiabana)

ELK搭建实验

实验准备:

logstash+kiabana:20.0.0.10 4核8G

es1:20.0.0.20 2核4G

es2:20.0.0.30 2核4G

统一使用logstash6.7.2

实验开始:
关闭三台主机的防火墙和安全机制!

java -version
yum -y install java
#安装依赖环境

es1和es2
两台主机都要安装elasticsearch
cd /opt
rpm -ivh elasticsearch
#两台主机都要安装elasticsearch
cd /etc/elasticsearch/
#修改配置文件elasticsearch.yml
cp elasticsearch.yml elasticsearch.yml.bak
#配置文件做一个备份
es1:
vim elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
#node.name不能重复,两台主机要区分
node.master: ture
#是主就是ture
node.data: ture
#设置存储节点
33行
path.data:/opt/log
#设置存储位置
37行
path.log: /var
#日志存放路径
44行
bootstrap.memory_lock: ture
#禁止es使用交换分区
56行
network.host: 0.0.0.0
#监听所有网段
60行取消注释并添加一行
http.port: 9200
#对外提供访问的端口
transport.tcp.port: 9300
#es内部通信的端口
71行取消注释
discovery.zen.ping.unicast.hosts: ["20.0.0.20:9300", "20.0.0.30:9300"]
#指定集群的通信地址

es2:
vim elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node2
#node.name不能重复,两台主机要区分
node.master: flase
#是主就是ture
node.data: ture
#设置存储节点
33行
path.data:/opt/log
#设置存储位置
37行
path.log: /var
#日志存放路径
44行注释
bootstrap.memory_lock: ture
#禁止es使用交换分区
56行
network.host: 0.0.0.0
#监听所有网段
60行取消注释并添加一行
http.port: 9200
#对外提供访问的端口
transport.tcp.port: 9300
#es内部通信的端口
71行取消注释
discovery.zen.ping.unicast.hosts: ["20.0.0.20:9300", "20.0.0.30:9300"]
#指定集群的通信地址

配置文件修改完成
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
#检查配置文件是否有问题

systemctl restart elasticsearch
systemctl enable elasticsearch
#设置开机自启

netstat -antp | grep 9200
#查看端口是否启动,能查看到说明配置没
tail -f /var/log/elasticsearch/my-elk-cluster.log
#日志

到浏览器查看一下
20.0.0.20:9200
20.0.0.30:9200
#是否可以查看到
http://20.0.0.20:9200/_cluster/health?pretty 
http://20.0.0.30:9200/_cluster/health?pretty 
#查看集群健康状态

 ELK日志分析系统_第2张图片

ELK日志分析系统_第3张图片

es1和es2
安装插件
cd /opt/
安装node依赖环境
yum install gcc gcc-c++ make -y
#安装依赖环境
tar zxvf node-v8.2.1.tar.gz
#解压node安装包
cd node-v8.2.1
./configure
#开始配置
make -j 2 && make install
图形化环境依赖环境安装完毕!

es1和es2
安装web插件
cd /opt
tar zxvf phantomjs-2.1.1-linux-x86_64
cd /opt/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
#复制配置文件

安装可视化界面
elasticsearch-head-master
unzip 
#解压
cd elasticsearch-head-master
npm install
#安装依赖包
npm install

es1和es2
vim /etc/elasticsearch/elasticsearch.yml
到最后一行
http.cors.enabled: true
#开启跨域访问支持
http.cors.allow-origin: "*"
#开启跨域访问之后,允许访问的域名地址。*表示所有地址。
systemctl restart elasticsearch.service
netstat -antp | grep 9200
#查看端口是否起来
还是在这个目录
npm run start &
#后台启动。如果启动了报错500,可以再次使用这个命令重新启动
netstart -antp | grep 9100
#查看可视化界面端口是否起来
#9100是可视化工具的访问端口
#9200还是ES数据库的访问端口
#9300ES内部通信的端口

到浏览器测试一下
20.0.0.20:9100
20.0.0.30:9100
#查看可视化界面是否正常

在可视化界面输入ip地址加上ip点击连接后面都是绿色表示实验成功

ELK日志分析系统_第4张图片

连接成功!

在终端插入一条索引测试

在终端插入一个索引进行测试

curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
数据浏览,选择index查看是否可以查看到

查看概览:加粗的是主索引节点,没有加粗的是普通索引节点。相当于冗余和备份。

ELK日志分析系统_第5张图片

ELK日志分析系统_第6张图片

ELK日志分析系统_第7张图片

到10主机开始收集日志
yum -y install java
#安装依赖环境
java -version
cd /opt
rpm -ivh logstash
#安装logstash
systemctl restart logstash
#重启服务
systemctl enable logstash
#设置开机自启
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
#创建软连接
logstash -e 'input { stdin{} } output { stdout{} }'
#所有的键盘命令行输出转化为标准输(rubydebug的模式),6.0之后,默认的输出格式就是rubydebug的模式。
ctrl z停止
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.20:9200","20.0.0.30:9200"] } }' --path.data /opt/log
#--path.data /opt/log:目录可以不存在会自动创建
 [Api webserver] agent Successfully started Logstash API
endpoint port=>96011
#查看到这条信息,表示已经创建成功了
输入两条信息测试一下

ELK日志分析系统_第8张图片

回到10主机
/etc/logstash/conf.d
#默认路径
mkdir /opt/test1
vim system.conf
input {
 file {
  path =>"/var/log/messages"
  #指定收集日志文件的位置
  type =>"system"
  start_position =>"beginning"
  #收集日志的启动位置.beginning:从头开始向下收集
 }
}

output {
 elasticsearch {
  hosts => ["20.0.0.20:9200","20.0.0.30:9200"]
  #指定发送的实例ip和端口
  index =>"system-%{+YYYY.MM.dd}"
  #数据索引的名称%{+YYYY.MM.dd}:当前创建的日期
 }
}

logstash -f system.conf --path.data /opt/yy
#启动配置文件
显示success表示成功

到浏览器查看一下是否生成索引节点再到kibana上查看一下
管理---索引模式---创建索引模式
输入system-*
next
选择自动筛选
点击创建索引模式
回到Discover就可以查看到当前日志所有内容

ELK日志分析系统_第9张图片

ELK日志分析系统_第10张图片

ELK日志分析系统_第11张图片

如果日志文件发生以下报错:
Nov 27 12:05:56 test1 logstash: 2023-11-27T12:05:56 354/logstash.config.sourceloader) No configuration found in the configured
sources.
回到10主机修改配置文件
cd /etc/logstash
vim logstash.yml
解除注释
path.config: /opt/log
#指定文件位置
systemctl restart logstash
#重启服务
chmod 777 messages
#给messages所有权限
yum -y install httpd
#安装httpd服务测试一下看看kibana是否可用查看到
此时日志同步已经完成!

添加httpd服务到kibana
chmod 777 access_log error_log
#给httpd日志权限
mkdir /opt/http1
vim http.conf
input {
 file{
   path =>"/etc/httpd/logs/access_log"
   #日志文件路径
   type =>"access"
   start_position =>"beginning"
  }
 file{
    path =>"etc/httpd/logs/error_log"
   #日志文件路径
   type =>"error"
   start_position =>"beginning"
 
 }
}

output {
  if [type] == "access" {
    elasticsearch {
      hosts => ["20.0.0.20:9300","20.0.0.30:9300"]
      index => "http_access-%{+YYYY.MM.dd}"
    }
    }
   if [type] == "error" {
    elasticsearch {
      hosts => ["20.0.0.20:9200","20.0.0.30:9200"]
      index => "http_error-%{+YYYY.MM.dd}"
    }
  }
}

logstash -f httpd.conf --path.data /opt/test2 &
#启动配置文件。后台运行
再开1台10
vim /var/www/html/index.html
this is httpd
到浏览器访问一下20.0.0.10的httpd服务

到logstash和kibana查看一下看是否可用查看到
到kibana的管理,创建索引模式,httpd_access*直接创建即可
添加完成后,查看一下httpd是否可以查看到日志更新即可

实验完成!

ELK日志分析系统_第12张图片

ELK日志分析系统_第13张图片

如何实现过滤

kibana可以自动实现过滤
可以添加可用字段查看日志
不再需要再配置文件中加入字段了
需要移除字段,直接点移除即可

自动刷新功能:可选择刷新间隔。生产中一般
时间戳:选择绝对展示这一天内所有数据信息

es的性能调优

vim /etc/security/limits.conf
#修改最大打开文件数
* soft nofile 65536
#打开最大文件数软限制
* hard nofile 65536
#打开最大文件数硬限制
* soft nproc 32000
#打开最大进程软限制
* hard nproc 32000
#打开最大进程硬限制
* soft memlock unlimited
#是否对内存使用量软限制unlimited:不做限制
* hard memlock unlimited
#是否对内存使用量硬限制unlimited:不做限制
重启生效

vim /etc/systemd/system.conf
#对内核文件进行优化
在最后一行插入
DefaultLimitNOFILE=65536
#一个用户会话的末日最大文件描述符的限制量
#文件描述符:用于标识打开文件或者I/O资源限制的整数
DefaultLimitNPROC=32000
#一个用户可以打开的最大进程数量的限制 32000个,一个用户的终端可以运行多少个进程
DefaultLimitMEMLOCK=infinity
#一个用户的终端,默认锁定内存的限制。infinity:不做限制
#这个限制需要重启生效

内核优化

ES是基于lucene架构,实现的一款索引型数据库。lucene可以利用操作系统的内存来缓存ES的索引数据。提供更快的查询速度。在工作中我们会把系统的一般内存留给lucene。

部署es通用规则

如果机器内存小于64G。那么50%给ES。50%给操作系统,让操作系统内存给lucene架构缓存数据

如果机器内存大于64G。那么ES分配4-32G即可,其他的都给操作系统,供lucene架构缓存数据

vim /etc/sysctl.conf
#修改内核文件
vm.max map_count=262144
#一个进程可以拥有的最大内存映射区参数
#内存映射:将文件或者其他设备映射到进程地址空间的方法。允许进程直接读取或写入文件,无需常规的I/O方式。映射空间越大,ES和lucene的速度越快。
sysctl -p
#立即生效

映射关系:

2g/262144
4g/4194304
8g/8388608

logstash的命令常用选项

logstash -f:指定配置文件,根据配置文件识别输入和输出流
logstash -e:一般用于测试,从命令行当中获取输入,然后经过logstash加工之后,形成一个标准输出
logstash -t:检测配置文件是否正确,然后退出

logstash -e 'input { stdin{} } output { stdout{elasticsearch { hosts=>["20.0.0.20:9200","20.0.0.30:9300"]} }' --path.data /opt/log
#区分不同的数据存放目录
#6.0之后logstash自带的输出格式rubydebug,自动的把输出格式,定义为统一的标准格式输出。

总结

ELK:

E:es:存储数据,索引型的数据库

L:logstash:收集日志,然后按照标准化本事发送给ES(rubydebug的格式)

K:可视化工具。人性化的显示用户信息,方便用户检索查询。

logstash -f httpd.conf --path.data /opt/test2 &
# --path.data /opt/test2:加上后会自动生成数据的工作目录且工作目录不能重复
path.config: /opt/log
#/opt/log:配置文件的指定位置
path.data: /var/lib/logstash
#/var/lib/logstash:这个工作目录不需要修改

你可能感兴趣的:(elk)