一、基本概述
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)查看节点信息**  带有星号的是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  