目录
(2)将消息输出到es(如果没有安装 head 组件,此步骤省去)
1,在产生日志的客户端服务器上安装filebeat(本案例为elk2主机)
(1)修改 filebeat 文件,将 filebeat 输出的日志输入到远程的 logstash
4,修改 logstash 的配置文件,使日志输出到elasticsearch
一,ELK平台介绍
1.ELK 概述
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 grep、awk 和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash 和Kiabana 三个开源工具组成。
Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 |
Logstash 是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。 |
Kibana 也是一个开源和免费的工具,它Kibana可以为Logstash和.ElasticSearch 提供的日志分析友好的web 界面,可以帮助您汇总、分析和搜索重要数据日志。 |
进行日志处理分析,一般需要经过一下几步:
将日志进行集中化管理 |
将日志格式化(Logstash)并输出到Elasticsearch |
对格式化后的数据进行索引和存储(Elasticsearch) |
前端数据的展示(Kibana) |
2,Elasticsearch
(1) ElasticSearch 概述
Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
(2)Elasticsearch核心概念
(1)接近实时(NRT)
Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。
(2)集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
(3)节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 Elasticsearch 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何 Elasticsearch 节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。
(4)索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个家引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。
(5)类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定文另一个类型。
(6)文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以IS0N(Javascript 0bject Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。在一个 index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的 type。
(7)分片和复制(shards&replicas)
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据 1TB的磁盘空间,而任一节点都没有这样大的磁盘空间:或者单个节点处理搜索请求,响应太慢。为了解决这个问题,lasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因:
允许你水平分割/扩展你的内容容量。 |
允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。 |
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。
复制之所以重要,有两个主要原因:在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch 中的每个索引被分片5个主分片和1个复制,在两个节点的场景中,每个索引将会有5个主分片和另外5个副本分片,每个索引总共就有 10 个分片。但是在 Elasticsearch 7.0 以后的版本中默认分片数做了调整中,默认索引的主分片(Primary Shards)数量为1,副本分片(ReplicaShards)数量为1
3,Logstash
(1 )Logstash 介绍
Logstash 有 JRuby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Ligstash 具有强大的插件功能,常用于日志处理。
Logstash 的设计理念:Logstash 只做三件事,数据输入、数据加工、数据输出
(2) Logstash 工作的三个阶段
(1)input 数据输入端,可以接收来自任何地方的源数据。
file: | 从文件中读取 |
syslog: | 监听在 514端口的系统日志信息,并解析成RFC3164 格式。 |
redis: | 从redis-server list 中获取 |
beat: | 接收来自Filebeat 的事件 |
(2)Filter 数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加,修改等,常用的过滤器如下。
grok: | 通过正则解析和结构化任何文本。 |
mutate: | 在事件字段执行一般的转换。可以重命名、删除、替换和修改事件字段。 |
drop: | 完全丢弃事件,如debug事件。 |
clone: | 复制事件,可能添加或者删除字段。 |
geoip: | 添加有关 IP 地址地理位置信息。 |
(3)output 是logstash 工作的最后一个阶段,负贵将数据输出到指定位置兼容大多数应用,常用的有:
elasticsearch: | 发送事件数据到 Elasticsearch,便于查询,分析,绘图 |
file: | 将事件数据写入到磁盘文件上。 |
mongodb: | 将事件数据发送至高性能 NoSQLmongodb,便于永久存储,查询,分析,大数据分片。 |
redis: | 将数据发送至 redis-server,常用于中间层暂时缓存。 |
graphite: | 发送事件数据到graphite |
statsd: | 发送事件数据到 statsd。 |
4,Kibana
(1) Kibana 介绍
Kibana 是一个设计使用和 Elasticsearch 配置工作的开源分析和可视化平台。可以用它进行搜索、查看、集成 Elasticsearch 中的数据索引。可以利用名种图表、报表、地图组件轻松的对数据仅进行可视化分析
(2)Kibana主要功能
Elasticsearch 无缝集成
整合数据
复杂数据分析
让更多的团队成员收益
接口灵活
配置简单
可视化多数据源
简单数据导出
二,部署 ES群集
设置 3 台 ES 主机的系统环境(以 elkl 为例,其它两台操作类似)
1,基本配置
(1)设置主机名
按照主机清单为每一台主机设置主机名(elk1、elk2)
(2) 在两台 ES 主机上设置 hosts 文件
vim >/etc/hosts
192.168.10.101 elk1
192.168.10.102 e1k2
(3)关闭所有节点的防火墙
systemctl stop firewalld
systemetl disable firewalld
setenforce 0
sed -i"s/SELINUX=enforcing/SELINUX=disabled/" /ete/selinux/config
(4)创建 es 运行用户
useradd es
(5)安装 java 环境
dnf -y install java-11
java -version
(6)为用户设置资源访问限制
wim /etc/security/limits.conf
es soft nofile 65535 (文件末尾添加)
es hard nofile 65535
es soft nproc 65535
es hard nproc 65535
es soft memlock unlimited
es hard memlock unlimited
备注:
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.amx_map_count=655360 (文件末尾)
sudo sysctl -p
备注:
它的默认值是 65536限制一个进程可以拥有的 VMA(虚拟内存区域)的数量虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。
这个参数会影响中间件可以开启的线程数量,如果值过小,有时可能会导致有些中间件无法开启足够的线程,进而报错。
2,安装Elasticsearch
tar zxvf elasticsearch-7,10,0-linux-x86 64.tar. gz
mv elasticsearch-7.10.0 /usr/local/elasticsearch
vim /ete/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g
备注:
JVM(java 虚拟机)提供了大量的参数配置,可以通过配置这些参数对JM 进行调优。
英文解释:Initial heap size(in bytes)
中文释义:堆区初始值
使用方法:-Xms2g或-XX:InitialHeapSize=2048m
况做X
英文解释:Maximum heap size(in bytes)
中文释义:堆区最大值
使用方法:-Xmx2g或-XX:MaxHeapSize-2048m
(1)Elasticsearch主配置文件
vim /usr/local/elasticsearch/config/elasticsearch. yml
cluster.name:kge-elk-cluster
node.name:/elk/data
path.logs:/elk/data
bootstrap.memory lock: false
network.host:0.0.0.0
http.port:9200
discovery.seed hosts: ["elkl", "elk2", "elk3"]
cluster.initial master nodes:["elkl"]
(2)创建数据存放路径并授权
mkdir -p/elk/data
mkdir -p /elk/logs
chown -R es;es /elk/
chown -R es:es /usr/local/elasticsearch/
(3)启动es
su-es
/usr/local/elasticsearch/bin/elasticsearch &
sudo netstat -anpt | grep 9200
(4)查看节点信息
curl http://192.168,10.103:9200/ cat/nodes
三,安装logstash
1,在logstash服务器上安装logstash
systemctl stop firewalld
setenforce 0
yum -y install java-1l
tar zxvf logstash-7.10.0-linux-x86 64. tar.gz
mv logstash-7.10,0 /usr/local/logstash
chmod -R 777 /usr/local/logstash/data/
2,测试安装结果
(1)直接将消息输出到屏幕
/etc/logstash/bin/logstash -e 'input { stdin{} } output { stdout {codec => rubydebug} }'
注意:执行该命令后稍微等一下,会出现一个消息格式,可以输入一些字符串作为该消息的内容退出按 Ctrl+C,如果命令失败,剔除logstash 目录的的 data 子日录例如下列显示:
nihao
{
"@timestamp"=>2020-03-14T03:20:24.2297."@version"=>"1”,"host”=>“elk1"message”=> "nihao“
}
(2)将消息输出到es(如果没有安装 head 组件,此步骤省去)
3,Logstash 配置文件
Logstash 配置文件基本由三部分组成:input、output 以及 filter(根据需要)。因此标准的配置文件格式如下所示。
input {...}
filter {...}
output {...}
在每个部分中,也可以指定多个访问方式。例如,若要指定两个日志来源文件,则格式如下所示。
input {
file i path =>"/var/log/messages" type =>"syslog"}file {path =>"/var/log/apache/access.log" type =>"apache"}
}
下面通过修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。
chmod otr /var/log/messages
ll/var/log/messages
touch /usr/local/logstash/system.conf
vim /usr/local/logstash/system.conf
四,Filebeat
1,在产生日志的客户端服务器上安装filebeat(本案例为elk2主机)
yum -y install httpd
ystemctl start httpd
root@elk2#echo 'www.kgc.com'>/var/www/html/index.html
curl 192.168.10.102
cat /var/log/httpd/access_log
2,安装 filebeat
tar zxvf filebeat-7.10.0-linux-x86 64. tar. gz
mv filebeat-7.10,0-linux-x86 64 /usr/local/filebeat
3,配置 web01服务器 filebeat 的输出
(1)修改 filebeat 文件,将 filebeat 输出的日志输入到远程的 logstash
cd /usr/local/filebeat/
mv filebeat,yml filebeat.yml.bak
vim filebeat.yml
4,修改 logstash 的配置文件,使日志输出到elasticsearch
如果发现 1ogstash 属于开启状态,就先关闭掉可以先查一下 logstash 的进程,netstat -anpt|grep 5044,再杀死这个进程
如果要把日志提交给ES,可以使用如下内容
vim /usr/local/logstash/config/beats.conf
备注:
Codec 是 logstash 从 1.3.0 版开始新引入的概念(Codec 来自 Coder(编码)/decoder(解码)两个单词的首字母缩写)。
在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,这全是因为有了codec 设置。所以,Logstash 不只是一个input|filteroutput 的数据流,而是一个inputdecode filterencodeoutput 的数据流!codec 就是用
米decode、encode 事件的。codec 的引入,使得 1ogstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等。
5,运行 logstash 并验证
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/beats.conf -path.data=/usr/local/logstash/config. d/web0l &
备注:如果需要同时运行多个 logstash,需要使用不同的路径保存不同的日志数据。-path.data用来指定数据文件路径
查看索引,发现新增了一个 weblog-beat-2025.04.28 的索引
curl -XGET "http://localhost:9200/ cat/indices?v"
五,安装Kibana
1,在elkl上安装Kibana
tar zxvf kibana-7,10,0-linux-x86 64.tar. gz
mv kibana-7.10.0-linuxx86 64 /usr/local/kibana
2,修改Kibana 主配置文件
vim /usr/local/kibana/config/kibana.yml
server.port:5601
server.host:“0.0.0.0”
elasticsearch.hosts:"http://192.168.10.103:9200
kibana.index:".kibana”
chown -R es:es /usr/local/kibana/
3,启动 Kibana服务
su - es
nohup /usr/local/kibana/bin/kibana &
4,验证 Kibana
(1)浏览器访问
http://192.168.10.101:5601
2.如果想添加第二个日志,在主菜单中找到 Management--> Stack Management,然后点击 Kibana 下的 Index Patterns,再点击右上角的 Create index pattern