ELK 日志分析系统

一、基本概述

1.总体概览

ELK由ElasticSearch、Logstash、Kiabana三个开源工具组成。

  • ElasticSearch :数据存储和搜索
  • Logstash :日志收集和格式化处理
  • Kiabana:对数据进行可视化处理

进行日志处理分析,一般需要经过一下几步:

(1)将日志进行集中化管理

(2)将日志格式化(Logstash)并输出到Elasticsearch

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

(4)前端数据的展示(Kibana)

2.Elasticsearch

Elasticsearch用于数据的存储和搜索,稳定,可靠,快速,较好的水平扩展能力。

Elasticsearch核心概念

(1)接近实时(NRT):速度响应快

(2)集群(cluster):一个或者多个节点产生,通过选举产生,选择奇数台,防止脑裂

  • (3)节点(node):一台单一的服务器,多个节点为一个群集,每个节点都加入Elasticsearch。

  • (4)索引(index):类似于数据库中的"库"(存储数据)

  • (5)类型(type):相当于数据库中表,用于存放具体数据

(6)文档(document):相当于数据库中的记录,基础的信息单元

(7)分片和复制(shards & replicas):Elasticsearch 将索引分为若干份,每份称为一个分片且有独立索引功能。

3.Logstash

logstash开源实现数据的输入(output)------格式处理(filter)------输出(output)

logstash主要组件:

(1)Shipper:日志收集者,负责监控本地日志文件的变化,及时收集最新的日志文件内容

(2)Indexer:日志存储者,负责接收日志并写入到本地文件

(3)Broker:日志Hub,负责链接多个Shipper和多个Indexer

(4)Search and Storage:允许对时间进行搜索和存储

(5)Web Interface:基于web的展示界面

4.kibanna

kibanna主要用于查看在elasticsear数据以及可视化数据分析。

主要功能:

  • Elasticsearch无缝集成
  • 整合数据
  • 复杂数据分析
  • 让更多的团队成员收益
  • 接口灵活
  • 配置简单
  • 可视化多数据源
  • 简单数据导出

二、实验分析

|----------|----------------|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 主机名 | ip地址 | 操作系统 | 软件包 |
| web01 | 192.168.10.101 | CentOS7.9 | httpd filebeat-7.10.0-linux-x86_64.tar.gz |
| logstash | 192.168.10.102 | CentOS7.9 | java-11 logstash-7.10.0-linux-x86_64.tar.gz |
| elk1 | 192.168.10.103 | CentOS7.9 | java-11 elasticsearch-7.10.0-linux-x86_64.tar.gz kibana-7.10.0-linux-x86_64.tar.gz elasticsearch-head-master.zip phantomjs-2.1.1-linux-x86_64.tar.bz2 |
| elk2 | 192.168.10.104 | CentOS7.9 | java-11 elasticsearch-7.10.0-linux-x86_64.tar.gz |

1.设置基本环境

root@localhost \~\]# hostnamectl set-hostname elk1 \[root@localhost \~\]# bash systemctl stop firewalld systemctl disable firewalld setenforce 0 /etc/selinux/config 两台ES主机上设置host文件 192.168.10.103 elk1 192.168.10.104 elk2 ### 2.部署ES群集 #### **(1)创建运行用户** \[root@elk1 \~\]# useradd es \[root@elk1 \~\]# passwd es \[root@elk1 \~\]# gpasswd -a es wheel #### **(2)为用户授权** \[root@elk1 \~\]# visudo #去掉下面一行前面的注释符号 %wheel ALL=(ALL) NOPASSWD: ALL #### **(3)安装java环境** \[root@elk1 \~\]# su - es -进入es环境 \[es@elk1 \~\]$ sudo yum -y install java-11 安装java-11版本 \[es@elk1 \~\]$ java -version 检查版本 openjdk version "11.0.9.1" 2020-11-04 LTS OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing) #### **(4)为用户设置资源访问限制** \[es@elk1 \~\]$ sudo vim /etc/security/limits.conf es soft nofile 65535 (末尾添加)软限制,一个进程最多打开的文件数量 es hard nofile 65535 硬限制 es soft nproc 65535 一个用户最多能创建的进程数 es hard nproc 65535 es soft memlock unlimited 最大锁定内存地址空间(unlimited不限制) es hard memlock unlimited \[es@elk1 bin\]$ sudo vi /etc/sysctl.conf 添加下面配置: vm.max_map_count=655360 备注: 它的默认值是65536 限制一个进程可以拥有的 VMA ( 虚拟内存区域 ) 的数量 。 虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。 这个参数会影响中间件可以开启的线程数量,如果值过小,有时可能会导致有些中间件无法开启足够的线程,进而报错。 **重启系统** \[es@elk1 \~\]$ sudo reboot ### **3.部署Elasticsearch软件** #### **(1)在elk1上安装Elasticsearch软件** \[root@elk1 \~\]# su - es \[es@elk1 \~\]$ cd /opt \[es@elk1 opt\]$ sudo tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz \[root@elk1 opt\]$ sudo mv elasticsearch-7.10.0 /etc/elasticsearch \[es@elk1 opt\]$ sudo vim /etc/elasticsearch/config/jvm.options -Xms2g #23行 -Xmx2g 备注: [JVM](https://so.csdn.net/so/search?q=JVM&spm=1001.2101.3001.7020 "JVM")(java虚拟机)提供了大量的参数配置,可以通过配置这些参数对JVM进行调优。 Xms 英文解释:Initial heap size(in bytes) 中文释义:堆区初始值 使用方法:-Xms2g 或 -XX:InitialHeapSize=2048m Xmx 英文解释:Maximum heap size(in bytes) 中文释义:堆区最大值 使用方法:-Xmx2g 或 -XX:MaxHeapSize=2048m #### **2)更改Elasticsearch主配置文件** \[es@elk1 \~\]$ sudo vim /etc/elasticsearch/config/elasticsearch.yml cluster.name: my-application ##17行,群集名称 node.name: elk1 ##23行,本节点主机名 104 则为node.name: elk2 path.data: /path/to/data ##33行,数据文件路径 path.logs: /path/to/logs ##37行,日志文件路径 bootstrap.memory_lock: false ##43行,锁定物理内存 network.host: 0.0.0.0 ##55行,监听地址 http.port: 9200 ##59行,监听端口 discovery.seed_hosts: \["elk1", "elk2"\] ##68行,群集中的主机列表 cluster.initial_master_nodes: \["elk1"\] ##72,master主机名称,群集的初始化会将此节点选举为master http.cors.enabled: true 仅在master添加(103) http.cors.allow-origin: "\*" 仅在master添加(103) 注释: 最后两行是增加的参数,这样head插件可以访问es 如果bootstrap.memory_lock这项使用默认配置true,会导致硬盘频繁读,可以配置为false锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS(每秒钟输入输出)变高。 http.cors.enabled 是否支持跨域,默认为false http.cors.allow-origin 当设置允许跨域,默认为\*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 #### **(3)创建数据存放路径并授权** \[es@elk1 \~\]$ sudo mkdir -p /path/to/data \[es@elk1 \~\]$ sudo mkdir -p /path/to/logs \[es@elk1 \~\]$ sudo chown -R es:es /path/to \[es@elk1 \~\]$ sudo chown -R es:es /etc/elasticsearch/ #### **(4)启动es(启动有点慢)** \[es@elk2 root\]$ /etc/elasticsearch/bin/elasticsearch \& \[es@elk1 \~\]$ sudo netstat -anpt \| grep 9200 tcp6 0 0 :::9200 :::\* LISTEN 6987/java **(5)查看节点信息** ![](https://i-blog.csdnimg.cn/direct/5b55dfe24d4747cf9e59e27c39805d01.png) 带有星号的是master节点。 ### 4.安装head 在elk1节点上安装部署即可,head 是一个可视化工具 配置好阿里的yum源 \[es@elk1 \~\]$ sudo yum -y install npm bzip2 nodejs \[es@elk1 opt\]$ sudo tar zxvf elasticsearch-head-master.tar.gz \[es@elk1 opt\]$ cd elasticsearch-head-master/ \[es@elk1 elk1\]$ npm config set registry http://registry.npmmirror.com \[es@elk1 elasticsearch-head-master\]$ sudo npm install 安装 \[es@elk1 elasticsearch-head-master\]$ sudo npm run start \& 启动 \[es@elk1 elasticsearch-head-master\]$ sudo netstat -anpt \| grep 9100 tcp 0 0 0.0.0.0:9100 0.0.0.0:\* LISTEN 2027/grunt 9100端口是elasticsearch-head ![](https://i-blog.csdnimg.cn/direct/66197ffba6884227bac8c71c9f169c9e.png) ### 5.安装logstash 在102安装logstash \[root@localhost \~\]# hostnamectl set-hostname losstash \[root@localhost \~\]# bash \[root@losstash \~\]# systemctl stop firewalld \[root@losstash \~\]# setenforce 0 \[root@losstash \~\]# yum -y install java-11 \[root@losstash \~\]# tar zxvf logstash-7.10.0-linux-x86_64.tar.gz \[root@losstash \~\]# mv logstash-7.10.0 /etc/logstash \[root@losstash \~\]# chmod -R 777 /etc/logstash/data/ **将消息输出到屏幕** \[root@losstash \~\]# /etc/logstash/bin/logstash -e 'input { stdin { } } output { stdout {codec =\> rubydebug} }' 备注: input { stdin { } } 标准输入 output { stdout 标准输出 (屏幕) Codec 编码解码 Rubydebug 编码解码技术 **将消息输出到es** \[root@losstash \~\]# /etc/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts =\> \["192.168.10.103:9200"\] } stdout { codec =\> rubydebug }}' ![](https://i-blog.csdnimg.cn/direct/2652d6619dea47fca0fb787715ee5471.png) **使用Logstash采集系统日志并输出到elk** \[root@logstash log\]# cd /var/logmessages \[root@logstash log\]# chmod o+r messages o+r: 属主,属组其他都有读的权限 \[root@logstash log\]# cd /etc/logstash/config/ \[root@logstash config\]# vim system.config (后缀名为.config 即可) input { file { path=\>"/var/log/messages" type=\>"system" start_position=\>"beginning" } } output { elasticsearch { hosts=\>\["192.168.10.103:9200"

index=>"system-%{+YYYY.MM.dd}"

}

}

root@losstash \~\]# /etc/logstash/bin/logstash -f /etc/logstash/config/system.conf \& ### 6.安装filebeat 在产生日志的客户端服务器上安装filebeat (在101) **1.安装httpd,模拟日志服务** \[root@localhost \~\]# hostnamectl set-hostname web01 \[root@localhost \~\]# bash \[root@web01 \~\]# yum -y install httpd \[root@web01 \~\]# systemctl start httpd \[root@web01 \~\]# echo 'www.benet.com' \> /var/www/html/index.html \[root@web01 \~\]# curl 192.168.10.101 \[root@web01 \~\]# cat /var/log/httpd/access_log \[root@web01 \~\]# cat /var/log/httpd/error_log **2.安装filebeat** \[root@web01\~\]# tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz \[root@web01 \~\]# mv filebeat-7.10.0-linux-x86_64 /etc/filebeat **3.配置web01 (101)filebeat输出** **(1)修改filebeat文件,将filebeat输出的日志输入到远程的logstash** \[root@web01 \~\]# cd /etc/filebeat/ \[root@web01 filebeat\]# mv filebeat.yml filebeat.yml.bak \[root@web01 filebeat\]# vim filebeat.yml filebeat.inputs: - type: log paths: - /var/log/httpd/access_log output.logstash: hosts: \["192.168.10.102:5044"

(2)启动filebeat服务

root@web01 \~\]# /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml \& 备注: 关闭filebeat \[root@localhost filebeat\]# jobs -l 然后杀死对应的进程ID ### 7.修改logstash配置文件 如果发现logstash属于开启状态,就先关闭掉 可以先查一下logstash的进程,netstat -anpt \| grep 5044,再杀死这个进程 如果要把日志提交给ES,可以使用如下内容 \[root@logstash \~\]# vim /etc/logstash/config/beats.conf input { beats { port =\> "5044" codec =\> "json" } } output{ elasticsearch { hosts =\> \["192.168.10.103:9200"

index => "weblog-beat-%{+YYYY.MM.dd}"

}

}

8.运行logstash

/etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf --path.data=/etc/logstash/config.d/web01 &

备注:
如果需要同时运行多个logstash,需要使用不同的路径保存不同的日志数据。--path.data用来指定数据文件路径

访问一下web01的网站,产生一个日志。

测试

9.安装kibana

用es用户身份运行,在elk1上安装Kibana

es@elk1 opt\]$ sudo tar zxvf kibana-7.10.0-linux-x86_64.tar.gz \[es@elk1 opt\]$ sudo mv kibana-7.10.0-linux-x86_64 /etc/kibana \[es@elk1 opt\]$ sudo chown -R es:es /etc/kibana/ **修改Kibana主配置文件** \[es@elk1 opt\]$ sudo vim /etc/kibana/config/kibana.yml server.port: 5601 ##2行,监听端口 server.host: "0.0.0.0" ##7行,监听地址 elasticsearch.hosts: "http://192.168.10.103:9200" ##28行,ES主机的IP地址 kibana.index: ".kibana" ##32行 i18n.locale: "zh-CN" 可以修改为中文 **启动Kibana服务** \[es@elk1 opt\]$ /etc/kibana/bin/kibana \& **验证Kibana** http://192.168.10.103:5601 ![](https://i-blog.csdnimg.cn/direct/b52f3eb066ea4afea8aee59fe7a4e7fa.png) ![](https://i-blog.csdnimg.cn/direct/b3296d7e1ec24626ac7a49038872c733.png)

相关推荐
starandsea6 小时前
gitlab解决传过大文件后删除导致pack过大问题
大数据·elasticsearch·gitlab
大海绵啤酒肚8 小时前
EL(F)K日志分析系统
运维·elasticsearch·云计算
Elasticsearch17 小时前
如何在 AWS EC2 上安装和配置 Elasticsearch
elasticsearch
帅帅梓19 小时前
ELK kibana
elk
Elasticsearch20 小时前
Elastic AI agent builder 介绍(二)
elasticsearch
维尔切1 天前
ELK日志系统部署与使用(Elasticsearch、Logstash、Kibana)
elk·elasticsearch·jenkins·kibana·logstash
帅帅梓1 天前
ELK es+logstash
大数据·elk·elasticsearch
Elasticsearch2 天前
Elastic Observability 中的 Streams 如何简化保留管理
elasticsearch