ELK 日志分析系统

时间:2024-01-25 07:31:04

目录

一、日志管理方案

二、完整日志系统基本特征

三、ELK 简介

ELK组件:

1、ElasticSearch

2、Logstash

3、Kibana

 可以添加的其它组件:

 1、Filebeat

2、缓存/消息队列(redis、kafka、RabbitMQ等)

3、Fluentd

三、ELK 的工作原理

四、ELK部署

1、Elasticsearch部署

 ①关闭防火墙和安全机制

 ②设置Java环境

③安装elasticsearch—rpm包

④修改elasticsearch主配置文件

⑤es 性能调优参数

⑥启动elasticsearch是否成功开启

⑦查看节点信息

2、安装 Elasticsearch-head 插件

①编译安装 node

②安装 phantomjs

③安装 Elasticsearch-head 数据可视化工具

④修改 Elasticsearch 主配置文件

⑤启动 elasticsearch-head 服务

⑥通过 Elasticsearch-head 查看 Elasticsearch 信息

⑦插入索引

3、 ELK Logstash 部署(在 Nginx 节点上操作)

①关闭防火墙和安全机制

②更改主机名

③设置Java环境

④安装nginx服务

⑤安装logstash

⑥测试 Logstash

⑦定义 logstash配置文件,读取nginx日志

4、ELK Kiabana 部署 Kiabana

①安装 Kiabana

②设置 Kibana 的主配置文件

③创建索引


一、日志管理方案

1、服务器数量较少时

可以直接登录到目标主机查看日志,通过rsyslog工具或编写shell、python脚本实现日志收集,并集中保存到统一的日志服务器

2、服务区数量较多时

使用ELK大型日志系统,实现日志收集、存储、检索和分析

3、容器环境

使用ELK或Loki+Granfana

二、完整日志系统基本特征

收集:能够采集多种来源的日志数据
传输:能够稳定的把日志数据解析过滤并传输到存储系统
存储:存储日志数据
分析:支持UI分析
警告:能够提供错误报告,监控机制

三、ELK 简介

ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。

ELK组件:

1、ElasticSearch

是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索数据库引擎,用来存储各类日志,并创建索引,方便全文检索。集群化部署,节点分三种类型:master/data/client,设置相同的cluster.name并使用Zen Discovery模块通过单播实现集群中节点的服务发现。

2、Logstash

作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。

Logstash 由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。 

3、Kibana

 Kibana 通常与 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 提供图形化的 web 界面来浏览 Elasticsearch 日志数据,可以用来汇总、分析和搜索重要数据

 可以添加的其它组件:

 1、Filebeat

轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。常应用于 EFLK 架构当中

filebeat 结合 logstash 带来好处:

1)通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力

2)从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取

3)将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件

4)使用条件数据流逻辑组成更复杂的处理管道

2、缓存/消息队列(redis、kafka、RabbitMQ等)

可以对高并发日志数据进行流量削峰和缓冲,这样的缓冲可以一定程度的保护数据不丢失,还可以对整个架构进行应用解耦

3、Fluentd

是一个流行的开源数据收集器。由于 logstash 太重量级的缺点,Logstash 性能低、资源消耗比较多等问题,随后就有 Fluentd 的出现。相比较 logstash,Fluentd 更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为 logstash 的一种替代方案,常应用于 EFK 架构当中。在 Kubernetes 集群中也常使用 EFK 作为日志数据收集的方案。

在 Kubernetes 集群中一般是通过 DaemonSet 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。

三、ELK 的工作原理

(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。

(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。

(3)Elasticsearch 对格式化后的数据进行索引和存储。

(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。

 总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。

四、ELK部署

1、Elasticsearch部署

 ①关闭防火墙和安全机制

 systemctl disable --now firewalld

 setenforce 0

 ②设置Java环境

 tar xf jdk-8u361-linux-x64.tar.gz

 mv jdk1.8.0_361/ /usr/local/

vim /etc/profile.d/java.sh

source /etc/profile.d/java.sh

java -version

③安装elasticsearch—rpm包

上传elasticsearch-6.7.2.rpm到/opt目录下

使用命令rpm -ivh elasticsearch-6.7.2.rpm或yum localinstall elasticsearch-6.7.2.rpm进行安装

④修改elasticsearch主配置文件

vim /etc/elasticsearch/elasticsearch.yml

 scp /etc/elasticsearch/elasticsearch.yml 192.168.130.20:`pwd`

 scp /etc/elasticsearch/elasticsearch.yml 192.168.130.30:`pwd`

⑤es 性能调优参数

优化最大内存大小和最大文件描述符的数量

vim /etc/security/limits.conf

*  soft    nofile          65536

*  hard    nofile          65536

*  soft    nproc           32000

*  hard    nproc           32000

*  soft    memlock         unlimited

*  hard    memlock         unlimited

vim /etc/systemd/system.conf

优化elasticsearch用户拥有的内存权限

vim /etc/sysctl.conf

在ES内存设置方面,可以遵循以下原则:

1.当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给操作系统,供lucene使用

2.当机器内存大于64G时,遵循原则:建议分配给ES分配 4~32G 的内存即可,其它内存留给操作系统,供lucene使用

一个进程可以拥有的最大内存映射区域数,参考数据(分配 2g/262144,4g/4194304,8g/8388608)

sysctl -p

需重启系统生效配置

reboot

⑥启动elasticsearch是否成功开启

systemctl enable --now elasticsearch.service

⑦查看节点信息

浏览器访问  http://192.168.130.10:9200  、 http://192.168.130.20:9200、 http://192.168.130.30:9200 查看节点 Node01、Node02 、Node03的信息

2、安装 Elasticsearch-head 插件

Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。

作用:在web界面实现图形化查看es集群状态,可以在任意一个es节点安装

安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。

node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。

①编译安装 node

上传软件包 node-v8.2.1.tar.gz 到/opt

yum install gcc gcc-c++ make -y

tar zxvf node-v8.2.1.tar.gz

cd node-v8.2.1/

./configure && make -j2 && make install

②安装 phantomjs

上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到/opt

cd /opt

tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2

cd /opt/phantomjs-2.1.1-linux-x86_64/bin

cp phantomjs /usr/local/bin

③安装 Elasticsearch-head 数据可视化工具

上传软件包 elasticsearch-head-master.zip 到/opt

cd /opt

unzip elasticsearch-head-master.zip

cd /opt/elasticsearch-head/

npm install             #安装依赖包

④修改 Elasticsearch 主配置文件

vim /etc/elasticsearch/elasticsearch.yml

在末尾添加

http.cors.enabled: true

http.cors.allow-origin: "*"

systemctl restart elasticsearch

⑤启动 elasticsearch-head 服务

必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败

cd /opt/elasticsearch-head-master/

npm run start &

⑥通过 Elasticsearch-head 查看 Elasticsearch 信息

浏览器访问 http://192.168.130.30:9100/

⑦插入索引

通过命令插入一个测试索引

命令格式:

创建索引
curl -X PUT[|POST] http://IP:9200/<索引名>[/<类型>/<文档ID>?pretty&pretty] \
[-H 'content-Type: application/json' -d '{"键名1":"键值","键名2":"键值"}']

删除索引
curl -X DELETE http://IP:9200/<索引名>[,<索引名2>,....]

查看索引配置
curl -X GET http://IP:9200/<索引名>/_settings

修改索引配置
curl -X PUT http://IP:9200/<索引名>/_settings \
-H 'content-Type: application/json' -d '{"键名":"键值"}'

创建索引别名
curl -X POST http://IP:9200/_aliases \
-H 'content-Type: application/json' -d '{"actions":[{"add":{"index":"索引名","alias":"索引别名"}}]}'

删除索引别名
curl -X POST http://IP:9200/_aliases \
-H 'content-Type: application/json' -d '{"actions":[{"remove":{"index":"索引名","alias":"索引别名"}}]}'

3、 ELK Logstash 部署(在 Nginx 节点上操作)

Logstash 一般部署在需要监控其日志的服务器。在本案例中,Logstash 部署在 nginx 服务器上,用于收集 nginx 服务器的日志信息并发送到 Elasticsearch。

①关闭防火墙和安全机制

 systemctl disable --now firewalld

 setenforce 0

②更改主机名

hostnamectl set-hostname nginx

③设置Java环境

 tar xf jdk-8u361-linux-x64.tar.gz

 mv jdk1.8.0_361/ /usr/local/

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/local/jdk1.8.0_361

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile.d/java.sh

java -version

④安装nginx服务

yum -y install epel-release.noarch

yum -y install nginx

systemctl enable --now nginx

⑤安装logstash

上传软件包 logstash-6.7.2.rpm 到/opt目录下

cd /opt

rpm -ivh logstash-6.7.2.rpm                          

systemctl enable --now logstash.service

ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

⑥测试 Logstash

Logstash 命令常用选项:

-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。

-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。

-t:测试配置文件是否正确,然后退出。

-w:指定filter线程数量,默认线程数是5

-l:指定日志文件名称

logstash -e 'input { stdin{} } output { stdout{} }'

logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.130.10:9200"] } }'

⑦定义 logstash配置文件,读取nginx日志

Logstash 配置文件基本由三部分组成:input、output 以及 filter(可选,根据需要选择使用)

●input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等

file   beats   kafka   redis   stdin

●filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式

grok        对若干个大文本字段进行再分割成一些小字段   (?<字段名>正则表达式)   字段名: 正则表达式匹配到的内容

date         对数据中的时间格式进行统一和格式化

mutate     对一些无用的字段进行剔除,或增加字段

mutiline    对多行数据进行统一编排,多行合并或拆分

●output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch

elasticsearch   stdout

vim /etc/logstash/conf.d/nginx.conf

input{
    file {
        path => "/var/log/nginx/access.log"
        type => "nginx_access"
        start_position => "beginning"
        sincedb_path => "/etc/logstash/sincedb_path/log_progress"
        add_field => { "log_hostname" => "${HOSTNAME}" }
    }
    file {
        path => "/var/log/nginx/error.log"
        type => "nginx_error"
        start_position => "beginning"
        sincedb_path => "/etc/logstash/sincedb_path/log_progress"
        add_field => { "log_hostname" => "${HOSTNAME}" }
    }
}

#filter{}

output{
    if [type] == "nginx_access" {
    elasticsearch{
        hosts => ["192.168.130.10:9200","192.168.130.20:9200","192.168.130.30:9200"]
        index => "nginx_access-%{+yyyy.MM.dd}"
        }
    }
    if [type] == "nginx_error" {
    elasticsearch{
        hosts => ["192.168.130.10:9200","192.168.130.20:9200","192.168.130.30:9200"]
        index => "nginx_error-%{+yyyy.MM.dd}"
        }
    }
}

logstash -f nginx.conf               #启动logstash

4、ELK Kiabana 部署 Kiabana

Kiabana可以安装在任一节点

①安装 Kiabana

上传软件包 kibana-6.7.2-x86_64.rpm 到/opt目录

cd /opt

rpm -ivh kibana-6.7.2-x86_64.rpm

②设置 Kibana 的主配置文件

vim /etc/kibana/kibana.yml

touch /var/log/kibana.log

chown kibana. /var/log/kibana.log

systemctl enable --now kibana.service

③创建索引

浏览器访问 http://192.168.130.30:5601