ELK(+Filebeat+Kafka)
<h1>概述</h1>
<h3>为什么用到ELK:</h3>
<pre><code>一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制
ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。</code></pre>
<h3>ELK简介:</h3>
<pre><code>ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat隶属于Beats。目前Beats包含四种工具:
Packetbeat(搜集网络流量数据)
Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat(搜集文件数据)
Winlogbeat(搜集 Windows 事件日志数据)</code></pre>
<h3>ELK架构图</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/45ea9b41523ad494320c5c13a69a446f?showdoc=.jpg" alt="" /></p>
<pre><code>这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高,和java项目耦合度高,收集的日志只能是java项目。另外没有消息队列缓存,存在数据丢失隐患。
此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。</code></pre>
<h3>ELK+Filebeat+Kafka架构图</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/4ecacf0f9711d8caeb792905af7e9a47?showdoc=.jpg" alt="" /></p>
<pre><code>此种架构引入了Filebeat更灵活,消耗资源更少,位于各个节点上的Filebeat先将数据/日志传递给Kafka,并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka,所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。</code></pre>
<p><br></p>
<h1>环境安装</h1>
<h3>ELK架构</h3>
<h4>a.下载解压elk</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/36e96a754aeed890f52450c80a20bc78?showdoc=.jpg" alt="" /></p>
<pre><code>wget http://10.1.4.70:82/page/ops/elkfk/docker-elk.tar.gz
tar -xzvf docker-elk.tar.gz</code></pre>
<h4>b.运行elk</h4>
<pre><code>cd docker-elk/
docker-compose up -d</code></pre>
<h4>c.查看elk这3个容器是否启动成功</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/5a3563e5dd40ef7bf91623df3b5fc1f4?showdoc=.jpg" alt="" /></p>
<pre><code>docker-compose ps</code></pre>
<h3>ELK+Filebeat+Kafka架构</h3>
<h4>a.kafka+zk安装与启动</h4>
<pre><code>参照 https://www.showdoc.cc/chlingm?page_id=4274174840344239</code></pre>
<h4>b.filebeat安装</h4>
<h5>b.1引入key</h5>
<pre><code>rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch</code></pre>
<h5>b.2创建yum源文件</h5>
<pre><code>在/etc/yum.repos.d/ 目录下创建elastic.repo文件,内容如下:
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md</code></pre>
<h5>b.3安装</h5>
<pre><code>yum install filebeat</code></pre>
<h5>b.4配置输入输出流</h5>
<pre><code>在/usr/share/filebeat/bin目录下,编辑filebeat.yml,内容如下:
name: 10.1.4.72 # filebeat安装地址的域名(ip)
filebeat.inputs:
- type: log
enabled: true
tail_files: true
paths:
- /data/logs/*/*.* # 需要监测文件的路径
output.kafka:
hosts: ["10.1.4.72:9093"] # kafka地址
topic: "nisbos_logs" # topic
console:
codec.format: #格式化输出
string: '%{[host.name]} %{[message]}'</code></pre>
<h5>b.5启动Filebeat</h5>
<pre><code>在/usr/share/filebeat/bin目录下,执行:
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &</code></pre>
<p><br></p>
<h1>场景预览</h1>
<h3>ELK</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/1109857e337464d455ec558d2ae9eee2?showdoc=.jpg" alt="" /></p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ebfbc5f3557f875b22106f30ea98fe4e?showdoc=.jpg" alt="" /></p>
<pre><code>上图可以看到,通kibana可以查询到java项目发送的日志</code></pre>
<h3>ELK+Filebeat+Kafka</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/41b1aa36d81d6b74564579a4a60b1d89?showdoc=.jpg" alt="" /></p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9dbaa213ce4e7eef35ef9ee318704a85?showdoc=.jpg" alt="" /></p>
<pre><code>上图可以看到,通kibana可以查询到filebeat采集到的日志</code></pre>
<p><br></p>
<h1>快速入门</h1>
<h3>ELK客户端(参照nisbos-elk-client项目)</h3>
<h5>a.配置Logstash地址以及elk日志的名称</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/5589e19689618858d840745baa438397?showdoc=.jpg" alt="" /></p>
<pre><code>参照/nisbos-thirdparty/nisbos-elk-client/src/main/resources/logback.xml</code></pre>
<h5>b.输出日志</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/0f770e94b8873fd14deb40fdae80f499?showdoc=.jpg" alt="" /></p>
<pre><code>参照/nisbos-thirdparty/nisbos-elk-client/src/test/java/com/nisbos/elk/client/test/ElkTests.java,nisbos_elk必须和logback.xml配置的elk日志的名称相同 </code></pre>
<h3>ELK+Filebeat+Kafka日志采集</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c3e1b1ca6da35b82424e056e889c3336?showdoc=.jpg" alt="" /></p>
<pre><code>根据filebeat配置的采集路径去存放日志即可</code></pre>
<h3>kibana展示</h3>
<h5>a.登录</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e7d8066f75aaf9537a82b8fd3c61504e?showdoc=.jpg" alt="" />
<a href="http://kibana的主机:5601">http://kibana的主机:5601</a>
elastic/changeme</p>
<h5>a.创建索引规则</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/d339bffe7cc8ecc28312cdf6b20cbbdd?showdoc=.jpg" alt="" /></p>
<h5>b.查看索引规则数据</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/2ae26911b99619eb64a81d6d2050dac0?showdoc=.jpg" alt="" /></p>
<h5>c.打开已保存的查询条件</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/80cdefafd055fd27d5d31efe231067aa?showdoc=.jpg" alt="" /></p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/5cebfd9d3815c4ea0da77dfc9eed0541?showdoc=.jpg" alt="" /></p>