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数据流向和工作流程图:
1、 logstash:分析、过滤、数据统一格式。logstash收集不同的日志数据,通过过滤并将格式统一化。分别发送到es1和es2主机上
2、 两台es主机会以分片索引的形式保存在ES上。两台es主机起高可用的作用。一旦一台机器发生故障,另外一台es主机也还可以提供索引服务
3、 将日志数据发送到kiabana主机,方便用户检索。
ELK的作用:当我们管理一个大集群时,需要分析和定位的日志就会很多,每一台服务器分别去分析,将会耗时耗力。所以应运而生了一个集中统一的日志管理和分析系统。极大的提高了定位问题的效率。
日志系统的特征:
1、 收集,可以收集基本上市面上常用的软件日志。
2、 传输,收集到的日志需要发送到ES上
3、 存储,ES负责存储数据
4、 UI:图形化界面(kiabana)
实验准备:
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
#查看集群健康状态
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点击连接后面都是绿色表示实验成功
连接成功!
在终端插入一条索引测试
在终端插入一个索引进行测试
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
数据浏览,选择index查看是否可以查看到
查看概览:加粗的是主索引节点,没有加粗的是普通索引节点。相当于冗余和备份。
到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
#查看到这条信息,表示已经创建成功了
输入两条信息测试一下
回到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就可以查看到当前日志所有内容
如果日志文件发生以下报错:
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是否可以查看到日志更新即可
实验完成!
kibana可以自动实现过滤
可以添加可用字段查看日志
不再需要再配置文件中加入字段了
需要移除字段,直接点移除即可
自动刷新功能:可选择刷新间隔。生产中一般
时间戳:选择绝对展示这一天内所有数据信息
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。
如果机器内存小于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 -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:这个工作目录不需要修改