ELK由ElasticSearch、Logstash、Kiabana三个开源工具组成。
进行日志处理分析,一般需要经过一下几步:
(1)将日志进行集中化管理
(2)将日志格式化(Logstash)并输出到Elasticsearch
(3)对格式化后的数据进行索引和存储(Elasticsearch)
(4)前端数据的展示(Kibana)
Elasticsearch用于数据的存储和搜索,稳定,可靠,快速,较好的水平扩展能力。
Elasticsearch核心概念
(1)接近实时(NRT):速度响应快
(2)集群(cluster):一个或者多个节点产生,通过选举产生,选择奇数台,防止脑裂
(3)节点(node):一台单一的服务器,多个节点为一个群集,每个节点都加入Elasticsearch。
(4)索引(index):类似于数据库中的“库”(存储数据)
(5)类型(type):相当于数据库中表,用于存放具体数据
(6)文档(document):相当于数据库中的记录,基础的信息单元
(7)分片和复制(shards & replicas):Elasticsearch 将索引分为若干份,每份称为一个分片且有独立索引功能。
logstash开源实现数据的输入(output)——格式处理(filter)——输出(output)
logstash主要组件:
(1)Shipper:日志收集者,负责监控本地日志文件的变化,及时收集最新的日志文件内容
(2)Indexer:日志存储者,负责接收日志并写入到本地文件
(3)Broker:日志Hub,负责链接多个Shipper和多个Indexer
(4)Search and Storage:允许对时间进行搜索和存储
(5)Web Interface:基于web的展示界面
kibanna主要用于查看在elasticsear数据以及可视化数据分析。
主要功能:
主机名 | 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 |
[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
[root@elk1 ~]# useradd es
[root@elk1 ~]# passwd es
[root@elk1 ~]# gpasswd -a es wheel
[root@elk1 ~]# visudo
#去掉下面一行前面的注释符号
%wheel ALL=(ALL) NOPASSWD: ALL
[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)
[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
[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
[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 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。
[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/
[es@elk2 root]$ /etc/elasticsearch/bin/elasticsearch &
[es@elk1 ~]$ sudo netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 6987/java
(5)查看节点信息
带有星号的是master节点。
在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
在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 &
在产生日志的客户端服务器上安装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"]
[root@web01 ~]# /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
备注:
关闭filebeat
[root@localhost filebeat]# jobs -l
然后杀死对应的进程ID
如果发现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}"
}
}
/etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf --path.data=/etc/logstash/config.d/web01 &
备注:
如果需要同时运行多个logstash,需要使用不同的路径保存不同的日志数据。--path.data用来指定数据文件路径
访问一下web01的网站,产生一个日志。
测试
用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