一、ELK 平台介绍
1、ELK 概述
在当今数字化转型加速的背景下,企业 IT 系统每天都会产生海量的日志数据,这些数据涵盖了应用运行状态、用户行为、安全事件等关键信息。然而,传统的日志管理方式由于分散存储、检索效率低、缺乏深度分析能力等问题,已经难以满足企业高效运维与业务洞察的需求。
ELK 作为业界主流的开源日志分析解决方案,完美地解决了这些问题。它由 Elasticsearch、Logstash 和 Kibana 三个开源工具组成,通过 Elasticsearch 的分布式搜索与分析能力、Logstash 的数据管道处理、Kibana 的可视化交互,构建了从日志采集、清洗、存储到实时分析的完整闭环。
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志还可以了解服务器的负荷、性能和安全性,从而及时采取措施纠正错误。
通常,日志被分散存储在不同的设备上。如果管理数十上百台服务器,使用依次登录每台机器的传统方法查阅日志,会显得非常繁琐和效率低下。因此,集中化的日志管理势在必行,例如使用开源的 syslog 将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情。一般使用 grep、awk 和 wc 等 Linux 命令能实现检索和统计,但对于要求更高的查询、排序和统计等要求以及庞大的机器数量,这些方法就显得力不从心了。而 ELK 平台能够很好地解决这些问题。
2、Elasticsearch
(1)ElasticSearch 概述
Elasticsearch 是一个基于 Lucene 的搜索服务器,它提供了分布式、多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 用 Java 开发,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。它设计用于云计算中,能够达到实时搜索,具有稳定、可靠、快速、安装使用方便等特点。
(2)Elasticsearch 核心概念
-
接近实时 (NRT):Elasticsearch 是一个接近实时的搜索平台,这意味着从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟,通常是 1 秒。
-
集群 (cluster):一个集群由一个或多个节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,默认名字是 "elasticsearch"。节点通过指定集群名字来加入集群。
-
节点 (node):一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。节点也由名字标识,默认名字是随机的漫威漫画角色名。节点可通过配置集群名称加入指定集群,默认加入 "elasticsearch" 集群。
-
索引 (index):一个索引是拥有几分相似特征的文档的集合。例如,可以有客户数据索引、产品目录索引、订单数据索引等。索引由名字标识(必须全为小写字母),对索引中的文档进行索引、搜索、更新和删除时都要使用该名字。一个集群中可定义任意多的索引。
-
类型 (type):在一个索引中,可以定义一种或多种类型。类型是索引的逻辑分类 / 分区,语义由用户定义。通常为具有一组共同字段的文档定义一个类型。例如,博客平台的索引中,可定义用户数据类型、博客数据类型、评论数据类型等。
-
文档 (document):文档是可被索引的基础信息单元。例如,一个客户的文档、一个产品的文档、一个订单的文档等。文档以 JSON 格式表示,JSON 是互联网中广泛使用的数据交互格式。在 index/type 中可存储任意多的文档,文档必须被索引并赋予索引的 type。
-
分片和复制 (shards&replicas):一个索引可以存储超出单个结点硬件限制的大量数据。为解决此问题,Elasticsearch 提供将索引划分成多份的能力,这些份称为分片。创建索引时可指定分片数量,每个分片本身是一个功能完善且独立的 "索引",可放置到集群中的任何节点上。分片的重要性体现在:允许水平分割 / 扩展内容容量;允许在分片上进行分布式、并行操作,提高性能 / 吞吐量。
在网络 / 云环境中,失败可能随时发生,因此 Elasticsearch 允许创建分片的一份或多份拷贝,即复制分片或复制。复制的重要性在于:在分片 / 节点失败时提供高可用性,且复制分片不与主分片置于同一节点;扩展搜索量 / 吞吐量,搜索可在所有复制上并行运行。
每个索引可分成多个分片,也可复制 0 次或多次。复制后,索引有主分片(复制源)和复制分片(主分片拷贝)之分。分片和复制数量可在索引创建时指定,索引创建后可动态改变复制数量,但不能改变分片数量。默认情况下,Elasticsearch 7.0 以前的版本中每个索引被分片 5 个主分片和 1 个复制,在两个节点的场景中,每个索引将会有 5 个主分片和另外 5 个副本分片,每个索引总共就有 10 个分片。而在 Elasticsearch 7.0 以后的版本中默认分片数做了调整,默认索引的主分片数量为 1,副本分片数量为 1。
3、Logstash
(1)Logstash 介绍
Logstash 由 JRuby 语言编写,运行在 Java 虚拟机 (JVM) 上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出,具有强大的插件功能,常用于日志处理。
Logstash 的设计理念是只做三件事:数据输入、数据加工、数据输出。
(2)Logstash 工作的三个阶段
- input 数据输入端 :可以接收来自任何地方的源数据,例如:
- file:从文件中读取。
- syslog:监听在 514 端口的系统日志信息,并解析成 RFC3164 格式。
- redis:从 redis-server list 中获取。
- beat:接收来自 Filebeat 的事件。
- Filter 数据中转层 :主要进行格式处理、数据类型转换、数据过滤、字段添加修改等,常用过滤器如下:
- grok:通过正则解析和结构化任何文本。
- mutate:在事件字段执行一般的转换,可重命名、删除、替换和修改事件字段。
- drop:完全丢弃事件,如 debug 事件。
- clone:复制事件,可能添加或者删除字段。
- geoip:添加有关 IP 地址地理位置信息。
- output 数据输出端 :是 logstash 工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:
- elasticsearch:发送事件数据到 Elasticsearch,便于查询、分析、绘图。
- file:将事件数据写入到磁盘文件上。
- mongodb:将事件数据发送至高性能 NoSQL mongodb,便于永久存储、查询、分析、大数据分片。
- redis:将数据发送至 redis-server,常用于中间层暂时缓存。
- graphite:发送事件数据到 graphite。
- statsd:发送事件数据到 statsd。
4、Kibana
(1)Kibana 介绍
Kibana 是一个设计用于和 Elasticsearch 配置工作的开源分析和可视化平台,可以用它进行搜索、查看、集成 Elasticsearch 中的数据索引,利用各种图表、报表、地图组件轻松对数据进行可视化分析。
(2)Kibana 主要功能
- Elasticsearch 无缝集成
- 整合数据
- 复杂数据分析
- 让更多的团队成员收益
- 接口灵活
- 配置简单
- 可视化多数据源
- 简单数据导出
二、部署ELK
03/04
vim /etc/hosts
192.168.10.103 elk1
192.168.10.104 elk2
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
useradd es
passwd es
gpasswd -a es wheel
visudo
%wheel ALL=(ALL) NOPASSWD: ALL #110
su - es
sudo dnf -y install java-11
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
sudo vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
exit
reboot
cd /opt
将所需软件包上传到这个位置:elasticsearch
su - es
cd /opt
sudo tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
sudo mv elasticsearch-7.10.0 /etc/elasticsearch
sudo vim /etc/elasticsearch/config/jvm.options
-Xms2g #23
-Xmx2g
sudo vim /etc/elasticsearch/config/elasticsearch.yml
cluster.name: my-application #17,群集名称
node.name: elk1 #23,本节点主机名,以elk1节点为例,其它节点请改成相对应的节点名称
path.data: /path/to/data #33,数据文件路径
path.logs: /path/to/logs #37,日志文件路径
bootstrap.memory_lock: false #43,锁定物理内存
network.host: 0.0.0.0 #55,0.0.0.0,监听地址
http.port: 9200 #59,9200,监听端口
discovery.seed_hosts: ["elk1", "elk2"] #68,群集中的主机列表
cluster.initial_master_nodes: ["elk1"] #72,master主机名称,群集的初始化会将此节点选举为master
sudo mkdir -p /path/to/data
sudo mkdir -p /path/to/logs
sudo chown -R es:es /path/to
sudo chown -R es:es /etc/elasticsearch/
/etc/elasticsearch/bin/elasticsearch &
#等一会
netstat -anpt | grep 9200
192.168.10.103:9200/_cat/nodes
02
systemctl stop firewalld
setenforce 0
dnf -y install java-11
上传logstash
tar zxvf logstash-7.10.0-linux-x86_64.tar.gz
mv logstash-7.10.0 /etc/logstash
chmod -R 777 /etc/logstash/data/
/etc/logstash/bin/logstash -e "input { stdin{}} output {stdout{codec => rubydebug}}"
#等一会,successfully started,会有端口显示9600
chmod o+r /var/log/messages
ll /var/log/messages
cd
cd /etc/logstash/
ls
cd config
ls
vim system.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.10.103:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
/etc/logstash/bin/logstash -f /etc/logstash/config/system.conf &
03
su - es
cd /opt
上传kibana
ls
sudo tar zxvf kibana-7.10.0-linux-x86_64.tar.gz
sudo mv kibana-7.10.0-linux-x86_64 /etc/kibana
sudo chown -R es:es /etc/kibana/
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
i18n.locale: "zh-CN" #107,末尾
/etc/kibana/bin/kibana &
192.168.10.103:5601/
01
dnf -y install httpd
systemctl start httpd
systemctl stop firewalld
echo "nihao">/var/www/html/index.html
curl 192.168.10.101
cat /var/log/httpd/access_log
上传filebeat
tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz
mv filebeat-7.10.0-linux-x86_64 /etc/filebeat
cd /etc/filebeat/
mv filebeat.yml filebeat.yml.bak
vim filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/httpd/access_log
output.logstash:
hosts: ["192.168.10.102:5044"]
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
reboot
/etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
jobs -l
02
vim /etc/logstash/config/beats.conf
input {
beats {
port=>"5044"
code=>"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/web01 &
#端口号9601
192.168.10.103:5601