使用ELK堆栈部署Kafka

通过优锐课的java架构学习分享,在本文中,我将展示如何使用ELK Stack和Kafka部署建立弹性数据管道所需的所有组件。

在发生生产事件后,恰恰在你最需要它们时,日志可能突然激增并淹没你的日志记录基础结构。 为了防止Logstash和Elasticsearch遭受此类数据突发攻击,用户部署了缓冲机制以充当消息代理。

Apache Kafka是与ELK Stack一起部署的最常见的代理解决方案。 通常,Kafka部署在托运人和索引器之间,用作收集数据的入口点:

在本文中,我将展示如何使用ELK Stack和Kafka部署建立弹性数据管道所需的所有组件:

  • ·Filebeat-收集日志并将其转发到Kafka主题。
  • ·Kafka-代理数据流并将其排队。
  • ·Logstash-汇总来自Kafka主题的数据,对其进行处理并将其发送到Elasticsearch。
  • ·Elasticsearch-为数据建立索引。
  • ·Kibana-用于分析数据。

我的环境

要执行以下步骤,我使用本地存储在AWS EC2上设置了一台Ubuntu 16.04计算机。 在现实生活中,你可能会使所有这些组件都在单独的计算机上运行。

我在VPC的公共子网中启动了实例,然后设置了一个安全组,以允许使用SSH和TCP 5601(对于Kibana)从任何地方进行访问。 最后,我添加了一个新的弹性IP地址,并将其与正在运行的实例关联。

本教程使用的示例日志是Apache访问日志。

步骤1:安装Elasticsearch

我们将从在堆栈中安装主要组件Elasticsearch开始。 从7.x版开始,Elasticsearch已与Java捆绑在一起,因此我们可以通过添加Elastic的签名密钥来直接前进:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

为了在Debian上安装Elasticsearch,我们还需要安装apt-transport-https软件包:

 sudo apt-get update

 sudo apt-get install apt-transport-https

下一步是将存储库定义添加到我们的系统中:

 echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo 

 tee -a /etc/apt/sources.list.d/elastic-7.x.list

剩下要做的就是更新你的存储库并安装Elasticsearch:

sudo apt-get update && sudo apt-get install elasticsearch

在引导Elasticsearch之前,我们需要使用Elasticsearch配置文件在/etc/elasticsearch/elasticsearch.yml中应用一些基本配置:

 sudo su

 vim /etc/elasticsearch/elasticsearch.yml

由于我们在AWS上安装Elasticsearch,因此我们将Elasticsearch绑定到localhost。 此外,我们需要将EC2实例的私有IP定义为符合主机资格的节点:

 network.host: "localhost"

 http.port:9200

 cluster.initial_master_nodes: ["<InstancePrivateIP"]

保存文件并使用以下命令运行Elasticsearch:

 sudo service elasticsearch start

要确认一切正常,请将curl指向:http:// localhost:9200,你应该看到类似以下输出的内容(在开始担心看不到任何响应之前,请给Elasticsearch一两分钟):

{

  "name" : "ip-172-31-49-60",

   "cluster_name" : "elasticsearch",

   "cluster_uuid" : "yP0uMKA6QmCsXQon-rxawQ",

   "version" : {

     "number" : "7.0.0",

     "build_flavor" : "default",

     "build_type" : "deb",

     "build_hash" : "b7e28a7",

     "build_date" : "2019-04-05T22:55:32.697037Z",

     "build_snapshot" : false,

     "lucene_version" : "8.0.0",

     "minimum_wire_compatibility_version" : "6.7.0",

     "minimum_index_compatibility_version" : "6.0.0-beta1"

   },

   "tagline" : "You Know, for Search"

 }

步骤2:安装Logstash

接下来,ELK中的“ L” — Logstash。 Logstash将要求我们安装Java 8,这很好,因为这也是运行Kafka的要求:

 sudo apt-get install default-jre

验证是否已安装Java:

 java -version

 openjdk version "1.8.0_191"

 OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)

 OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

由于我们已经在系统中定义了存储库,因此运行安装Logstash所需要做的全部工作:

 sudo apt-get install logstash

接下来,我们将配置一个Logstash管道,该管道将从Kafka主题中提取我们的日志,处理这些日志并将其发送到Elasticsearch进行索引。

让我们创建一个新的配置文件:

 sudo vim /etc/logstash/conf.d/apache.conf

 粘贴以下配置:

 input {

   kafka {

     bootstrap_servers => "localhost:9092" 

     topics => "apache" 

     }

 }

 filter {

     grok {

       match => { "message" => "%{COMBINEDAPACHELOG}" }

     }

     date {

     match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]

     }

   geoip {

       source => "clientip"

     }

 }

 output {

   elasticsearch {

     hosts => ["localhost:9200"]

   }

 }

如你所见,我们正在使用Logstash Kafka输入插件来定义Kafka主机和我们希望Logstash从中提取的主题。 我们正在对日志进行一些过滤,并将数据发送到我们的本地Elasticsearch实例。

保存文件

步骤3:安装Kibana

让我们继续进行到ELK Stack中的下一个组件-Kibana。 和以前一样,我们将使用一个简单的apt命令来安装Kibana:

 sudo apt-get install kibana

然后,我们将在以下位置打开Kibana配置文件:/etc/kibana/kibana.yml,并确保定义了正确的配置:

 server.port: 5601

 elasticsearch.url: "http://localhost:9200"

这些特定的配置告诉Kibana要连接到哪个Elasticsearch以及要使用哪个端口。

现在,我们可以从以下内容开始Kibana:

 sudo service kibana start

在浏览器中使用以下命令打开Kibana:http:// localhost:5601。 你将看到Kibana主页。

步骤4:安装Filebeat

如上所述,我们将使用Filebeat收集日志文件并将其转发到Kafka。

要安装Filebeat,我们将使用:

 sudo apt-get install filebeat

让我们在以下位置打开Filebeat配置文件:

 /etc/filebeat/filebeat.yml

 sudo vim /etc/filebeat/filebeat.yml

输入以下配置:

 filebeat.inputs:

 - type: log

   enabled: true

   paths:

     - /var/log/apache2/access.log

 output.kafka:

   codec.format:

     string: '%{[@timestamp]} %{[message]}'

   hosts: ["localhost:9092"]

   topic: apache

   partition.round_robin:

     reachable_only: false

   required_acks: 1

   compression: gzip

   max_message_bytes: 1000000

在输入部分,我们告诉Filebeat要收集哪些日志-Apache访问日志。 在输出部分,我们告诉Filebeat将数据转发到本地Kafka服务器和相关主题(将在下一步中安装)。

请注意使用codec.format指令-这是为了确保正确提取message和timestamp字段。 否则,这些行将以JSON发送到Kafka。

保存文件。

步骤4:安装Kafka

我们的最后也是最后一次安装涉及设置Apache Kafka(我们的消息代理)。

Kafka使用ZooKeeper来维护配置信息和同步,因此我们需要在设置Kafka之前安装ZooKeeper:

sudo apt-get install zookeeperd

接下来,让我们下载并解压缩Kafka:

 wget http://apache.mivzakim.net/kafka/2.2.0/kafka_2.12-2.2.0.tgz

 tar -xvzf kafka_2.12-2.2.0.tgz

 sudo cp -r kafka_2.12-2.2.0 /opt/kafka

现在我们准备运行Kafka,我们将使用以下脚本进行操作:

 sudo /opt/kafka/bin/kafka-server-start.sh

 /opt/kafka/config/server.properties

你应该开始在控制台中看到一些INFO消息:

[2019-04-22 11:48:16,489] INFO Registered

kafka:type=kafka.Log4jController MBean

(kafka.utils.Log4jControllerRegistration$)

[2019-04-22 11:48:18,589] INFO starting (kafka.server.KafkaServer)

接下来,我们将为Apache日志创建一个主题:

 bin/kafka-topics.sh --create --zookeeper localhost:2181

 --replication-factor 1 --partitions 1 --topic apache

 Created topic apache.

我们都准备开始管道。

步骤5:启动数据管道

现在我们已经准备就绪,现在该启动所有负责运行数据管道的组件了。

首先,我们将启动Filebeat:

 sudo service filebeat start

 然后,Logstash:

 sudo service logstash start

管道开始流式传输日志需要花费几分钟。 要查看Kafka的实际效果,请在单独的标签中输入以下命令:

 /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 

 localhost:9092 --topic apache --from-beginning

如果你的Apache Web服务器确实在处理请求,则应该开始在控制台中查看Filebeat将消息转发到Kafka主题的消息:

2019-04-23T13:50:01.559Z 89.138.90.236 - - [23/Apr/2019:13:50:00 +0000]

"GET /mysite.html HTTP/1.1" 200 426 "-" "Mozilla/5.0

(Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/73.0.3683.86 Safari/537.36"

2019-04-23T13:51:36.581Z 89.138.90.236 - -

[23/Apr/2019:13:51:34 +0000] "GET /mysite.html HTTP/1.1" 200 427 "-"

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"

为了确保Logstash正在聚合数据并将其运送到Elasticsearch中,请使用:

curl -X GET "localhost:9200/_cat/indices?v"

如果一切正常,你应该看到列出了logstash- *索引:

health status index                      uuid                   pri rep docs.count docs.deleted store.size pri.store.size

green  open   .kibana_task_manager       zmMH6yy8Q6yg2jJHxq3MFA   1   0          2            0     45.4kb         45.4kb

yellow open   logstash-2019.04.23-000001 rBx5r_gIS3W2dTxHzGJVvQ   1   1          9            0     69.4kb         69.4kb

green  open   .kibana_1                  rv5f8uHnQTCGe8YrcKAwlQ   1   0          5            0

如果你没有看到该索引,恐怕是时候进行一些调试了。 查看此博客文章,了解调试Logstash的一些技巧。

我们现在要做的就是在Kibana中定义索引模式以开始分析。 这是在管理→Kibana索引模式下完成的。

Kibana将识别索引,因此只需在相关字段中对其进行定义,然后继续选择时间戳字段的下一步:

创建索引模式后,你将看到所有已解析和映射字段的列表:

打开“发现”页面开始分析数据!

总结:

弹性数据管道是任何生产级ELK部署中所必需的。 日志对于将事件组合在一起至关重要,在紧急情况下最需要它们。 我们无法让我们的日志记录基础结构在最需要的确切时间点发生故障。 Kafka和类似的代理在缓冲数据流方面发挥着重要作用,因此Logstash和Elasticsearch不会在突然爆发的压力下崩溃。

上面的示例是课程的基本设置。 生产部署将包括多个Kafka实例,大量数据和更复杂的管道。 这将涉及大量的工程时间和资源,需要加以考虑。 不过,这里的说明将帮助你了解入门方法。 我还建议你看一下我们的文章,解释如何记录Kafka本身。

> 喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
 > 如果你对java技术很感兴趣也可以交流学习,共同学习进步。 
> 不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

最新文章

  1. 企业IT架构介绍
  2. 成功开发iPhone软件的10个步骤
  3. Nginx服务器之 Nginx的基本配置
  4. Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
  5. [THINKING IN JAVA]访问权限控制
  6. poj3177 &amp;&amp; poj3352 边双连通分量缩点
  7. css学习(1)-- 层叠样式表CSS的基础
  8. DropDownList 控件不能触发SelectedIndexChanged 事件
  9. css2----实现三角形和带角框
  10. ruby中symbol
  11. Tornado的一个开源社区
  12. centos下安装mysql步骤
  13. csdn 博客,你很努力,有人帮你-2015年03一个月17日本
  14. MySQL之索引优化
  15. (转)CentOS无损调整磁盘分区大小的实现方法
  16. CRT乱码问题
  17. Toggle组件切换开关,控制开关图片显示与隐藏
  18. Anfora 自动装载类
  19. 多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c
  20. Linux网络管理(一):网卡驱动与Linux内核

热门文章

  1. 124-PHP类析构函数
  2. flink任务性能优化
  3. vue全家桶router、vuex、axios
  4. Spring 事件(1)- 内置事件
  5. 第十篇 Form表单
  6. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
  7. iOS消息转发
  8. Frequently arduino function
  9. ROS常见问题(二) 运行文件时报错environment variable &#39; ###_MODEL&#39; is not set
  10. 浅谈ASCII 、ISO8859-1、GB2312、GBK、Unicode、UTF-8 的区别。