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(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)查看节点信息

带有星号的是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

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 }}'

使用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

相关推荐
arnold661 小时前
探索 ElasticSearch:性能优化之道
大数据·elasticsearch·性能优化
成长的小牛2334 小时前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客5 小时前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
启明真纳6 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
幽弥千月15 小时前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https
IT猿手15 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
运维&陈同学15 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
Y编程小白1 天前
Git版本控制工具--基础命令和分支管理
大数据·git·elasticsearch
酱学编程1 天前
ES搜索原理
大数据·elasticsearch·搜索引擎
流穿1 天前
ELK系列-(六)Redis也能作为消息队列?(下)
数据库·redis·ubuntu·elk·docker·容器