使用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软件包:
1 sudo apt-get update 2 3 sudo apt-get install apt-transport-https
下一步是将存储库定义添加到我们的系统中:
1 echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo 2 3 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中应用一些基本配置:
1 sudo su 2 3 vim /etc/elasticsearch/elasticsearch.yml
由于我们在AWS上安装Elasticsearch,因此我们将Elasticsearch绑定到localhost。 此外,我们需要将EC2实例的私有IP定义为符合主机资格的节点:
1 network.host: "localhost" 2 3 http.port:9200 4 5 cluster.initial_master_nodes: ["
保存文件并使用以下命令运行Elasticsearch:
1 sudo service elasticsearch start
要确认一切正常,请将curl指向:http:// localhost:9200,你应该看到类似以下输出的内容(在开始担心看不到任何响应之前,请给Elasticsearch一两分钟):
{
1 "name" : "ip-172-31-49-60", 2 3 "cluster_name" : "elasticsearch", 4 5 "cluster_uuid" : "yP0uMKA6QmCsXQon-rxawQ", 6 7 "version" : { 8 9 "number" : "7.0.0", 10 11 "build_flavor" : "default", 12 13 "build_type" : "deb", 14 15 "build_hash" : "b7e28a7", 16 17 "build_date" : "2019-04-05T22:55:32.697037Z", 18 19 "build_snapshot" : false, 20 21 "lucene_version" : "8.0.0", 22 23 "minimum_wire_compatibility_version" : "6.7.0", 24 25 "minimum_index_compatibility_version" : "6.0.0-beta1" 26 27 }, 28 29 "tagline" : "You Know, for Search" 30 31 }
步骤2:安装Logstash
接下来,ELK中的“ L” — Logstash。 Logstash将要求我们安装Java 8,这很好,因为这也是运行Kafka的要求:
1 sudo apt-get install default-jre
验证是否已安装Java:
1 java -version 2 3 openjdk version "1.8.0_191" 4 5 OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12) 6 7 OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
由于我们已经在系统中定义了存储库,因此运行安装Logstash所需要做的全部工作:
1 sudo apt-get install logstash
接下来,我们将配置一个Logstash管道,该管道将从Kafka主题中提取我们的日志,处理这些日志并将其发送到Elasticsearch进行索引。
让我们创建一个新的配置文件:
1 sudo vim /etc/logstash/conf.d/apache.conf 2 3 粘贴以下配置: 4 5 input { 6 7 kafka { 8 9 bootstrap_servers => "localhost:9092" 10 11 topics => "apache" 12 13 } 14 15 } 16 17 filter { 18 19 grok { 20 21 match => { "message" => "%{COMBINEDAPACHELOG}" } 22 23 } 24 25 date { 26 27 match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] 28 29 } 30 31 geoip { 32 33 source => "clientip" 34 35 } 36 37 } 38 39 output { 40 41 elasticsearch { 42 43 hosts => ["localhost:9200"] 44 45 } 46 47 }
如你所见,我们正在使用Logstash Kafka输入插件来定义Kafka主机和我们希望Logstash从中提取的主题。 我们正在对日志进行一些过滤,并将数据发送到我们的本地Elasticsearch实例。
保存文件
步骤3:安装Kibana
让我们继续进行到ELK Stack中的下一个组件-Kibana。 和以前一样,我们将使用一个简单的apt命令来安装Kibana:
1 sudo apt-get install kibana
然后,我们将在以下位置打开Kibana配置文件:/etc/kibana/kibana.yml,并确保定义了正确的配置:
1 server.port: 5601 2 3 elasticsearch.url: "http://localhost:9200"
这些特定的配置告诉Kibana要连接到哪个Elasticsearch以及要使用哪个端口。
现在,我们可以从以下内容开始Kibana:
1 sudo service kibana start
在浏览器中使用以下命令打开Kibana:http:// localhost:5601。 你将看到Kibana主页。
步骤4:安装Filebeat
如上所述,我们将使用Filebeat收集日志文件并将其转发到Kafka。
要安装Filebeat,我们将使用:
1 sudo apt-get install filebeat
让我们在以下位置打开Filebeat配置文件:
1 /etc/filebeat/filebeat.yml 2 3 sudo vim /etc/filebeat/filebeat.yml
输入以下配置:
1 filebeat.inputs: 2 3 - type: log 4 5 enabled: true 6 7 paths: 8 9 - /var/log/apache2/access.log 10 11 output.kafka: 12 13 codec.format: 14 15 string: '%{[@timestamp]} %{[message]}' 16 17 hosts: ["localhost:9092"] 18 19 topic: apache 20 21 partition.round_robin: 22 23 reachable_only: false 24 25 required_acks: 1 26 27 compression: gzip 28 29 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:
1 wget http://apache.mivzakim.net/kafka/2.2.0/kafka_2.12-2.2.0.tgz 2 3 tar -xvzf kafka_2.12-2.2.0.tgz 4 5 sudo cp -r kafka_2.12-2.2.0 /opt/kafka
现在我们准备运行Kafka,我们将使用以下脚本进行操作:
1 sudo /opt/kafka/bin/kafka-server-start.sh 2 3 /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日志创建一个主题:
1 bin/kafka-topics.sh --create --zookeeper localhost:2181 2 3 --replication-factor 1 --partitions 1 --topic apache 4 5 Created topic apache.
我们都准备开始管道。
步骤5:启动数据管道
现在我们已经准备就绪,现在该启动所有负责运行数据管道的组件了。
首先,我们将启动Filebeat:
1 sudo service filebeat start 2 3 然后,Logstash: 4 5 sudo service logstash start
管道开始流式传输日志需要花费几分钟。 要查看Kafka的实际效果,请在单独的标签中输入以下命令:
1 /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 2 3 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干货